2016-11-18 78 views
0

这里是我的整个片段着色器的代码,这是相当简单:OpenGL ES 2.0的着色器浮点数据精度

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类型的范围内。

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

+0

首先,不要将代码作为图像发布。只需将其正确插入到您的问题中。其次,我们不知道“颜色”组件的价值。其次,我们不知道你的浮动是以什么精度宣布的。如果你选择'precision mediump float',那么你可表示的整数范围是最小的[[-2^15,2^15 -1]],这当然小于你的左手操作数。 – thokra

+0

对不起,我修改了这个问题。我使用highp精度。但结果仍然和以前一样。我在带有ARM Mali GPU的PC和Android手机上试过,结果是一样的。 –

回答

1

即使该值在该类型的范围内,也并不意味着它的精度足够精确,在这样大的值处看到两者之间的差异。

在你的情况为标准的32位float结果是:

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

而且比较时的价值是相同的。这与openGL和着色器没有关系或绑定,它是如何定义的。 64位float将检测到一个区别。

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