透视投影导致立方体变为异形TV状长方体问题求助
立方体拉伸问题原因及修复
核心原因
- 宽高比传参错误
你实现的Projection函数第一个参数要求是窗口宽度/窗口高度的比值,如果你传入的ar实际是高度/宽度,会直接导致水平垂直缩放比例不匹配,立方体被拉伸变形。 - 矩阵存储顺序不匹配
主流图形API的着色器默认接收列主序矩阵,如果你的C++端m4结构体是行主序存储,调用SetShaderUniformMat4时没有开启转置配置,矩阵传入着色器后行列颠倒,透视缩放系数失效,就会出现拉伸。
修复步骤
- 校验
ar参数的计算逻辑,确保传入的是(float)窗口宽度 / 窗口高度,不要写反宽高顺序 - 如果你的矩阵是行主序存储,调用
SetShaderUniformMat4时将转置参数设为true,或是在C++端计算完最终变换矩阵后手动转置再传入着色器
矩阵移到着色器后物体消失问题原因及修复
核心原因
- 乘法顺序错误
顶点变换的正确左乘顺序为:投影矩阵 * 平移矩阵 * 旋转矩阵 * 顶点列向量。你C++端的Project * Move * Rotate顺序是正确的,如果移到着色器时顺序写反,变换后的顶点会完全落在视锥体范围外,导致看不到物体。 - 单矩阵传参错误
分开传递投影、平移、旋转矩阵时,每个矩阵都要满足列主序的传参要求,任意一个矩阵传参错误都会导致整体变换失效。
修复步骤
- 着色器中严格按照
Projection * Move * Rotate * 顶点位置的顺序计算变换结果 - 单独传递每个矩阵时,和之前传组合矩阵的逻辑保持一致,确保所有矩阵传入着色器时符合列主序要求
内容的提问来源于stack exchange,提问作者vk123
相关产品推荐
相关产品推荐

