今天早上遇到了一个看似神秘的错误,我很幸运地很快就找到了解决办法。
我在片段着色器中通过除以计数器产生一个平均值,当计数器为零时,结果颜色值变为 NaN。
Nvidia在混合时优雅地将 NaN 视为 0 值,但是 Intel 不会,并且似乎会级联 NaN,导致片段变成黑色。
所以这个错误一直存在,直到我在 Intel 机器上测试代码时才发现。
我想知道是否有什么方法可以“捕获”无效值。看起来,就像普通编程一样,处理这种情况的唯一可靠方法(即使这样也不完全可靠)是仔细考虑除数所有可能的情况。
检测 NaN 的标准方法是查看数字是否与自身不相等。我能否构建一个调试着色器,检查每个片段是否与自身不相等,如果满足条件,设置一个闪烁、醒目的颜色?GLSL 是否允许我以这种方式检测 NaN,还是当值无效时我只能使用未定义的行为?