OpenGL无明显原因裁剪Quad物体,视图与投影矩阵配置问题排查
问题原因与解决方案
1. 缺失投影矩阵时的裁剪问题
你当前注释了投影矩阵p的乘法,直接将视图空间坐标传递给gl_Position,OpenGL会默认将输入值当做裁剪空间坐标,执行透视除法(此处顶点w分量为1)后,只有坐标值落在[-1,1]范围内的顶点才会被保留:
- 视图空间下z轴坐标超出
[-1,1]范围的顶点会被直接裁剪 - 你沿z轴移动相机时,Quad的视图空间z值发生变化,部分超出范围就会出现半裁剪的现象
- 你去掉视图矩阵后,Quad的坐标就是模型空间的
[-1,1],刚好落在裁剪空间范围内,所以渲染正常
2. 加入投影矩阵后物体完全消失的原因
这是坐标系不匹配导致的:
- 你调用的
glm::lookAtLH生成的是左手系的视图矩阵 - 而
glm::perspective默认生成的是右手系的投影矩阵,二者坐标系方向相反,物体被直接投影到裁剪空间可视范围外,所以完全看不到 - 同时要注意GLM列主序矩阵的乘法顺序必须是
投影矩阵 * 视图矩阵 * 模型矩阵,顺序错误也会导致坐标计算异常
3. 修复方案
按如下步骤修改代码即可:
- 投影矩阵替换为左手系版本
glm::perspectiveLH - 恢复正确的MVP矩阵乘法顺序
- 可适当调大近平面值(
0.0001f过小会导致深度冲突,建议改为0.1f)
修改后的代码片段:
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::perspectiveLH(glm::radians(50.f), float(640.f) / 480.f, 0.1f, 100.f); // 恢复正确的P*V*M乘法顺序 glm::mat4 mvp = p * v * m; testShader.use(); testShader.setVector4("u_color", math::Vector4f(0.f, 1.f, 0.f, 1.f)); testShader.setMatrix4("u_mMVP", mvp);
内容的提问来源于stack exchange,提问作者IC_
相关产品推荐
相关产品推荐

