Math 如何在OpenGL着色器中使用row major?
我在电视上看到这个 OpenGL着色语言属性变量允许为mat2、mat3或mat4类型。可以使用glVertexAttrib入口点加载这些类型的属性。矩阵必须按列主顺序加载到连续的通用属性槽中,每个通用属性槽中有一列矩阵 我已经连续使用了一个基于row-major的向量库。也就是说,4x4矩阵的16个元素在结构中的布局如下:Math 如何在OpenGL着色器中使用row major?,math,opengl,graphics,3d,Math,Opengl,Graphics,3d,我在电视上看到这个 OpenGL着色语言属性变量允许为mat2、mat3或mat4类型。可以使用glVertexAttrib入口点加载这些类型的属性。矩阵必须按列主顺序加载到连续的通用属性槽中,每个通用属性槽中有一列矩阵 我已经连续使用了一个基于row-major的向量库。也就是说,4x4矩阵的16个元素在结构中的布局如下: vec4 x; vec4 y; vec4 z; vec4 w; 其中每个vec4都有组件x、y、z、w,因此内容的线性顺序是行主顺序,因为第一行占据内存中的前4个位置,并
vec4 x;
vec4 y;
vec4 z;
vec4 w;
其中每个vec4
都有组件x、y、z、w
,因此内容的线性顺序是行主顺序,因为第一行占据内存中的前4个位置,并且矩阵数学也是这样处理的,例如此旋转变换:
static Matrix4<T> RotateZ(T degrees)
{
T radians = degrees * 3.14159f / 180.0f;
T s = std::sin(radians);
T c = std::cos(radians);
Matrix4 m;
m.x.x = c; m.x.y = s; m.x.z = 0; m.x.w = 0;
m.y.x = -s; m.y.y = c; m.y.z = 0; m.y.w = 0;
m.z.x = 0; m.z.y = 0; m.z.z = 1; m.z.w = 0;
m.w.x = 0; m.w.y = 0; m.w.z = 0; m.w.w = 1;
return m;
}
静态矩阵x4旋转(T度)
{
T弧度=度*3.14159f/180.0f;
ts=std::sin(弧度);
tc=std::cos(弧度);
基质4米;
m、 x.x=c;m.x.y=s;m.x.z=0;m.x.w=0;
m、 y.x=-s;m.y.y=c;m.y.z=0;m.y.w=0;
m、 z.x=0;m.z.y=0;m.z.z=1;m.z.w=0;
m、 w.x=0;m.w.y=0;m.w.z=0;m.w.w=1;
返回m;
}
该库主要用于在编写客户端代码时支持从左到右的计算,这对于许多程序员来说是很自然的。但我不明白的是,这些行主矩阵被发送到着色器,根据上面的说明,除了列主矩阵之外
我知道着色器从右向左执行计算。但是,行主矩阵不应该在输入着色器之前进行转置,使其成为列主矩阵吗?我没有这样做,但它工作得很好。从您的问题来看,就OpenGL而言,矩阵的内存布局是否是行主形式并不明显。如果矩阵的最后一个成员(w)包含矩阵所表示的变换的转换组件,则它与列主布局无法区分 如果执行矩阵向量乘法时与操作数顺序一致,则可以在GLSL中使用行主矩阵 如果着色器代码具有如下所示的乘法:
vec4 v_t = vector * matrix_row_major
这与:
vec4 v_t = matrix_column_major * vector
其中matrix\u row\u major
是matrix\u column\u major