7

我目前正在寻找在 iOS 设备上运行的 OpenGL ES 2.0 片段着色器代码中的一些错误。代码在模拟器中运行良好,但在 iPad 上它有很大的问题,并且一些计算产生了截然不同的结果,例如我0.0在 iPad 和4013.17模拟器上,所以我不是在谈论可能是小的差异一些舍入错误的结果。

我注意到的一件事是,在 iPad 上,

float1 = pow(float2, 2.0);

可以产生与以下结果截然不同的结果

float1 = float2 * float2;

具体来说,当pow(x, 2.0)在包含较大负数的变量上使用时-8,它似乎返回了一个满足条件的值if (powResult <= 0.0)

此外,这两种操作的结果(pow(x, 2.0)以及x*x)在模拟器中产生的结果与在 iPad 上的结果不同。

用过的花车是mediump,但我得到了同样的东西highp

这些差异有简单的解释吗?

我正在缩小问题的范围,但这需要很多时间,所以也许有人可以在这里帮助我做一个简单的解释。

4

3 回答 3

17

GLSL ES 文档说如果 x < 0 或 x = 0 且 y ≤ 0,则 pow 未定义。

于 2012-08-31T23:17:49.890 回答
1

在 GLSLpow中是作为 和 的函数实现exp2log2。由于没有为负实数定义对数函数pow(),因此也不是。

请参阅第 47 页的GLSL ES 3.0 规范或第 88 页的GLSL 4.4 规范。

pow (x, y) 继承自exp2 (x * log2 (y))

同样来自规范:

genType pow (genType x, genType y)

  • 返回 x 的 y 次幂,即 x^y
  • 如果 x < 0,则结​​果未定义。
  • 如果 x = 0 且 y <= 0,则结​​果未定义。
于 2014-02-18T16:08:09.507 回答
1

该模拟器使用 x86 浮点单元和 Mac OS X 数值库。iPad 使用 ARM FPU。

pow() 也是一个使用近似算法的库例程。

于 2012-08-31T21:39:12.967 回答