3

这是基于以下问题:在 OpenGL 着色器中检测 NaN 的最佳方法

标准 GLSL 定义了 isnan() 和 isinf() 函数进行检测。OpenGL ES 2.0 着色语言没有。尽管如此,我该如何处理 NaN 和 Infs 呢?

4

3 回答 3

5

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

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

isinf有点困难。没有将浮点数转换为其整数表示并使用位的机制。因此,您必须将其与适当大的数字进行比较。

于 2012-08-04T22:28:24.850 回答
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;*/
}
于 2015-12-14T20:30:25.157 回答
0

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

  bool isinf(float val) {
    return (val != 0.0 && val * 2.0 == val) ? true : false;
  }
于 2016-12-08T08:52:35.277 回答