WebGL透视投影矩阵失效求助:添加后仅显示清除色
问题原因与解决方法
核心问题:zNear设置为0.0
透视投影的近平面(zNear)不能为0。glmatrix的mat4.perspective函数计算透视矩阵时,会涉及与zNear相关的除法操作,当zNear=0时会触发除以0的错误,导致生成的投影矩阵异常——所有顶点经过投影变换后,齐次坐标的w分量变为0,后续透视除法(gl_Position/w)失效,顶点被WebGL裁剪阶段全部剔除,最终只显示清除色。
修复步骤
修正zNear和zFar的值
将zNear改为大于0的小数值(比如0.1),同时适当调大zFar,避免地形刚好处于远平面上(远平面上的顶点也会被裁剪):const zNear = 0.1; // 替换原来的0.0 const zFar = 10.0; // 远平面设为足够包含地形的范围 const projectionMatrix = mat4.create(); mat4.perspective(projectionMatrix, fieldOfView, aspect, zNear, zFar);确保相机位置能覆盖地形
检查模型视图矩阵(uModelViewMatrix),确保相机位置和朝向正确。比如将相机放置在Z轴正方向,看向地形所在区域:const modelViewMatrix = mat4.create(); // 相机位置:[0, 2, 5],看向原点,上方为Y轴正方向 mat4.lookAt(modelViewMatrix, [0, 2, 5], [0, 0, 0], [0, 1, 0]);验证顶点坐标范围
确认地形顶点坐标经过模型视图变换后,z值落在zNear到zFar之间,确保顶点处于视锥体内。
补充说明
透视投影的视锥体是金字塔形状,近平面和远平面必须为正数,且满足zNear < zFar。只要相机到地形的距离在这个区间内,地形就能正常显示。
内容的提问来源于stack exchange,提问作者Andrew Lubrino
相关产品推荐
相关产品推荐

