我在OpenGL 站点:
OpenGL 着色语言属性变量允许为 mat2、mat3 或 mat4 类型。这些类型的属性可以使用 glVertexAttrib 入口点加载。矩阵必须按列主顺序加载到连续的通用属性槽中,每个通用属性槽中包含矩阵的一列。
我一直在使用基于行优先的向量库。也就是说,4x4 矩阵的 16 个元素在结构体中的布局如下:
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;
}
该库是行优先的,以便在编写客户端代码时支持从左到右的计算,这对于许多程序员来说是很自然的。但我不明白的是,这些行优先矩阵按原样发送到着色器,根据上面的内容,需要列优先矩阵。
据我所知,着色器从右到左执行计算。但是,在将行主矩阵输入着色器之前,不应该将其转置为列主矩阵吗?我还没有这样做过,但效果很好。
从您的问题来看,就 OpenGL 而言,矩阵的内存布局是否采用行主要形式并不明显。如果矩阵的最后一个成员 (w) 包含矩阵所表示的变换的平移分量,那么它与列优先布局没有区别。
如果在进行矩阵向量乘法时与操作数的顺序一致,则可以在 GLSL 中使用行优先矩阵。
如果您的着色器代码具有如下所示的乘法:
vec4 v_t = vector * matrix_row_major
这与:
vec4 v_t = matrix_column_major * vector
where matrix_row_major
是转置matrix_column_major
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)