今朝の不思議なバグのように見えて、私は非常に素早く解決策を見つけるのは大変ラッキーだと感じました。OpenGLシェーダでNaNを検出する最善の方法
私は、フラグメントシェーダの平均内部を生成するためにカウンタで割っていましたが、もちろんカウンタがゼロのとき、結果のカラー値はNaNになりました。
ブレンド中、NVidiaはNaNを正常に0値として扱いますが、IntelはNaNをカスケードしないように見せかけ、黒い破片を生成します。
Intelのマシンでコードをテストするまで、このバグは残っていました。
無効な値を「トラップ」するためにできることがあるのだろうかと思います。通常のプログラミングと同じように、唯一の確実な(そしてそれでも防弾ではない)方法は、数値を分割するときに考えられるすべてのケースを注意深く検討することです。
NaNを検出する標準的な方法は、数値がそれ自身と等しくないかどうかを確認することです。おそらく、それ自身と等しくないかどうかを確認するために各フラグメントをチェックするデバッグシェーダを構築し、その条件が満たされていれば、目立った色が点滅するように設定できますか? GLSLはこのようにNaNを検出できますか、値が無効なときはいつも未定義の動作に固執していますか?
なぜ0で割りますか?カウンターを0にしたり、アルゴリズムを変更したりすることはできませんか? – djmj
潜在的な分母がゼロかもしれないが、チェックによって性能コストが発生する可能性があるかどうかは、プログラマにとって常に合理的です。私の質問は、事実の後の悪い値の検出に関連しています。 –