为什么GLM透视投影表现与正交投影一致,该如何解决?
问题修复方案
核心问题原因
顶点着色器内的矩阵乘法顺序错误。OpenGL使用列主序矩阵、列向量进行坐标变换,变换的计算顺序为从右向左,正确的裁剪空间坐标计算顺序应为:投影矩阵 * 视图矩阵(如果有) * 模型矩阵 * 局部顶点坐标。
你当前的写法gl_Position = m * p * vec4(pos,1.0);相当于先对局部顶点做投影变换,再应用模型的平移变换,此时模型Z轴平移不会触发透视缩放逻辑,因此表现和正交投影一致。
修复步骤
- 修改顶点着色器内的矩阵乘法顺序,调整为:
gl_Position = p * m * vec4(pos, 1.0);
- (可选排查项)如果你使用的是glm 0.9.9及以上版本,默认要求透视函数的FOV参数传入弧度值,原投影矩阵定义如果直接传入45.0f角度值会导致FOV过大、透视效果不明显,可以修改为:
glm::mat4 projection = glm::perspective(glm::radians(45.0f), 16.0f / 9.0f, 1.0f, 100.0f);
补充说明
后续如果添加相机视图矩阵v,变换顺序依然遵循从右到左的局部空间到裁剪空间变换逻辑,写法应为:
gl_Position = p * v * m * vec4(pos, 1.0);
内容的提问来源于stack exchange,提问作者Extorc Productions
相关产品推荐
相关产品推荐

