首页 > 解决方案 > OpenGL 无缘无故地剪辑一个对象

问题描述

我正在尝试可视化一个由沿 x 和 y 轴的 -1 到 1 个顶点组成的简单四边形。为什么opengl剪辑对象?代码对我来说似乎是正确的

glm::mat4 m = glm::translate(glm::mat4{1.0f}, toGlmVec3(objectPosition));
glm::mat4 v = glm::lookAtLH(toGlmVec3(cameraPosition), toGlmVec3(objectPosition), glm::vec3(0, 1, 0));
glm::mat4 p = glm::perspective(glm::radians(50.f), float(640.f) / 480.f, 0.0001f, 100.f);
glm::mat4 mvp = /* p* */ v * m; // when I take p back, the object disappears completely

testShader.use();
testShader.setVector4("u_color", math::Vector4f(0.f, 1.f, 0.f, 1.f));
testShader.setMatrix4("u_mMVP", mvp);

在着色器的代码中只有一行

gl_Position = u_mMVP * vec4(a_Pos, 1.0);

在此处输入图像描述
沿 z 轴稍微移动相机后
在此处输入图像描述

如果我注释掉v *,那么它工作正常并且对象在屏幕上沿 x 和 y 轴移动

没有视图矩阵,只有模型: 沿 x 和 y 移动对象
在此处输入图像描述

在此处输入图像描述

所以看起来渲染代码工作正常但是视图和投影矩阵有什么问题?

标签: c++openglglm-mathperspectivecamera

解决方案


对象被正交投影的近平面和远平面剪裁。如果您没有明确设置投影矩阵,则投影矩阵是Identity matrix。近平面远窗格为 +/- 1。

用于glm::ortho定义不同的投影矩阵。例如:

glm::mat4 p = glm::ortho(-1, 1, -1, 1, -10, 10);

正交投影矩阵定义了围绕观察者位置的长方体观察体。此体积之外的所有几何图形都将被剪裁。


推荐阅读