【发布时间】:2012-03-15 20:32:17
【问题描述】:
今天早上我遇到了一个看似神秘的错误,我很幸运能够很快找到解决方案。
我用一个计数器除以在片段着色器中产生一个平均值,当然当计数器为零时,生成的颜色值变为 NaN。
在混合过程中,NVidia 优雅地将 NaN 视为 0 值,但 Intel 不会并且似乎将 NaN 级联,从而产生黑色片段。
所以这个错误一直存在,直到我在英特尔机器上测试代码。
我想知道是否可以采取一些措施来“捕获”无效值。似乎,就像在常规编程中一样,处理这个问题的唯一可靠(即使这样也不是万无一失)的方法是在除数时仔细考虑所有可能的情况。
检测 NaN 的标准方法是查看数字是否不等于自身。我是否可以构建一个调试着色器来检查每个片段以查看它是否不等于自身,如果满足该条件,则设置一个闪烁的显眼颜色? GLSL 是否允许我以这种方式检测 NaN,或者每当值无效时我是否会陷入未定义的行为?
【问题讨论】:
-
为什么要除以 0?你不能抓住计数器为 0 或改变你的算法吗?
-
程序员总是检查潜在分母是否为零是合理的,但检查可能会产生性能成本。我的问题与事后检测不良值有关。