Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何在OpenGL着色器中使用row major?_Math_Opengl_Graphics_3d - Fatal编程技术网

Math 如何在OpenGL着色器中使用row major?

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个位置,并

我在电视上看到这个

OpenGL着色语言属性变量允许为mat2、mat3或mat4类型。可以使用glVertexAttrib入口点加载这些类型的属性。矩阵必须按列主顺序加载到连续的通用属性槽中,每个通用属性槽中有一列矩阵

我已经连续使用了一个基于row-major的向量库。也就是说,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;
}
静态矩阵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