【发布时间】:2016-12-08 16:52:35
【问题描述】:
这是基于以下问题:Best way to detect NaN's in OpenGL shaders
标准 GLSL 定义了 isnan() 和 isinf() 函数用于检测。 OpenGL ES 2.0 着色语言没有。尽管如此,我该如何处理 NaN 和 Inf?
【问题讨论】:
标签: 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 和 Inf?
【问题讨论】:
标签: android iphone opengl-es opengl-es-2.0 gpgpu
您可以通过仅适用于 NaN 的条件检查 NaN:
bool isNan(float val)
{
return (val <= 0.0 || 0.0 <= val) ? false : true;
}
isinf 有点困难。没有将浮点数转换为其整数表示并使用位的机制。所以你必须将它与一个适当大的数字进行比较。
【讨论】:
Inf 或NaN。
< 生成代码的情况,如果任一参数为NaN,则该代码始终评估为真。最安全的方法是从一开始就防止生成 NaN。
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;*/
}
【讨论】:
未经测试,因此不确定这是否可行(由于优化),但它应该适用于 Inf 和 -Inf。
bool isinf(float val) {
return (val != 0.0 && val * 2.0 == val) ? true : false;
}
【讨论】: