c++ - 翻译过程中 MVP 行为异常

标签 c++ opengl glsl glm-math vertex-shader

我正在学习 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();

结果:

enter image description here

它不应该沿着X轴向右移动吗?

最佳答案

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 中, vector 必须从右侧乘以矩阵。请参阅GLSL Programming/Vector and Matrix Operations

关于c++ - 翻译过程中 MVP 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60591738/

相关文章:

c++ - 将 Vector 作为参数传递给另一个类构造函数 C++

c++ - Mingw64-w64 属性(格式)和 <cinttypes> header

c++ - 通过表面写入 CUDA 中的浮点 OpenGL 纹理

c++ - 从平面计算网格顶点

javascript - 如何在 WebGL 中实现这种类似隧道的动画?

c++ - 从 Qt4 中的文本文件中逐字读取

c++ - 奇怪的继承模式

c++ - OpenGL/GLUT - 更新多个窗口

opengl-es - 如何将 int 转换为在 GLSL(WebGL)中 float ?

c - OpenGL glAttachShader 不工作