我的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
轴向下看的相机,原始代码看起来仍然可以工作。这是因为零中心正交投影基本上只是一个缩放矩阵。