Folgende Vorgehensweise:
- Als erstes die Welt in Einzel-Objekte unterteilen.
- Von jedem Objekt musst du dessen Boundingbox kennen, sprich den jeweils niedrigsten und höchsten X,Y und Z-Wert
- Beim Zeichnen multiplizierst du die Eckpunkte dieser Boundingbox dann mit der Model-und Camera-Matrix, um die Positionen der Eckpunkte aus "deiner Sicht" zu erhalten
- Anschließend testest du ob sich diese Box in deinem Sichtkegel befindet, in Google zu finden unter "Frustum Culling"
- Wenn du es noch etwas optimieren willst unterteilst du deine Objekte noch in einzelne Unterobjekte und testest dann quasi hierarchisch nach unten.
Bei Dingen wie z. Bsp. einer Landschaft verfährst du ähnlich. Hier kannst du z. Bsp. erst für eine 128x128m große Fläche die Boundingbox ermitteln und dessen "Kinder" sind dann 64x64 große Flächen, dessen dann 16x16m große Flächen usw. usw., die du dann auch jeweils wieder gegen das Frustum testest.
Ab wie vielen Dreiecken man unterteilt ist extrem Grafikkarten abhängig. Vor 10 Jahren hat es noch gelohnt 200 Dreiecke nochmal zu unterteilen, heute wohl eher erst ab einigen Tausend, muss man einfach ausprobieren.
Wenn man dann noch mehr rauskitzeln will, kann man Techniken wie BSP-Trees, Portale oder Software-Occlusion-Culling angehen, aber Frustum-Culling ist eigentlich immer der erste Schritt, weils sehr simpel zu handhaben ist.
Bzgl. der Vorgehensweise beim Rendern:
Culling-Thread:
1. Ermitteln welche Objekte überhaupt zu sehen sein sollen und sich in Sichtweite befinden -> Liste A
2. Culling (Frustum Culling, BSP etc.) -> alle aus Liste A verbliebenen in Liste B
3. Liste sortieren (z. Bsp. nach Textur, Shader etc. pp)
4. Liste an Render Thread übergeben
5. Warten bis Render-Thread Liste "abgeholt hat" (sonst "schlafen")
Render Thread (Der in dem du Direct3D/OpenGL initialisierst, Texturen lädst et.c pp.):
1. Neue Liste abholen (sonst "schlafen")
2. Liste ausgeben
LG
Alyx