Backface Culling ist ein wichtiger Teil davon, wie eine 3D-Engine Sichtbarkeitsprüfungen durchführt. Der Zweck ist es, Polygone zu erkennen, die in einer bestimmten Szene unsichtbar sind – also Polygone, die vom Betrachter weg zeigen.
Die Erkennung von nach hinten gerichteten Polygonen ermöglicht es uns, sie frühzeitig aus der Rendering-Pipeline einer Engine zu eliminieren und so den Rechen- und Speicherbedarf zu reduzieren.
Es gibt verschiedene Möglichkeiten zu erkennen, ob ein Polygon zum Betrachter hin oder vom Betrachter weg zeigt, und jede Methode hat ihren eigenen Grad an Komplexität und Genauigkeit.
In diesem Artikel beschreiben wir eine Culling-Technik, die den Speicherbedarf für Facet Normals beim Backface Culling reduziert. Diese hochpräzise Technik, die ein genaues Backface Culling im Object Space durchführt, ist besonders für das Frontend-Culling geeignet und benötigt nur halb so viel Speicherplatz wie die Standard-Facetten-Normal-Technik.
Die Motivation hinter dem Front-End Culling.
Das Backface Culling kann an mehreren Stellen in der 3D-Pipeline durchgeführt werden. Obwohl wir uns einfach zurücklehnen und den Rastnerbildner für uns auswählen lassen könnten, ist es von Vorteil, den Culling-Vorgang früher durchzuführen. Denn je früher wir irrelevante Daten loswerden, desto weniger Daten müssen im System verschoben (Bandbreitenersparnis) und desto weniger Berechnungen müssen durchgeführt werden (CPU-Last sparen). Das Culling kann in einer von drei Stufen durchgeführt werden.
- Vor der Transformation und Beleuchtung.
- Nach der Transformation, aber vor der Beleuchtung.
- Im Rasterizer (nach Transformation und Beleuchtung).
Das Culling während der Phasen 2 und 3 wird typischerweise im Screen Space durchgeführt, indem die Reihenfolge im Uhrzeigersinn und gegen den Uhrzeigersinn der Eckpunkte eines Polygons überprüft wird. Das Frontend-Culling (Stufe 1) wird typischerweise durch Berechnen des Produktpunkts des Betrachtungsvektors und der Facet Normals des Polygons durchgeführt. Die Facet Normals können im Handumdrehen berechnet oder vorberechnet und mit dem Datensatz gespeichert werden. Auf jeden Fall ist das Culling im Voraus (Stufe 1) typischerweise schneller als die anderen Culling-Strategien (Stufe 2 oder 3), da es Bandbreite spart und weniger Berechnungen erfordert.
Der eigentliche Aufwand der Frontend-Selektion besteht darin, dass wir entweder die Facet Normals im laufenden Betrieb berechnen oder ein vorberechnetes Facet Normal verwenden müssen, was die Größe unserer Modelldatenbank erhöht. Dieser Anstieg kann jedoch um die Hälfte reduziert werden und obwohl die vorberechneten Facet Normals die Modellgröße erhöhen, greift das Verfahren sequentiell auf den Speicher zu, was für uns von Vorteil ist.
Andererseits, wenn das Culling auf der Grundlage von Vertex-Order-Tests (Stadien 2 und 3) erfolgt, durchläuft der Culling-Vorgang die Dreiecke und greift auf die Nodes für jedes Dreieck zu. Die Eckpunkte benachbarter Dreiecke ( und sogar desselben Dreiecks) können über den gesamten Node-Pool verteilt werden, was zu zufälligen Speicherzugriffen während der Entnahme führt. Diese Zufallszugriffe sind langsam und führen zu einer suboptimalen Cache-Nutzung.
Die auf Facet Normals basierende Culling-Technik schleust sich auch durch die Dreicke, greift aber auf ihre Facet Normals statt auf ihre Eckpunkte zu. Da die Facet Normals pro Dreieck gespeichert sind, werden sie sequentiell in der Culling-Loop geholt. Dadurch sind die sequentiellen Speicherzugriffe schnell, nutzen den Cache effektiv aus und können durch Prefetch weiter beschleunigt werden.
Unsere Arbeit mit Gamedevelopern hat gezeigt, dass das Frontend-Culling bei richtiger Anwendung oft zu einer erheblichen Leistungssteigerung (10 bis 20 Prozent Steigerung der Frameraten) führt.
Somit sind wir, zugegebenermaßen, sehr knappen Einführung in das Backface Culling soweit durch. Wenn Sie noch Fragen oder Anregungen haben sollten, hinterlassen Sie uns unten einen Kommentar.
Vielen Dank für Ihren Besuch.
Leave A Comment