OpenGL ES 2.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类型的范围内。
我该如何解决或解决这个问题?
答
即使该值在该类型的范围内,也并不意味着它的精度足够精确,在这样大的值处看到两者之间的差异。
在你的情况为标准的32位float
结果是:
66061311.0 = 6.60613e+07
66061312.0 = 6.60613e+07
而且比较时的价值是相同的。这与openGL和着色器没有关系或绑定,它是如何定义的。 64位float
将检测到一个区别。
要添加更多信息,如果您检查definition of a floating value,您将会看到该分数只有23位,这意味着该分辨率高达8.4M,但您已超过66M。
首先,不要将代码作为图像发布。只需将其正确插入到您的问题中。其次,我们不知道“颜色”组件的价值。其次,我们不知道你的浮动是以什么精度宣布的。如果你选择'precision mediump float',那么你可表示的整数范围是最小的[[-2^15,2^15 -1]],这当然小于你的左手操作数。 – thokra
对不起,我修改了这个问题。我使用highp精度。但结果仍然和以前一样。我在带有ARM Mali GPU的PC和Android手机上试过,结果是一样的。 –