首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GLSL: ModelView*Projection或Projection*ModelView

GLSL: ModelView*Projection或Projection*ModelView
EN

Stack Overflow用户
提问于 2011-11-11 18:21:47
回答 1查看 2.4K关注 0票数 2

我正在看一些苹果公司的iOS示例代码,它们展示了GLES2的功能,我看到他们这样做:

代码语言:javascript
运行
复制
mat4f_MultiplyMat4f(proj, modelview, modelviewProj);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEW_PROJECTION_MATRIX], 1, GL_FALSE, modelviewProj);

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

下面是粘贴的mat4f_MultiplyMat4f函数以进行验证:

代码语言:javascript
运行
复制
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矩阵的原因吗?是不是苹果样本代码绘制的这个简单的旋转方块还不够复杂,错误就会暴露出来?

EN

Stack Overflow用户

回答已采纳

发布于 2011-11-11 20:29:04

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

代码语言:javascript
运行
复制
MVP = P * MV

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

代码语言:javascript
运行
复制
v'_j = \sum_i M_ij * v_i

或短

代码语言:javascript
运行
复制
v' = M * v

您可以将整个转换重写为

代码语言:javascript
运行
复制
v_eye = MV * v

代码语言:javascript
运行
复制
v_clip = P * v_eye

替换v_eye

代码语言:javascript
运行
复制
v_clip = P * (MV * v) = P * MV * v
票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8092584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档