这是我的整个片段着色器代码,它非常简单:
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 :(得分: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。