为什么 GLM 透视投影像正交投影一样

Why is GLM Perspective projection acting like Orthographic Projection

我的 C++ OpenGL 应用程序中有一个投影矩阵。

glm::mat4 projection = glm::perspective(45.0f, 16.0f / 9.0f, 1.0f, 100.0f);

此矩阵稍后作为统一发送到顶点着色器 ->

Nade::Shader::SetMat4(app.shader->GetProgram(), "p", app.projection);

并在顶点着色器中使用

gl_Position = m * p * vec4(pos,1.0);

然后渲染四边形在 Z 轴上移动

object.Translate(0, 0, -0.05);

观察到的行为:渲染网格的行为就像在正交矩阵中一样,它的大小保持不变,但在远点处剪掉了

预期行为:渲染的网格尺寸减小并剪掉。

我该如何解决这个问题?

gl_Position = m * p * vec4(pos,1.0);等同于gl_Position = m * (p * vec4(pos,1.0));,意思是位置先经过p变换,再经过m.

变换

假设p表示“投影”,m表示“模型视图”,那么应该是:

gl_Position = p * m * vec4(pos,1.0);

您可能想知道:为什么这没有更早地引起问题?

使用正交投影和相机俯视 z 轴,原始代码看起来仍然有效。那是因为零中心正交投影基本上只是一个缩放矩阵。