这是基于以下问题:Best way to detect NaN's in OpenGL shaders
标准GLSL定义了isnan()和isinf()函数用于检测。 OpenGL ES 2.0着色语言没有。我怎么能处理NaN和Infs呢?
答案 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;
}