MVP变换坐标

sumcai 2021.12.12

MVP概念

在opengl中,MVP称为模型观察投影矩阵,它是模型(Model)、观察(View)和投影(Projection)矩阵作用在物体上组合作用,用于对物体的坐标系进行变换。

1639300692250

如上图所示,物体的坐标系变化过程为:

  1. 局部坐标系
  2. 世界坐标系
  3. 观察坐标系
  4. 裁剪坐标系

MVP公式

\[MVP=Mprojection⋅Mview⋅Mmodel\]

在shader中用MVP * gl_Position 得到转换后的坐标。

示例代码

OpenGL纹理中,介绍了纹理的使用方法,最终的运行效果为:

1637478946876

修改vertext shader,添加MVP变量

1
2
3
4
5
6
7
8
9
10
11
12
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
uniform mat4 MVP;

out vec2 TexCoord;

void main()
{
    gl_Position = MVP * vec4(aPos, 1.0);
    TexCoord = aTexCoord;
}

在绘制之前将MVP矩阵传入着色器:

1
2
3
4
5
6
7
glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float) width / (float)height, 0.1f, 100.0f);
glm::mat4 view = glm::lookAt(glm::vec3(1,2,3), glm::vec3(0,0,0), glm::vec3(0,1,0));
glm::mat4 model = glm::mat4(1.0f);
glm::mat4 mvp = projection * view * model;

GLuint mvpId = glGetUniformLocation(programID, "MVP");
glUniformMatrix4fv(mvpId, 1, GL_FALSE, &mvp[0][0]);

现在的运行效果如下:

1639310527486