inline float3 WorldSpaceLightDir( in float4 v )
{
float3 worldPos = mul(_Object2World, v).xyz;
......
按照数学逻辑应该是v乘以_Object2World进行矩阵变换,但是mul里却是反过来的,为什么呢?
因为不管是D3D还是OpenGL,使用的矩阵都是线性代数标准的矩阵,只是在存储方式上有所不同。分别为:行主序(Direct3D),列主序(OpenGL)
线性代数意义的同一个矩阵,在d3d 和 openGL 中的存储顺序
线代: a11,a12,a13,a14 d3d : a11,a12,a13,a14 OpenGL: a11,a21,a31,a41
a21,a22,a23,a24 a21,a22,a23,a24 a12,a22,a32,a42
a31,a32,a33,a34 a31,a32,a33,a34 a13,a23,a33,a43
a41,a42,a43,a44 a41,a42,a43,a44 a14,a24,a34,a44
HLSL/CG的矩阵采用列主序的存储,_Object2World也可以看作是线性代数意义上的模型转世界空间矩阵的转置,所以mul(_Object2World, v)才能实现预期的矩阵变换。