如何在OpenGL ES 2.0着色器中处理NaN或inf

rsp*_*984 3 iphone android gpgpu opengl-es opengl-es-2.0

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

标准GLSL定义用于检测的isnan()和isinf()函数.OpenGL ES 2.0着色语言没有.我怎么能处理NaN和Infs呢?

Nic*_*las 5

您可以通过仅对NaN为真的条件检查NaN:

bool isNan(float val)
{
  return (val <= 0.0 || 0.0 <= val) ? false : true;
}
Run Code Online (Sandbox Code Playgroud)

isinf有点困难.没有机制将float转换为其整数表示并使用位进行播放.所以你必须将它与适当大的数字进行比较.

  • @RafaelSpring可能有.众所周知,大多数GPU硬件采用快捷方式,因为浮动会产生符合IEEE 754标准的__non -__浮点数.因此,我怀疑您的行为是否得到保证.正如尼科尔建议的那样,你最好的选择可能是对正常操作期间所期望的最小值和最大值有所了解,并检查你的值是否在该范围内.否则,它可能是"Inf"或"NaN". (2认同)