you should have a general understanding of vector and matrix operations, also how to generate a cross product, and what a dot product operation can do. That said, you can do quite a lot of neat stuff without knowing any of this. The important thing is to understand the theory of what you are trying to do. if you want to make a per pixel lighting shader, you should read the theory behind lighting models..however its all generally well understood now, so you can just find an example. I have managed to create a whole suite of shaders by using various samples and modifying and rewriting them. Other than that, you should have an idea of how programming works. If you plan on using HLSL instead of assembly, some general C++ knowledge is good, because they are related. Then of course you will need some Direct3D references.