为什么GLM透视投影的作用类似于正交投影



我的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);

并在Vertex Shader 中使用

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));,这意味着位置在被m变换之前被p变换。

假设CCD_ 5表示";投影";CCD_ 6表示";"模型视图";,那么它应该是:

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

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

有了正交投影和从z轴向下看的相机,原始代码看起来仍然可以工作。这是因为零中心正交投影基本上只是一个缩放矩阵。

最新更新