【问题标题】:How to use row-major in OpenGL shader?如何在 OpenGL 着色器中使用行专业?
【发布时间】:2013-05-29 09:57:21
【问题描述】:

我在OpenGL site:看到这个

OpenGL Shading Language 属性变量可以是 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;
}

在编写客户端代码时,该库以行为主,以支持从左到右的计算,这对许多程序员来说是很自然的。但我不明白的是,这些行优先矩阵是按原样发送到着色器的,根据上面的说法,它期望列优先。

我了解着色器从右到左执行计算。但是不应该将行优先矩阵转置,以便在输入着色器之前它是列优先的吗?我没有这样做,但它工作得很好。

【问题讨论】:

    标签: math opengl graphics 3d


    【解决方案1】:

    从您的问题来看,就 OpenGL 而言,您的矩阵的内存布局是否以行为主形式并不明显。如果矩阵的最后一个成员 (w) 包含矩阵所表示的变换的平移分量,则它与列优先布局无法区分。

    如果在进行矩阵向量乘法时与操作数的顺序一致,则可以在 GLSL 中使用行主矩阵。

    如果您的着色器代码具有如下所示的乘法:

    vec4 v_t = vector * matrix_row_major
    

    这与:

    vec4 v_t = matrix_column_major * vector
    

    其中matrix_row_majormatrix_column_major 的转置

    【讨论】:

      猜你喜欢
      • 2019-09-19
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多