如何在OpenGL ES 2.0着色器中处理NaN或inf

时间:2012-08-04 16:23:29

标签: android iphone opengl-es opengl-es-2.0 gpgpu

这是基于以下问题:Best way to detect NaN's in OpenGL shaders

标准GLSL定义了isnan()和isinf()函数用于检测。 OpenGL ES 2.0着色语言没有。我怎么能处理NaN和Infs呢?

3 个答案:

答案 0 :(得分:5)

您可以通过只适用于NaN的条件检查NaN:

bool isNan(float val)
{
  return (val <= 0.0 || 0.0 <= val) ? false : true;
}

isinf有点困难。没有机制将float转换为其整数表示并使用位进行播放。所以你必须将它与适当大的数字进行比较。

答案 1 :(得分:2)

WebGL的问题相同。 Nicol Bolas的答案适用于大多数GPU,但不适用于某些nVidias。此版本适用于我有机会尝试的所有GPU:

bool isNan( float val )
{
  return ( val < 0.0 || 0.0 < val || val == 0.0 ) ? false : true;
  // important: some nVidias failed to cope with version below.
  // Probably wrong optimization.
  /*return ( val <= 0.0 || 0.0 <= val ) ? false : true;*/
}

答案 2 :(得分:0)

未经测试,因此不确定这是否有效(由于优化),但它应该适用于Inf和-Inf。

  bool isinf(float val) {
    return (val != 0.0 && val * 2.0 == val) ? true : false;
  }