ThreeJS Shader在一加手机Chrome浏览器无法正常渲染问题排查
根因分析
- 该故障属于Adreno GPU驱动的兼容性缺陷:故障仅复现于一加设备,是由于一加搭载的高通Adreno系列GPU的部分版本图形驱动,存在GLSL浮点运算兼容问题。驱动在处理顶点着色器中带负值的未钳位噪声输出时,会将其判定为非法值,直接终止着色器执行流程,最终表现为网格截断、渲染异常。苹果A系列GPU、三星机型常用的Mali系列GPU驱动对这类运算的兼容性更好,因此不会触发异常。
- 开启turbulence后恢复正常属于巧合规避:开启turbulence时会对噪声输出取绝对值,把原本大致为[-1,1]的输出范围强制转换为[0,1]的非负区间,刚好避开了Adreno驱动对负值噪声的运算bug,并非fBM逻辑本身存在错误。
解决方案
- 顶点着色器头部显式指定浮点精度,优先使用
precision highp float;,如果仍存在故障,替换为precision mediump float;,部分Adreno驱动的highp精度实现对负值运算的支持存在已知缺陷。 - 在fBM函数返回前对输出结果做手动钳位,比如添加
return clamp(noiseOutput, -1.0, 1.0);逻辑,把输出严格限制在合理区间内,避免出现超出驱动预期的极值触发异常。 - 如果业务允许不对位移方向做强制要求,可在调用fBM后对输出做区间偏移,例如
noiseVal = fbm(uv) * 0.5 + 0.5,无需开启湍流即可将输出转换到非负区间,规避驱动bug。 - 如需完全保留原有逻辑,可在应用启动时检测GPU型号,仅对Adreno平台添加兼容处理,其他平台保留原代码逻辑即可。
内容的提问来源于stack exchange,提问作者Faraz
相关产品推荐
相关产品推荐

