【问题标题】:GLSL: ModelView*Projection or Projection*ModelViewGLSL:模型视图*投影或投影*模型视图
【发布时间】:2011-11-11 10:21:46
【问题描述】:

我正在查看来自 Apple 的一些展示 GLES2 功能的 iOS 示例代码,我看到他们这样做:

mat4f_MultiplyMat4f(proj, modelview, modelviewProj);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEW_PROJECTION_MATRIX], 1, GL_FALSE, modelviewProj);

根据他们的 mat4f_MultiplyMat4f 函数的定义,看起来他们正在将模型视图矩阵与投影矩阵进行预乘并将结果存储到模型视图项目中。虽然我还是个新手,但我觉得这不对;不应该是 mvp = mv*p,而不是他们正在做的 mvp = p*mv 吗?

这是他们粘贴的 mat4f_MultiplyMat4f 函数以进行验证:

void mat4f_MultiplyMat4f(const float* a, const float* b, float* mout)
{
    mout[0]  = a[0] * b[0]  + a[4] * b[1]  + a[8] * b[2]   + a[12] * b[3];
    mout[1]  = a[1] * b[0]  + a[5] * b[1]  + a[9] * b[2]   + a[13] * b[3];
    mout[2]  = a[2] * b[0]  + a[6] * b[1]  + a[10] * b[2]  + a[14] * b[3];
    mout[3]  = a[3] * b[0]  + a[7] * b[1]  + a[11] * b[2]  + a[15] * b[3];

    mout[4]  = a[0] * b[4]  + a[4] * b[5]  + a[8] * b[6]   + a[12] * b[7];
    mout[5]  = a[1] * b[4]  + a[5] * b[5]  + a[9] * b[6]   + a[13] * b[7];
    mout[6]  = a[2] * b[4]  + a[6] * b[5]  + a[10] * b[6]  + a[14] * b[7];
    mout[7]  = a[3] * b[4]  + a[7] * b[5]  + a[11] * b[6]  + a[15] * b[7];

    mout[8]  = a[0] * b[8]  + a[4] * b[9]  + a[8] * b[10]  + a[12] * b[11];
    mout[9]  = a[1] * b[8]  + a[5] * b[9]  + a[9] * b[10]  + a[13] * b[11];
    mout[10] = a[2] * b[8]  + a[6] * b[9]  + a[10] * b[10] + a[14] * b[11];
    mout[11] = a[3] * b[8]  + a[7] * b[9]  + a[11] * b[10] + a[15] * b[11];

    mout[12] = a[0] * b[12] + a[4] * b[13] + a[8] * b[14]  + a[12] * b[15];
    mout[13] = a[1] * b[12] + a[5] * b[13] + a[9] * b[14]  + a[13] * b[15];
    mout[14] = a[2] * b[12] + a[6] * b[13] + a[10] * b[14] + a[14] * b[15];
    mout[15] = a[3] * b[12] + a[7] * b[13] + a[11] * b[14] + a[15] * b[15];
}

我猜这是一个错误,但我不知道。做 Proj*Modelview*Vert 不是先应用投影矩阵,然后再应用模型视图吗?根据投影的纵横比,这不会产生奇怪的结果,例如翻译在某些方向上移动的东西比它们应该移动的多吗?这不是您想要的 Modelview*Proj*Vert 吗,这难道不是为什么它被称为 MVP 矩阵而不是 PMV 矩阵的原因吗?难道只是苹果示例代码绘制的这个简单的小旋转方块还不够复杂,不足以让错误浮出水面吗?

【问题讨论】:

    标签: opengl-es glsl linear-algebra


    【解决方案1】:

    矩阵乘法是右结合的,即表达式是从右到左计算的。所以正确的乘法确实是

    MVP = P * MV
    

    您可以通过记住要将列向量与矩阵相乘来轻松推断出这一点,从而得到另一个列向量。根据矩阵乘法的定义

    v'_j = \sum_i M_ij * v_i
    

    或短

    v' = M * v
    

    你可以将整个转换重写为

    v_eye = MV * v
    

    和

    v_clip = P * v_eye
    

    替换为 v_eye

    v_clip = P * (MV * v) = P * MV * v
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多