翻译过程中奇怪的 MVP 行为

Posted

技术标签:

【中文标题】翻译过程中奇怪的 MVP 行为【英文标题】:Strange MVP behavior during translation 【发布时间】:2020-03-08 20:23:14 【问题描述】:

我正在学习 OpenGL 的基础知识并尝试使用正射投影转换三角形。我没有看到我的期望,我做错了什么?

我的顶点缓冲区:

Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);
Vertices[2] = Vector3f(-1.0f, 1.0f, 0.0f);

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

顶点着色器:

#version 330

layout (location = 0) in vec3 Position;

uniform mat4 gMVP;

void main()

    gl_Position = gMVP * vec4(Position, 1.0);

MVP 计算和渲染:

    glm::mat4 p = glm::ortho(-2.0f, 2.0f, -2.0f, 2.0f, -2.0f, 2.0f);
    glm::mat4 v = glm::lookAt(glm::vec3(0,0,1), glm::vec3(0,0,0), glm::vec3(0,1,0)); 
    glm::mat4 m = glm::translate(glm::mat4(1.0f), glm::vec3(0.5f, 0.0f, 0.0f));
    glm::mat4 MVP = p * v * m; 

    glUniformMatrix4fv(gMVPLocation, 1, GL_TRUE, &MVP[0][0]);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);

    glutSwapBuffers();

结果:

不应该只是沿X轴向右移动吗?

【问题讨论】:

@Rabbid76 已修复,没有帮助 glUniformMatrix4fv(gMVPLocation, 1, GL_TRUE, &MVP[0][0]); -> glUniformMatrix4fv(gMVPLocation, 1, GL_FALSE, &MVP[0][0]);。见GLSL Programming/Vector and Matrix Operations 【参考方案1】:

glUniformMatrix4fv的第三个参数导致矩阵在设置为uniform时会被转置。 OpenGL Mathematics (GLM) 构造矩阵的方式与 GLSL 构造 mat4 类型的变量相同。 矩阵设置为uniform时不必转置:

glUniformMatrix4fv(gMVPLocation, 1, GL_TRUE, &MVP[0][0]);

glUniformMatrix4fv(gMVPLocation, 1, GL_FALSE, &MVP[0][0]);

在 GLSL 中,向量必须从右侧乘以矩阵。见GLSL Programming/Vector and Matrix Operations

【讨论】:

以上是关于翻译过程中奇怪的 MVP 行为的主要内容,如果未能解决你的问题,请参考以下文章

zsh 中奇怪的“工作”行为

UIImageView 中奇怪的对齐行为

列表理解中奇怪的 lambda 行为

C中奇怪的malloc行为

Firefox 中奇怪的引导进度条行为

Typescript 中奇怪的类型推断行为