Beste Weg, um zu erkennen, NaN ' s in OpenGL und Shader

Lief ich in das, was schien, ein mysteriöser bug, dass ich heute morgen das Gefühl, sehr viel Glück zu haben stolperte über eine Lösung sehr schnell.

War ich der Division durch einen Zähler zu produzieren Durchschnitt innerhalb eines fragment-shader, und natürlich, wenn der Zähler null ist, ist der resultierende Farbwert wurde NaN.

Während blending, NVidia würdevoll behandelt ein NaN als Wert 0, aber Intel nicht und die Kaskade scheint die NaN, was in schwarze Bruchstücke.

Und so dieser Fehler blieb bis getestet habe ich den code auf einem Intel-Rechner.

Frage ich mich, ob es gibt etwas, das ich tun konnte, um "trap" ungültige Werte. Es scheint, dass, genau wie in der regulären Programmierung, die einzige todsichere (und selbst dann fühlt es sich nicht kugelsicher) Möglichkeit, damit umzugehen, ist sorgfältig zu prüfen, alle möglichen Fälle, beim dividieren von zahlen.

Den standard-Weg, um entdecken ein NaN ist, um zu sehen, ob eine Zahl nicht gleich selbst. Könnte ich vielleicht bauen Sie eine debug-shader, die prüft jedes fragment zu sehen, wenn es nicht gleich zu sich selbst, und wenn diese Bedingung erfüllt ist, setzen Sie ein blinkendes, auffällige Farbe? Tut GLSL erlauben Sie mir zu erkennen, einen NaN-so oder so bin ich stecken mit undefiniertem Verhalten, wenn ein Wert ungültig ist?

  • Warum willst du eine Division durch 0? Können Sie nicht fangen die Zähler von 0 oder ändern Sie Ihren Algorithmus?
  • Es ist vernünftig, für einen Programmierer immer zu überprüfen, ob ein möglicher Nenner kann null sein, aber die überprüfung entstehen können, eine Leistung Kosten. Meine Frage ist in Bezug auf die Erkennung von fehlerhaften Werte nach der Tat.
InformationsquelleAutor Steven Lu | 2012-02-25
Schreibe einen Kommentar