为什么GLSL的算术函数会在iPad上产生与模拟器不同的结果?

che*_*ica 6 floating-point opengl-es glsl ios opengl-es-2.0

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

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

float1 = pow(float2, 2.0);
Run Code Online (Sandbox Code Playgroud)

可以产生与结果非常不同的结果

float1 = float2 * float2;
Run Code Online (Sandbox Code Playgroud)

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

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

使用的花车是mediump,但我得到相同的东西highp.

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

我正在缩小问题范围,但需要花费很多时间,所以也许有人可以通过一个简单的解释来帮助我.

Eri*_*hil 16

所述GLSL ES文档说POW未定义如果x <0或如果x = 0且y≤0.

  • 谢谢!这将结束长时间的调试会话.但严重的是:wtf? (2认同)