本文主要是介绍HLSL/CG里的Mul参数顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
/ /Computes world space light directioninline 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)才能实现预期的矩阵变换。
这篇关于HLSL/CG里的Mul参数顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!