In vielen gängigen AAA-Titeln (insbesondere Source-Engine-Spielen), wenn der Spieler einen Bereich erreicht, für den er nicht gesorgt hat, z. Auf dem Bildschirm tritt ein seltsamer Effekt auf (Puffer reißen?).
Es kann als ähnlich wie bei Windows beschrieben werden, dass Windows XP möglicherweise ein Fenster zurücklässt, das gezogen wird, während ein System hängt.
Ich kann nur postulieren, dass die Entwickler den Farbpuffer beim Aktualisieren des Bildschirms nicht löschen?
Ist das korrekt? Wenn ja warum?
Antworten:
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 einglDepthFunc
vonGL_LESS
(oderGL_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
(oderGL_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.
quelle
Ja, Sie haben Recht, dass der Backbuffer nicht gelöscht wird.
Der Grund dafür ist (meistens), dass es schneller ist, einen benutzerdefinierten Shader zu verwenden, bei dem die Ping-Pongs-Tiefenwerte in jedem Frame in entgegengesetzte Richtungen verlaufen und sich darauf verlassen, dass Ihr Spiel immer jedes Pixel auf dem Bildschirm wiedergibt.
Für null Kosten sparen Sie also einen Puffer, der pro Frame gelöscht wird.
quelle