为什么 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
轴,原始代码看起来仍然有效。那是因为零中心正交投影基本上只是一个缩放矩阵。
我的 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
轴,原始代码看起来仍然有效。那是因为零中心正交投影基本上只是一个缩放矩阵。