120 likes | 282 Views
Fortgeschrittene Techniken (750 – 755): Stereo-3D-Grafik - Raumaufteilung - Light-Mapping. Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung Prof . Dr. Manfred Thaller AM 3 Übung: Softwaretechnologie II Teil 1: Simulation und 3D-Programmierung
E N D
Fortgeschrittene Techniken (750 – 755): Stereo-3D-Grafik - Raumaufteilung- Light-Mapping Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung Prof. Dr. Manfred Thaller AM 3 Übung: Softwaretechnologie II Teil 1: Simulation und 3D-Programmierung WS 2010/2011 Dennis Kiewning
Stereo-3D-Grafik 9.4 • Prinzip: • Trennen der Bilder : Zwei Bilder rendern • Zwei Bilder mit Rot und Blau kombinieren: Rot/BlauFilter (Brille) • Vorteile: • Kostengünstig • Funktioniert mit (fast) jeder Grafikkarte • Einfach zu implementieren • Nachteil: • eine Farbe geht komplett verloren: • - bei Rot-Blau: Grün • - bei Rot-Grün: Blau
Stereo-3D-Grafik 9.4 • Implementierung: • Render-State D3DRS_COLORWRITEENABLE kontrolliert, welche Farbkanäle beim Rendern geschrieben werden und welche nicht: • Szene beginnen und alle Puffer leeren • D3DRS_COLORWRITEENABLE D3DCOLORWRITEENABLE_RED • Die Szene von links rendern • Z- und Stencil-Buffer leeren • D3DRS_COLORWRITEENABLE D3DCOLORWRITEENABLE_BLUE • Die Szene von rechts rendern • Szene beenden und den Bildpuffer sichtbar machen
Stereo-3D-Grafik 9.4 • Beispielprogramm: • Galactica unterstützt 3D-Brillen: • #define _3D_GLASSES oben in die Datei GAME.CPP schreiben
Raumaufteilung 9.5 • Bisher standen Spielfiguren und bewegliche Objekte im Mittelpunkt. • Andere Spieltypen werden allerdings häufig durch ein statisches Objekt – den „Level“ – eingenommen. • Problem: • Solche Objekte besitzen viel mehr Dreiecke als jedes andere Objekt. • Lösung: • Rekursives Rendern!
Raumaufteilung 9.5 • Rekursives Rendern: • Modell aufteilen und nur sichtbare Teile rendern: • - BSP (Binary Space Partition) • - Generieren eines Octrees • Grundprinzip: • „Man hat den Level rekursiv unterteilt, und man kennt die Bounding-Box oder • die Bounding-Sphere jedes einzelnen Teils (Knotens). Das Rendern erfolgt • nun ebenfalls rekursiv.“
Raumaufteilung 9.5 • Rekursives Rendern: • voidRenderNode(Node* pNode) • { • // Ist der Knoten sichtbar? • if(tbBoxVisible(pNode, g_aViewFrustum)) • { • // Ja, er ist sichtbar! • // Wenn es ein Endknoten ist, rendern wir seine Dreiecke. • if(pNode->bIsLeaf) • { • // Effekt starten • // ... • // Rendern • g_pD3D->SetStreamSource(...); • g_pD3D->SetIndices(...); • g_pD3D->DrawPrimitive(...); • } • else • { • // Es ist kein Endknoten! • // Nun rufen wir rekursiv die Unterknoten auf. • for(int i = 0; i < pNode->iNumChilds; i++) • { • // Unterknoten rendern • RenderNode(pNode->apChild[i]); • } • } • } • } (Bounding-Box)
Raumaufteilung 9.5 • PVS und Portale: • Auch mit BSP-Trees oder Octrees muss die Grafikkarte immer noch viele „überflüssige“ Dreiecke rendern. • Lösung: • PVS –Potencially Visible Set: • Eine Liste, die alle Knoten eines Baums enthält, die potenziell sichtbar sind: • - Funktioniert bei Indoor-Levels • - Türen die Räume verbinden = Portale
Raumaufteilung 9.5 • PVS und Portale: • Erstellen eines neuen Sichtbereich: ein neues View-Frustum • Vor dem Rendern eines Knotens prüfen, ob er sich im neu generierten Sichtbereich befindet. • Vorteile: • Große Teile des Levels „wegcullen“ • Rendern dynamischer Objekte außerhalb des Sichtfelds sparen
Light-Mapping 9.5.3 • Light-Mapping: • Grundgedanke: Lichtquellen reduzieren • Textur, die lediglich die Beleuchtung eines Dreiecks darstellt • Diffuse und Lightmap werden über den Operator D3DTOP_MODULATE verbunden
Light-Mapping 9.5.3 • Light-Maps generieren: • Lohnt es sich eine Light-Map anzufertigen? • Größe der Light-Map für jedes Dreieck festlegen: • Light-Map-Texel durchsuchen und dessen Beleuchtung berechnen • Ray-Tracing (Radiosity) • Light-Maps in einer großen Textur zusammenfassen: • verringert beim Rendern den Aufruf von SetTexture • Wichtig: • Vertizes der Dreiecke brauchen jeweils zwei Texturkoordinatenpaare: • Diffuse + Lightmap
Die TriBase-Klasse tbOctree 9.5.4 • Die TriBase-Klasse tbOctree: • Übergabeeiner Modelldatei • Anschließende Umwandlung in einen BSP-Tree oder einen Octree • tbOctree-Klasse zum Rendern des Octrees verwenden