这是基于这个问题的: 在OpenGL着色器中检测NaN的最佳方法
标准GLSL定义了isnan()和isinf()函数用于检测。然而,OpenGL ES 2.0着色语言没有这些功能。我该如何处理NaN和Inf呢?
标准GLSL定义了isnan()和isinf()函数用于检测。然而,OpenGL ES 2.0着色语言没有这些功能。我该如何处理NaN和Inf呢?
bool isNan(float val)
{
return (val <= 0.0 || 0.0 <= val) ? false : true;
}
isinf
是一个比较难的概念。没有一种机制可以将浮点数转换成整数表示并操作比特位。所以你需要将其与足够大的数字进行比较。
WebGL也存在同样的问题。Nicol Bolas的答案对大多数GPU有效,但对某些nVidia GPU无效。我尝试过的所有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;*/
}
未经测试,所以不确定这是否可行(由于优化),但它应该适用于正无穷和负无穷。
bool isinf(float val) {
return (val != 0.0 && val * 2.0 == val) ? true : false;
}
Inf
或NaN
。 - Nicu Stiurca<
生成代码,如果任一参数是 NaN,则始终计算为真。最安全的方法是防止NaNs首先产生。 - Sean