WebGL自定义矩形透视投影矩阵无法渲染立方体问题咨询
参考空间问题解答
未做任何变换的立方体顶点属于模型局部空间,你定义的透视投影矩阵的作用目标是观察空间,二者本身不属于同一参考空间。如果你没有额外设置视图变换矩阵(默认视图矩阵为单位矩阵),那么经过模型矩阵变换后的世界空间坐标会直接等于观察空间坐标,属于投影矩阵的作用参考空间。
因为你定义的左右裁剪面l/r、上下裁剪面t/b是对称取值,立方体的x/y范围落在-1010之间,远小于裁剪面的±50范围,且你已经沿z轴平移到-6的位置,在0.1100的裁剪范围内,理论上立方体应该显示在视图正中心。
自定义矩阵无法渲染的原因
1. 矩阵元素表达式缺少括号,运算结果完全错误
你写的矩阵元素没有考虑运算优先级,除法运算的分母没有加括号,导致实际计算结果和预期的偏斜透视矩阵完全不符:
- 你写的
(2*n/r-l)实际执行逻辑是(2*n / r) - l,但正确值应为2*n / (r - l) - 同理其余带除法的元素都存在相同错误:
2*n/t-b应为2*n/(t-b)、r+l/r-l应为(r+l)/(r-l)、t+b/t-b应为(t+b)/(t-b)、-(f+n/f-n)应为-(f+n)/(f-n)、-(2*f*n/f-n)应为-(2*f*n)/(f-n)
修正后的矩阵代码如下:
const n = 0.1; const f = 100.0; const l = -50; const r = 50; const t = 50; const b = -50; const customProjMatrix = new Float32Array([ (2 * n) / (r - l), 0, 0, 0, 0, (2 * n) / (t - b), 0, 0, (r + l) / (r - l), (t + b) / (t - b), -(f + n) / (f - n), -1, 0, 0, -(2 * f * n) / (f - n), 0 ]);
2. 顶点属性配置问题
你贴出的positions数组仅包含x、y两个分量,没有z轴坐标。如果是绘制立方体,需要补充每个顶点的z分量;如果是绘制平面,需要确认顶点属性指针的步长、分量数量配置正确,避免顶点属性读取错误。
3. 矩阵传入顺序确认
WebGL要求矩阵按列主序存储,你定义的矩阵元素顺序是符合列主序要求的,只要传入着色器时没有做额外的转置操作即可。
内容的提问来源于stack exchange,提问作者SuperJumbo
相关产品推荐
相关产品推荐

