You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:15:03