Es war einmal, dass das Löschen der Farb- und Tiefenpuffer einige Zeit in Anspruch nahm. Ein Clear zu machen bedeutete, dass die Grafikkarte jedes Pixel des Framebuffers durchlaufen und einen Wert darauf schreiben musste.
Aus diesem Grund stellten die Spieleentwickler fest, dass es effizienter wäre, einfach anzunehmen, dass jedes Pixel erneut gerendert würde. Sie entwickelten dazu viele Techniken.
Der Farbpuffer ist am einfachsten zu ignorieren. Weniger einfach ist der Tiefenpuffer, da er mit alten Daten verschmutzt wäre. Also war das, was sie taten, einfach.
In Frame 0 würden sie mit einem glDepthRange
(oder dem D3D-Äquivalent) von (0, 0,5) rendern und ein glDepthFunc
von GL_LESS
(oder GL_LEQUAL
) verwenden. Dies bedeutet, dass der am weitesten entfernte Tiefenwert, den Sie jemals im Tiefenpuffer erhalten würden, 0,5 beträgt. Der größte Wert im Tiefenpuffer am Ende von Bild 0 ist also 0,5 (vorausgesetzt, Sie haben in jedes Pixel geschrieben).
In Frame 1 würden sie den Tiefenbereich auf (1, 0,5) ändern. Beachten Sie, dass in diesem Fall der Wert für die nahe Tiefe größer als die entfernte Tiefe ist. Sie würden aber auch die Tiefenfunktion in GL_GREATER
(oder GL_GEQUAL
) ändern , was die Bedeutung des Tiefentests umkehrt. Da der größte Wert im Tiefenpuffer 0,5 ist, hat alles, was Sie schreiben, einen größeren Wert . Da der Tiefentest umgekehrt wurde, bedeutet dies effektiv, dass alles, was auf Bild 0 geschrieben wurde, jetzt weiter entfernt ist als alles, was möglicherweise auf Bild 1 geschrieben werden könnte. Am Ende von Bild 1 beträgt der kleinste Wert im Tiefenpuffer jetzt 0,5.
Und dann wiederholen sie.
Bei Hardware, die seit 2003 hergestellt wurde, handelt es sich nicht mehr um eine Optimierung. In der Tat ist es eine negative Optimierung . Durch das Löschen des Tiefenpuffers wird die Hardware tatsächlich schneller . Nicht wirklich.
Grundsätzlich passiert, dass das Löschen von Puffern eigentlich nichts schreibt. Sie speichern einige Bits in den Caches der GPU, die dem System mitteilen, auf welche Farbe / Tiefe sie gelöscht wurden. Wenn das System versucht, in eine Cache-Zeile des Framebuffers zu schreiben, macht es sich nicht die Mühe zu lesen, was sich dort befindet, da es bereits weiß, dass es sich um ein leeres Feld mit dem Wert für klare Farbe / Tiefe handelt. Wenn Sie versuchen, mit dem zu mischen, was vorhanden ist, oder einen Tiefentest durchführen, müssen Sie nicht lesen: Es weiß, welchen Wert Sie mischen / mit / gegen testen müssen.
Jedes erste Lesen / Ändern / Schreiben, das Sie nach dem Löschen in jeder Cache-Zeile ausführen, ist im Grunde ein Schreiben. Es ist kostenlos .
Darüber hinaus kann ein gezackter Tiefenpuffer gegen Hyper-Z / Hierarchial-Z / alle Z-Culling-Optimierungen in der Hardware wirken. Ja, Ihre Szene wird irgendwann gegen diese funktionieren, wenn Sie Details hinzufügen. Wenn Ihr Tiefenpuffer jedoch von früheren Renderings abweicht, selbst wenn sich diese Hintergrundobjekte im Hintergrund befinden, kann dies die Effizienz der Z-Culling-Techniken beeinträchtigen. Und das wird die Leistung nicht verbessern.
Daher sollten Sie diese Tiefenumkehrtechnik in modernen Spielen niemals anwenden.
Hinweis: Jari macht einen guten Eindruck auf kachelbasierte Rendering-Architekturen (wie sie in den meisten mobilen Plattformen zu finden sind). Wenn Sie die Tiefe nicht ausräumen, kann das auch dort unangenehm werden.