OpenGL ES 2.0 Shader Float Data Precision

时间:2016-11-18 08:15:10

标签: opengl-es shader fragment-shader

这是我的整个片段着色器代码,它非常简单:

precision highp float;

void main( void )
{  
   float a = 66061311.0;
   if(a == 66061312.0)
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
   else
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

为什么屏幕显示为红色。 当我将a设置为66061315.0时,屏幕显示为绿色。 这让我很困惑。根据我的理解,66061311.0在float类型的范围内。

我该如何解决或解决这个问题?

1 个答案:

答案 0 :(得分:1)

即使该值在该类型的范围内,也不意味着它的精度在如此大的值下足够精确,以便看到两者之间的差异。

对于标准的32位float,结果为:

66061311.0 = 6.60613e+07
66061312.0 = 6.60613e+07

比较时的值是相同的。这与openGL和着色器无关或绑定,它是如何定义float的。 64位float会检测到差异。

如果检查definition of a floating value,要添加更多信息,您将看到该分数仅有23位,这意味着预分配高达8.4M,但您已超过66M。