Warum wird der Tiefentest vor der Rasterung nicht an der Geometrie durchgeführt?

7

Es scheint, dass die einzige Zeittiefe zum Verwerfen von Daten während der Rasterung verwendet wird, dh auf Fragmentebene.

In der Geometriephase habe ich nur das Ausmerzen und Abschneiden von Scheitelpunkten gesehen. Ist es nicht möglich, anhand von Scheitelpunktdaten (Tiefe?) Zu bestimmen, ob sich ein Dreieck hinter einem anderen Dreieck befindet, und wenn ja, zu verwerfen? Würde dies nicht die ganze Arbeit später bei der Scan-Konvertierung sparen?

Colin
quelle
3
Sie können die Tiefe eines Fragments jederzeit über den Fragment-Shader ändern .
Quentin
Hier ist ein Beispiel für GPU-basiertes Okklusions-Culling: interplayoflight.wordpress.com/2017/11/15/…
Eric

Antworten:

20

Es funktioniert nicht gut, Tiefentests auf Scheitelpunktebene durchzuführen.

Dreiecke sind Flächen. Alle drei Eckpunkte eines Dreiecks könnten von anderen Dreiecken in der Szene verdeckt werden, und die Mitte dieses Dreiecks könnte noch sichtbar sein . Die einzige Möglichkeit, festzustellen, ob sich dieses Dreieck vollständig hinter etwas anderem befindet, besteht darin, die Position oder Tiefe entlang der Oberfläche des Dreiecks zu interpolieren und festzustellen, ob das Dreieck bei jedem Schritt dieser Interpolation noch verdeckt ist.

Genau das macht der Tiefen-Test pro Fragment bereits.

Während Sie also einige "clevere Tricks" pro Scheitelpunkt ausführen könnten, um zu testen, ob ein Dreieck vor dem Pro-Fragment-Test von anderen vollständig verdeckt wird, werden sie niemals vollständig genau sein, es sei denn, Sie tun genau das, was Sie tun Versuchen Sie zu vermeiden: Gehen Sie als Rasterauflösung über die Oberfläche des Dreiecks und testen Sie das Dreieck dort .


quelle
1
Hier ist ein Beispiel mit einigen einfachen Würfeln.
Draco18s vertraut SE nicht mehr
12
Wenn Sie Daten auf Scheitelpunktebene verwerfen, müssen Sie auch bei transparenten Polygonen wie Glas, Wasser oder Laub vorsichtig sein.
Nolonar
@Nolonar Obwohl dies fair ist, funktioniert dies auch nicht gut mit Tiefenprüfungen pro Fragment (sofort einsatzbereit; natürlich gibt es Lösungen wie Tiefenschälen).
Jonas Schäfer
2

Sie können feststellen, ob sich ein Dreieck hinter einem anderen Dreieck befindet. Dies ist jedoch nicht die Operation, die Sie ausführen müssten, wenn Sie auf Dreiecksebene aussortieren möchten. Sie müssten feststellen, ob sich das Dreieck hinter einem Wald von Dreiecken befindet: Sie müssen feststellen, ob sich das Dreieck hinter einem Dreieck in der Szene befindet.

Das Keulen von Dreieck zu Dreieck ist teuer. Fragment für Fragment Keulen ist viel viel billiger. Irgendwann summiert sich die Anzahl der Dreiecke und das Ausmerzen von Fragmenten wird weitaus billiger.

Dies wird auch früher geschehen als Sie denken, da wir nicht nur einzelne Dreiecke testen können. Wir müssen sie zusammen testen. Wenn Sie ein Dreieck hinter einem Quad haben (zwei Dreiecke), kann es sein, dass Ihr zu testendes Dreieck nicht von einem der Dreiecke verdeckt wird, aus denen das Quad für sich besteht. Dies bedeutet, dass Sie jetzt komplexe Geometrietests benötigen, um festzustellen, ob ein Dreieck auf diese Weise abgedeckt wird.

Am Ende ist das Testen des Dreiecks wesentlich teurer als nur die Fragmenttests.

Cort Ammon
quelle
0

Dies kann von Interesse sein:

Nur-Position-Shading-Pipeline

Das Cull Pipe verwendet diese kritischen Ergebnisse, um Sichtbarkeitsinformationen für alle Dreiecke zu berechnen, unabhängig davon, ob sie ausgesondert wurden oder nicht. Auf der anderen Seite verwendet die Wiederholungspfeife die Sichtbarkeitsinformationen, um die ausgesonderten Dreiecke zu überspringen, und schattiert nur die sichtbaren Dreiecke , die schließlich an die Rasterungsphase übergeben werden

https://patents.justia.com/patent/20160086299

Es scheint genau das Problem zu lösen, nach dem Sie fragen.

Xavier
quelle