这是基于以下问题:在 OpenGL 着色器中检测 NaN 的最佳方法
标准 GLSL 定义了 isnan() 和 isinf() 函数进行检测。OpenGL ES 2.0 着色语言没有。尽管如此,我该如何处理 NaN 和 Infs 呢?
问问题
3912 次
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 回答