【发布时间】: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