Mit der W-Koordinate wird die perspektivische Division durchgeführt. Das war früher vermutlich deutlich performanter als eine Division direkt im Shader. Man kann/konnte es direkt in Verbindung mit homogenen Matrixen nutzen, dort ist ja auch diese Rechnung notwendig. Ansonsten kann man im seltenen Fällen die Koordinate vielleicht als billige Division verwenden. Heutzutage ist der VS aber in seltensten Fällen ein Engpass.
Eine Division durch 1 ändert nicht. Also ja. Ich hatte vor Kurzen mal tagelang nach einen Fehler beim Rendering gesucht, weil ich W versehentlich auf 0 gesetzt hatte. Und /0 liefert hier sehr große Zahlen. (Also nicht IEEE Konform)
Nein. Beim X86/X64 gibt es bei Integerrechnung bei einer Division durch 0 eine CPU-Exception die vom Betriebssystem behandelt wird und in der Regel dein Programm mit Fehlermeldung beendet. Solch komplizierte Mechanismen gibt es jedoch nicht in OpenGL. Für Gleitkommazahlen ist ohnehin nicht üblich. Die Norm IEEE 754 (Nach der man sich heutzutage bei Gleitkommazahlen meist richtet) definiert, dass eine Division einer positiven Zahl durch 0 den Spezialwert positiv Unendlich erzeugt. Dementsprechend erzeugen negative Zahlen durch 0 negativ Unendlich. Außer bei 0/0, das erzeugt NAN (Not a number). NAN ist so zu sagen wieder eine Fehlerbenachrichtigung. Jede weitere Operation mit NAN gibt ebenfalls selbst wieder NAN zurück.
Die Rechnung bei der perspetivischen W-Division erzeugt jetzt aber nicht Unendlich oder NAN sondern behandelt sie als normale wenn auch sehr kleine Zahl. (So als ob 0 gleich ~0.00000000001 wäre...)
Unendlich Der Gleitkommawert „Unendlich“ repräsentiert Zahlen, deren Betrag zu groß ist, um dargestellt zu werden. Es wird zwischen +„Unendlich“ und −„Unendlich“ unterschieden. Die Berechnung von 1,0/0,0 ergibt per Definition ebenfalls +„Unendlich“.
Lese ich das richtig, das die Norm 1985 verabschiedet wurde ?
Ja, ist nicht so neu. Soweit ich weiß, waren die ersten Versionen des x87 Koprozessors nicht 100% kompatibel. Das ist aber lange, lange her und hat auch nichts mit Ausnahmen bei 0-Divisionen zu tun.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Anmerkung: Genaugenommen kann man das einstellen, welche Operationen Fehler sein sollen, die mit einem SIGFPE (Floating Point Exception) quittiert werden. Dafür gibt es die FPU Flags, welche z.B. auch im DGL-Header gesetzt werden.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 44 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.