为何该GLSL片段着色器绘制平面时崩溃但运行在球体上正常?
问题复现代码
precision highp float; uniform sampler2D uTexture; varying vec2 vCoordinate; uniform float uAlpha; varying vec4 vColor; void main(){ vec4 color=texture2D(uTexture,vCoordinate); color.a *= uAlpha; color.r = 1.0; color.g = 1.0; color.b = 1.0; color.a = 1.0; gl_FragColor=color; // gl_FragColor = vec4(1.0,0.0,0.0,1.0); }
可能成因及排查步骤
- 纹理采样未定义行为触发崩溃
GLSL 不会因为后续代码覆盖了采样结果就跳过texture2D的执行逻辑。球体绘制时通常会保证vCoordinate的取值严格落在[0.0, 1.0]区间,而平面场景如果没有做纹理坐标裁剪,vCoordinate超出合法范围的同时,uTexture没有设置匹配的边缘采样模式(重复/拉伸/裁剪),就会触发GPU采样异常。可先注释掉采样相关的两行代码,直接赋值vec4 color = vec4(1.0);验证是否和采样逻辑相关。 - Uniform变量未正常传值
检查平面绘制流程中是否给uTexture、uAlpha两个uniform变量做了合法赋值:如果uTexture绑定的是无效纹理单元,或者uAlpha没有传入有效值,就会触发运行时异常。球体绘制流程能正常运行,大概率是这两个参数在球体场景下有正常传值,平面场景漏了传值逻辑。 - 高精度浮点兼容性问题
开头声明的precision highp float在部分旧款移动GPU、桌面集成显卡上的2D绘制管线存在兼容性缺陷,而3D球体绘制管线默认做了精度适配。可将highp替换为mediump验证是否是精度声明导致的兼容问题。 - 纹理坐标插值异常
检查平面的顶点着色器逻辑,以及平面顶点的坐标、纹理坐标赋值是否正确:如果平面顶点存在共面重合、顶点顺序错误、纹理坐标赋值为NaN的情况,会导致插值后的vCoordinate为非法值,采样非法纹理坐标直接触发GPU崩溃。球体的顶点数据是规整生成的,插值结果始终合法,所以不会触发该问题。
内容的提问来源于stack exchange,提问作者chengfeng
相关产品推荐
相关产品推荐

