fragment 着色器代码:
varying vec2 v_texCoord; // no use
uniform sampler2D uInputTex; // no use
highp float xxx = 3025.0;
void main() {
int ixxx = int(xxx);
if (ixxx == 3024) {
gl_FragColor = vec4(1.0);
}
else {
gl_FragColor = vec4(0.0);
}
}
如果我使用 highp
来声明 ixxx
,我会得到正确的结果。
如果我只使用默认精度,只是 int ixxx = int(xxx);
我比较 ixxx
和 3024
是正确的,我比较 ixxx
和 3025
也是正确的。为什么?
最佳答案
这归结为浮点存储差异。 GLSL 规范(第 4.5 节)仅规定了有关 float 精度的要求,但鼓励使用 IEEE 格式。假设这是您的驱动程序存储数字的方式,在 IEEE 格式中,许多值无法准确表示,因为存储的位数是固定的(例如,请参阅 https://en.wikipedia.org/wiki/Single-precision_floating-point_format 以深入了解 IEEE 754 32 位漂浮)。
您的文字将改为可以表示的最接近的值。这可能略高于实际值。由于您(可能并且很可能)正在更改存储中的位数,因此可能一个位数的表示高于(例如使用 highp),而另一个低于文字值(例如使用 medimp) .当从 float 构造 int 时,会发生截断 - 因此如果字面量表示低于 3025.0(例如 3024.9999..),它将变为 3024。
对此有几种可能的解决方案,最简单的可能就是直接使用 int。您还可以“修改”字面数字,以确保它不会被截断(例如,将其设为 3025.1,在任何合理的表示中都会被截断为 3025)。
关于android - glsl float 转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34459779/