Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung Manfred Thaller WS 2011/2012...
-
Upload
reimund-neiss -
Category
Documents
-
view
110 -
download
2
Transcript of Softwaretechnologie II (Teil 1): Simulation und 3D Programmierung Manfred Thaller WS 2011/2012...
Softwaretechnologie II (Teil 1):Simulation und 3D ProgrammierungManfred ThallerWS 2011/2012
Stereo-3D-Grafik
Linda Scholz
Räumliches Sehen
Beide Augen suggerieren räumliche Tiefe Gehirn verarbeitet zwei Bilder aus
verschiedenen Blickwinkeln Durch Verschiebung beider Bilder wird die Tiefe
berechnet
Tiefenschärfe
Vermittelt Realismus
Schärfe und Unschärfe setzen den Blickpunkt
Größe von Objekten lässt Entfernung von Objekten anmuten
Stereo-3D-Grafik
Darstellung von Bildern aus zwei Perspektiven Überlagerung der beiden Anisichten Größere Verschiebung = Entfernung zum
Betrachter
Stereo-3D-Grafik
Soll das menschliche Auge täuschen
Dreidimensionalität von Objekten wird vorgetäuscht
Stereo-3D-Grafik
2 Bilder müssen gerendert werden Jedes Auge darf nur das jeweilige Bild sehen
VR-Helme 3D-Shutter-Brillen 3D-Kino-Lösung Rot-Blau/Rot-Grün Stereografie
VR-Helme
Virtual Reality Anstelle der Gläser zwei Displays, die separat
angesteuert werden Vorteil:
sehr gute Qualität Nachteil:
Grafikkarte muss Helm unterstützen und jeden Frame doppelt rendern
Hohe Kosten
3D-Shutter-Brillen
Augen werden abwechselnd verdunkelt Monitor zeigt abwechselnd die Sicht von links
und rechts Vorteil:
günstige Lösung und gute Bildtrennung Nachteil:
Grafikkarte muss Brille unterstützen 50% Helligkeit geht verloren Bildwiederholungsfrequenz muss verdoppelt werden
3D-Kino-Lösung
Zwei Projektoren strahlen den Film einmal aus linker Sicht und einmal aus rechter an die Wand
Licht der Projektoren unterscheidet sich durch Polarisation
Filter in den 3D-Brillen lassen jeweils nur einen Licht-typ durch
Technik lässt sich für Computerspiele kaum verwenden Zwei LCD-Projektoren vor die man je einen
Polarisationsfilter stellt
Rolt-Blau/Rot-Grün
Ein Bild arbeitet mit rotem Licht eines mit blauem oder grünem Bilder werden abwechselnd von links und rechts
gezeigt Flackern entsteht
Im Bild werden Rot und Blau/Grün kombiniert
3D-Kino-Lösung
Vorteil Kostengünstig Funktioniert auf fast allen Grafikkarten Einfach zu implementieren
Nachteil Eine Farbe geht komplett verloren
Stereografie
Auf den ersten Blick undeutliches Bild Durch Verstellung der Augen wird 3D Objekt
erkennbar Tiefe der Pixel sind von Bedeutung um ein
stereografisches Bild zu berechnen Stereografische Bilder in Echtzeit durch Zugriff
auf den Bildpuffer Farbe des Pixels von seiner Tiefe abhängig
machen (Pixel-Shader)
Implementierung
Renderstate D3DRS_COLORWRITEENABLE Farbkanäle beim Rendern kontrollieren, dass
nur roter und grüner Farbkanal geschrieben wird D3DCOLORWRITEENABLE_RED D3DCOLORWRITEENABLE_GREEN
Implementierung
Szene beginnen & Puffer leeren D3DRS_COLORWRITEENABLE auf
D3DCOLORWRITEENABLE_RED setzen Szene von links rendern (Kamera entlang der X-
Achse verschieben) Z- und Stencil-Buffer leeren – nicht Bildpuffer
D3DRS_COLORWRITEENABLE auf D3DCOLORWRITEENABLE_BLUE setzen
Szene von rechts rendern Szene beenden & Bildpuffer sichtbar machen
Blickpunkt der Kamera
Bei Stereo-3D-Grafik sollte sich der Blickpunkt der Kamera bei dem Objekt befinden, das in der Bildmitte zu sehen ist.
Galactica Game.cpp
#include "Galactica.h"
// Folgendes #define schaltet den 3D-Brillen-Modus ein:
// #define _3D_GLASSES_
CGAME::Render#ifdef _3D_GLASSES_
D3D->Clear(0, NULL, D3DCLEAR_TARGET, tbColor(0.0f), 1.0f, 0);
for(int i = 0; i < 2; i++){
D3D->Clear(0, NULL, D3DCLEAR_ZBUFFER, tbColor(0.0f), 1.0f, 0);
D3D->BeginScene();
if(i == 0) D3D.SetRS(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE);
else D3D.SetRS(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED);
// Kamera setzenSetupCamera();
CGAME::SetupCamera#ifdef _3D_GLASSES_
static DWORD dwFrame;
dwFrame++;
if(dwFrame % 2) m_vCameraPos -= tbVector3Cross(tbVector3Normalize(m_vCameraLookAt - m_vCameraPos), m_vCameraUp) * 0.01f;
else m_vCameraPos += tbVector3Cross(tbVector3Normalize(m_vCameraLookAt - m_vCameraPos), m_vCameraUp) * 0.01f;
#endif
Vielen Dank
Schöne Ferien