You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GLSL类型转换精度规则及OpenGL ES 3.0移动端Shader异常问询

OpenGL ES 3.0 GLSL精度与类型转换问题解答

问题1:GLSL类型转换规则与float(v)的精度

  • GLSL类型转换分显式、隐式两种,你使用的float(v)属于显式转换,规则为:仅允许兼容类型间的转换,整数转浮点数会将整数的数值直接映射为对应的浮点值,而非直接复制二进制位。
  • float(v)的精度由当前作用域的默认浮点精度决定:OpenGL ES的片段着色器没有默认浮点精度(顶点着色器默认highp),必须显式声明(比如precision mediump float;)。如果未声明,不同GPU编译器会自行处理——在你的Pixel 6设备上,直接写float(v)时编译器大概率默认采用了lowp精度,这种精度不足以正确表示30720,最终计算结果为0。

问题2:为何mediump float v2会导致结果为0?

你的v值是120*256=30720,理论上mediump float(通常对应FP16半精度浮点)能处理这个数值,但实际出现异常的核心原因是:

  • 编译器未正确处理精度转换:如果片段着色器没有显式声明precision mediump float;,编译器对mediump float的处理可能不符合规范,比如错误地将mediump uint的二进制位直接当作mediump float的位解析(而非数值转换)。30720的二进制是0111100000000000,按FP16格式解析会得到极小值(约1/256),除以65535后几乎为0,最终被lowp vec4截断为0。
  • 补充:虽然FP16能表示0~65504的整数,但30720的二进制位数(15位)超过了FP16尾数的有效位数(11位),转换时会被舍入,但舍入后的值除以65535仍能得到约0.46875的非0值,因此核心问题还是编译器的异常处理。

解决建议:在片段着色器开头显式声明浮点精度,比如precision highp float;,确保转换时使用明确的高精度类型。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:09:51