浮点数统一舍入是否存在GLSL问题

时间:2019-07-23 04:44:54

标签: shader glsles

我通过Java代码将Unix时间传递给我的着色器: gl.uniform1f(shader, System.currentTimeMillis());

着色器看起来像(简单的形式,只是为了研究问题):

#ifdef GLES
precision highp float;
#endif

uniform float u_time;

void main() {
  int d = 1000;
  float result = floor(u_time / d) * d;
  if (result > u_time) {
    s = 1.0;
  } else {
    s = 0.5;
  }
  gl_FragColor = vec4(s, 0, 0, 1.0);
}

我希望result永远不会大于u_time。令人惊讶的是,它是IS(着色器产生鲜红色)。

此外,例如,如果将d的值替换为100,它会按预期工作-呈现深红色。

试图将d的值替换为float,但没有任何效果。

即使我用直接浮点常量(例如1563854457241.0)替换表达式中的u_time,它也可以工作-Java将其放在着色器上几乎是相同的。

可能是什么问题?我怀疑它与精度有关,但不要理解如何解决它。

P.S。毕竟,如果将条件表达式替换为

,我将得到TRUE(亮红色)

1000000123.0 * 1000 == 1000000123456.0

努夫说。

1 个答案:

答案 0 :(得分:1)

在着色器代码中,您已经超出了32位浮点数的精度限制。
请参见IEEE 754GLSL ES -Precision and Precision Qualifiers
当您使用精度限定符highp时,有效位数为23(符号为+1),因此1000000123456.0之类的数字不能以全精度表示,因为近似数的十进制数字为7.22。