Wenn wir DirectX anweisen, Geometrie zu rendern, führt es einen Culling-Test durch, um zu sehen, ob sich ein Node innerhalb des View Frustum befindet, bevor es den Node rendert. DirectX rendert einen Node nur, wenn er sich innerhalb des View Frustum befindet.

Dieser Test findet jedoch statt, nachdem die Geometrie transformiert und von der Welt beleuchtet wurde und Matrizen betrachtet wurden. In komplexen Szenen würden Tausende von Nodes transformiert, nur um vom Frustum-Test in DirectX abgelehnt zu werden.

Wir können die Leistung erheblich beschleunigen, wenn wir vor unseren Renderaufrufen einen View Frustum Culling Test implementieren.

rendering software

Wenn Sie einige Fachbücher wie Realtime-Rendering sich gerade durchlesen, werden Sie vielleicht feststellen, dass der Blickwinkel einer Kamera in der Projektionsmatrix definiert ist. Wenn Sie also die View- und Projektionsmatrizen verketten, erhalten wir eine Matrix, die den View Frustum im World Space definiert. Um die Frustum-Informationen zu speichern, verwenden wir 6 D3DXPLANE-Strukturen, die die linke, rechte, obere, untere, nahe und ferne Ebene darstellen. Jede D3DXPLANE-Struktur repräsentiert die a, b, c und d der allgemeinen Ebenengleichung: ax + durch + cz + dw = 0, wobei a, b und c die Normals der Ebene bilden und d der Abstand vom ursprung ist.

Bei jedem Bild aktualisieren wir die Kamera, um dieses View Frustum neu zu erstellen, damit wir die Geometrie vor der Transformation zurückweisen können. 

Es gibt verschiedene Methoden, mit denen wir testen können, ob ein Mesh innerhalb des View Frustum liegt. Die teuerste Methode wäre es, jeden einzelnen Node in einem Node Buffer zu testen, ob er innerhalb des Frustum liegt. Das wäre natürlich dumm, also werden wir es nicht tun. Stattdessen verwenden wir den Bounding Sphere Test. Wir verwenden die Position jedes Meshes und einen Radius, der eine Kugel um das Mesh herum bilden würde, um zu testen, ob sich das Mesh innerhalb des View Frustum befindet. Durch unsere mathematischen Kenntnisse wissen wir, dass ein Punkt vor einer Ebene liegt, wenn das Punktprodukt der Ebene normal ist und der Punkt, der zum Abstand der Ebene vom Usprung hinzugefügt wird, größer als 0 ist, mit anderen Worten:

Prüfen Sie, ob ein Punkt vor einer Ebene liegt:

Copy to Clipboard

Es gibt zufällig eine Funktion in der D3DX-Bibliothek, welche diese Berechnung durchführt: D3DXPlaneDotCoord.

Berechnen der Bounding Sphere:

Copy to Clipboard

Um den Radius des Bounding Spheres zu berechnen, verwenden wir die Funktion D3DXComputeBoundingSphere. Um diese Funktion nutzen zu können, müssen wir Zugriff auf die Nodes im Vertexbuffer des Meshes erhalten. Wir können dies mit ID3DXMesh: LockVertexBuffer tun.

Beachten Sie, dass wir für die Verwendung der Funktion D3DXComputeBoundingSphere die Anzahl der Nodes benötigen, die mit ID3DXMesh::GetNumVertices erhalten wurden und den Nodeschritt, der mit D3DXGetFVFVertexSize und ID3DXMesh::GetFVF erhalten wurde.

Überprüfen, ob sich ein Objekt im inneren des Frustums befindet.

Copy to Clipboard

Bevor wir ein Mesh rendern, prüfen wir, ob es sich im Blickfeld der Kamera befindet, um zu sehen, ob wir es rendern sollten. Die SphereInFrustum-Methode der Ccamera-Klasse verwendet das View Frustum der Kamera, um zu bestimmen, ob sich die begrenzende Kugel des Meshes innerhalb des View Frustum befindet. Bevor wir diese Methode jedoch aufrufen können, müssen wir wissen, wie wir das View Frustum aufbauen können.

Aufbau des View Frustum.

Copy to Clipboard

Diese Funktion wird bei der Aktualisierung der Kamera als jedes Einzelbild bezeichnet. Ein effizienterer Einsatz wäre es, einfach das View Frustum zu aktualisieren, wenn sich die Kamera bewegt, aber es kommt die Funktionalität zuerst und die Optimierungen zuletzt. Um ein besseres Verständnis der dahinter stehenden Mathematik zu erhalten, kaufen Sie Real-Time Rendering. Grundsätzlich stellt die vierte Spalte der Selektionsmatrix die Z-Achse der Kamera dar.

Die erste, zweite und dritte Spalte stellen die Normals der Ebenen dar, die das View Frustum bilden. Also addieren oder subtrahieren wir sie einfach zusammen, um die entsprechende View Frustum-Ebene zu extrahieren. Wir müssen auch die Ebenen normalisieren, damit unsere Punktproduktberechnungen genau sind. Wir tun dies, indem wir D3DXPlaneNormalize aufrufen.

Überprüfen, ob sich ein Sphere im Frustum befindet.

Copy to Clipboard

Und schließlich der Culling Test. Eine Kugel befindet sich im View Frustum, wenn sie sich vor allen Ebenen des View Frustum befindet. Wie zu Beginn dieses Tutorials erwähnt, bestimmen wir, auf welcher Seite einer Ebene sich ein Punkt befindet, indem wir das Punktprodukt mit D3DXPlaneDotCoord berechnen. Da es sich um eine Kugel und nicht um Punkte handelt, addieren wir den Radius zum Punktprodukt, bevor wir ein Urteil fällen.

Vielen Dank für ihren Besuch.

Und schließlich der Culling Test. Eine Kugel befindet sich im View Frustum, wenn sie sich vor allen Ebenen des View Frustum befindet. Wie zu Beginn dieses Tutorials erwähnt, bestimmen wir, auf welcher Seite einer Ebene sich ein Punkt befindet, indem wir das Punktprodukt mit D3DXPlaneDotCoord berechnen. Da es sich um eine Kugel und nicht um Punkte handelt, addieren wir den Radius zum Punktprodukt, bevor wir ein Urteil fällen.

Vielen Dank für ihren Besuch.