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

为什么GLM透视投影表现与正交投影一致,该如何解决?

问题修复方案

核心问题原因

顶点着色器内的矩阵乘法顺序错误。OpenGL使用列主序矩阵、列向量进行坐标变换,变换的计算顺序为从右向左,正确的裁剪空间坐标计算顺序应为:投影矩阵 * 视图矩阵(如果有) * 模型矩阵 * 局部顶点坐标。
你当前的写法gl_Position = m * p * vec4(pos,1.0);相当于先对局部顶点做投影变换,再应用模型的平移变换,此时模型Z轴平移不会触发透视缩放逻辑,因此表现和正交投影一致。

修复步骤

  1. 修改顶点着色器内的矩阵乘法顺序,调整为:
gl_Position = p * m * vec4(pos, 1.0);
  1. (可选排查项)如果你使用的是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:06:05