When working with 3d graphics, sample shaders USUALLY use the following operation for vector position transformation:
result = mul(matrix, vector);
This obviously means the same as:
result = mul(vector, matrix_transposed);
Also, just to mention, most linear algebra libraries prefer to only leave the vector * matrix multiplication operation for simplicity.
Now: let's say I want to transform some vector (position, for example), using some concrete matrix (to be concrete, let's use D3DX matrix operations). So, I construct simple world-view-projection matrix and then pass it to my shader.
D3DXMatrixRotationX(&world, 0.05f);
D3DXMatrixLookAtLH(&view, &D3DXVECTOR3(400.0f, 80.0f, 0.0f),
&D3DXVECTOR3(0.1f, 0.1f, 0.0f),
&D3DXVECTOR3(0.0f, 1.0f, 0.0f));
D3DXMatrixPerspectiveFovLH(&projection, 0.5f, 800.0f / 600.0f, 1.0f, 1500.0f);
D3DXMATRIX wvp = world * view * projection;
Set Shader Parameter (wvp); // Pseudocode here
Question:
And here comes the part I can't understand - if done this way, the shader code should be
result = mul(vector, wvp)
for this transformation to work(vector is multiplied from the left side of the matrix).
Why does this happen? How do most sample shaders have the result = mul(wvp, vector) transformation inside them (and they don't transpose the matrix before setting it as a parameter)?
Where am I wrong?
Thank you.
A bit more information - D3DX matrix has row-major alignment and I am using the corresponding function, which takes a row-major matrix as a parameter (cgSetMatrixParameterfr in my particular case).
Of course, I could "transpose" that matrix by calling the function cgSetMatrixParameterfc, which treats input data as column-major matrix (and "automatically" transposes it), but that would be ridiculous.
v*A=A^T*vdoes not hold for matrix multiplication. However,(v*A)^T=A^T*v^Tdoes. - You