ich lese ein tolles OpenGL-Tutorial. Es ist wirklich toll, vertrau mir. Das Thema, bei dem ich mich gerade befinde, ist Z-Puffer. Abgesehen von der Erklärung, worum es geht, erwähnt der Autor, dass wir benutzerdefinierte Tiefentests wie GL_LESS, GL_ALWAYS usw. durchführen können. Er erklärt auch, dass die tatsächliche Bedeutung von Tiefenwerten (was oben ist und was nicht) auch sein kann angepasst. Ich verstehe soweit. Und dann sagt der Autor etwas Unglaubliches:
Die Reichweite zNah kann größer sein als die Reichweite zFar; wenn dies der Fall ist, werden die Fensterabstandswerte umgekehrt, in Bezug darauf, was am nächsten oder am weitesten vom Betrachter entfernt ist.
Früher wurde gesagt, dass der Fensterraum-Z-Wert von 0 am nächsten und 1 am weitesten ist. Wenn jedoch unsere Clipspace-Z-Werte negiert würden, wäre die Tiefe von 1 der Ansicht am nächsten und die Tiefe von 0 am weitesten entfernt. Wenn wir jedoch die Richtung des Tiefentests umkehren (GL_LESS zu GL_GREATER usw.), erhalten wir genau das gleiche Ergebnis. Es ist also wirklich nur eine Konvention. In der Tat war das Umdrehen des Zeichens von Z und der Tiefentest einst eine wichtige Leistungsoptimierung für viele Spiele.
Wenn ich das richtig verstehe, ist das Umdrehen des Z-Zeichens und der Tiefentest leistungsmäßig nichts anderes als das Ändern von a <
Vergleich zu a >
Vergleich. Also, wenn ich das richtig verstehe und der Autor nicht lügt oder Dinge erfindet, dann ändert er sich <
zu >
früher war eine wichtige Optimierung für viele Spiele.
Hat sich der Autor etwas ausgedacht, habe ich etwas falsch verstanden, oder ist das tatsächlich einmal so <
war langsamer (lebenswichtigwie der Autor sagt) als >
?
Vielen Dank für die Klärung dieser ziemlich merkwürdigen Angelegenheit!
Haftungsausschluss: Mir ist vollkommen bewusst, dass die Komplexität von Algorithmen die Hauptquelle für Optimierungen ist. Außerdem vermute ich, dass es heutzutage definitiv keinen Unterschied machen würde, und ich frage dies nicht, um irgendetwas zu optimieren. Ich bin nur extrem, schmerzhaft, vielleicht unerschwinglich neugierig.
(a < b) ist identisch mit (b > a), sodass es absolut nicht erforderlich ist, beide Vergleichsoperationen in Hardware zu implementieren. Der Leistungsunterschied ist das Ergebnis dessen, was als Ergebnis der Vergleichsoperation passiert. Dies ist ein langer und kurvenreicher Weg, um alle Nebenwirkungen zu erklären, aber hier sind ein paar Hinweise. Spiele zum Füllen des Tiefenpuffers, um eine teurere Fragmentverarbeitung für Fragmente zu vermeiden, die den Tiefentest nicht bestanden haben. Quake hat früher den Tiefenbereich in zwei Hälften geteilt, um zu vermeiden, dass der Framebuffer gelöscht wird, da das Spiel immer jedes Pixel auf dem Bildschirm füllte und so weiter.
– t0rakka
27. Dezember 2017 um 14:24 Uhr
Hier ist der archivierte Version des referenzierten OpenGL-Tutorials. Ich kann das zitierte Snippet jedoch nicht finden, vielleicht wurde es herausgenommen.
– Telefon
8. Juli 2018 um 13:03 Uhr