【问题标题】:OpenGL ES 2.0 Shader Float Data PrecisionOpenGL ES 2.0 着色器浮点数据精度
【发布时间】:2016-11-18 18:29:54
【问题描述】:

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

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

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

【问题讨论】:

  • 首先,不要将代码发布为图片。只需将其正确插入您的问题。其次,我们不知道color 的组件持有什么值。其次,我们不知道您的浮点数声明的精度。如果您选择了precision mediump float;,那么您的可表示整数范围最小为[-2^15, 2^15 -1],这当然小于您的左操作数。
  • 对不起,我已经修改了问题。我使用高精度。但结果还是和以前一样。我在 ARM Mali GPU 的 PC 和 Android 手机上试过,结果是一样的。

标签: opengl-es shader fragment-shader


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多