Exotische Texturformen Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung WS 2010/11 Softwaretechnologie II (Teil 1) Simulation und 3D Programmierung Referat von Sara Hommelsen
Volumentexturen dreidimensional Angabe der Größe in Pixeln/Texeln ausgehend von 2D-Textur > bei 3D: flache Textur wird zum Quader > bekommt zusätzlich Tiefe zu Höhe/Breite
Volumentexturen 3D-Vektor für Texturkoordinaten: Makros: tbVector3 D3DFVF_TEXCOORDSIZE
sonstige Eigenschaften Filterung Erzeugung von Mip-Maps viel Speicherplatz
Schnittstelle bisher: IDirect3DTexture9, nun: IDirect3DVolumeTexture9 > erwarten Methode: IDirect3DDevice9::SetTexture
Schnittstelle: Format/Größe GetVolumeLevel der IDirect3DVolumeTexture9 1. Parameter: Mip-Map-Ebene zum abfragen 2. Parameter: Zeiger auf IDirect3DVolume9 Schnittstelle, die Direct3D erfüllen soll. Aufruf GetDesc > ausgefüllte Textur vom Typ D3Volume_DESC
Wozu Volumentexturen? Landschaften Animation Licht/Schatten
Herstellung/Ladevorgang Verwendung von DirectXTextureTool (gehört zum DirectX SDK) DDS-Format
Volumentexturen laden Standard: D3DXCreateTextureFromFile (Ex) Volumen: D3DXCreateVolumeTextureFromFile (Ex) erwartet Tiefe als weiteren Parameter wenn Originalgröße übernommen werden soll, dann: D3DX_DEFAULT letzter Parameter: Adresse des Zeigers auf IDIRECT3DVolumeTexture9-Schnittstelle
Umgebungstexturen kubische Umgebungstexturen (in Würfelform angeordnet) Generierung von 6 Texturen Texturen werden auf Objekt gelegt > tatsächliche Struktur , reflektierte Bilder der Umgebung sind sichtbar
Texturkoordianten - 1 Flags sind dreidimensional Texturschicht-State D3DTSS_TEXTURETRANSFORMFLAGS auf D3DTTFF_COUNT3 Schnittstelle IDirect3DCubeTexture9 laden D3DXCreateCubeTextureFromFile (Ex)
Texturkoordianten - 2 generieren: DirectXTextureTool neue Textur erstellen cubeMapTexture wählen um zwischen Würfelflächen hin und her zu schalten: view -> CubeMapView => Bilddateien auf entsprechende Flächen der Würfeltextur laden (s. Standardtextur)
Skybox Sky Box = Würfel indem man sich befindet vorteilhaft, wenn Textur hoch aufgelöst Sky Box und Reflexion: gleiche Textur > Vertizes brauchen 3 Koordinaten
Bump Mapping (mit 3D) Simulation der Oberfläche auf Pixelebene Unterstützung abfragen: im Eintrag sind TextureOpCaps der D3DCAPS-9 Struktur die Flags D3DTEXOPCAPS_BUMPENVMAP gesetzt
Bump Mapping Transformation: U/V-Steigungswerte werden mit 2x2-Matrix multipliziert Matrixangabe m. H. der Texturschicht-States D3DTSS_BUMPENVMAT00 (M11) D3DTSS_BUMPENVMAT10 (M21) D3DTSS_BUMPENVMAT01 (M12) D3DTSS_BUMPENVMAT11 (M22)
Luminanz Veränderung: L´= L*S+0 S= Skalierungsfaktor D3DTSS_BUMPENVSCALE O= Offset-Wert D3DTSS_BUMPENVOFFSET
Einsetzen der Bump Map Verwendung von 3 Texturen: Schicht = normale Oberflächenstruktur Schicht = Bump-Map Schicht = Environment Map
Aktivierung der Bump Map Farboperator stellen auf: D3DTOP_BUMPENVMAP D3DTOP_BUMPENVMAPLUMINANCE gleiche Texturkoordinaten: D3DTSS_TCI_CAMERASPACEPERFECTIONVE CTOR und D3DTTFF_COUNT3
Erzeugung der Bump Map Direct3D erwartet Steigung oder durch Umrechnung selbst angeben oder Verwendung von DirectXTextureTool > Speicherung im DDS-Format
Environmental Bump Mapping Neuberechnung der Vektoren
Stencil-Buffer - 1 Teil des Z-Stencil-Buffers verschiedene Formate: D3DFMT_D32 D3DFMT_D16 D3DFMT_D24S8
Stencil-Buffer - 2 Der Clear-Methode der Schnittstelle IDirect3Device9 werden Flags D3DCLEAR_TARGET, D3DCLEAR_ZBUFFER, Flag D3DCLEAR_STENCK übergeben > leert Stencil-Buffer
Stencil-Buffer - 3 2^Anzahl der Stencil-Buffer reservierten Pixel – 1 >größter Wert, den Stencil-Buffer in einem Pixel erreichen kann
Stencil-Buffer - 4 Zweck: Reihe von Effekten in Echtzeitberechnung Format: Z-Stencil-Buffer setzen von Render-State D3DRS_STENCILABLE auf TRUE => alle gezeichneten Primitive verwenden Stencil-Buffering
Stencil-Test wenn Render-State D3D_STENCILABLE auf TRUE, dann Test Aufstellung gezielter Vergleichsfunktion und Referenzwert
Schreiben in Stencil-Buffer Festlegung was mit Stencil-Wert geschehen soll Werte können für Render-States eingesetzt werden (vgl. Tab. S. 247) Vergleich aller Stencil-Werte mit Referenzwert, festlegen mit D3DRS_STENCILREF
Lese- und Schreibbitmasken Einführung, weil manchmal nur einzelne Bits eines Stencil-Werts getestet werden sollen gesetzt in Form von Render-States Schreibbitmaske: Bitmaske wird mit bitweisem &-Operator auf alle Werte im Stencil-Buffer angewendet Lesebitmaske: Anwendung von Direct3D auf Referenzwert und auf aus Stencil-Buffer gelesene Werte
zweiseitiger Stencil-Buffer-Modus Flag D3DSTENCILCAPS_TWOSIDED im Element Stencilcaps der D3DCAPS9- Struktur gesetzt Render-State (RS) D3DRS_TWOSIDEDSTENCILMODE auf TRUE danach weitere RS zur Verfügung RS legen Stencil-Buffer-Einstellungen fest, die auf Bildschirm GEGEN den Uhrzeigersinn angeordnet sind Referenzwert und Schreibbitmasken werden NICHT voneinander getrennt betrachtet.
Stencil-Buffer füllen ohne Bildpufferfüllung Beschreibung des Stencil-Buffers auf 2 Weisen Clear-Methode zeichnen von Primitiven mit aktiviertem Stencil- Buffering um Abdruck im Stencil-Buffer zu hinterlassen: Vergleichsfunktion: D3DRS_STENCILFUNC auf D3DCMP_ALWAYS für D3DRS_STENCILPASS: D3DSTENCILOP_REPLACE und D3DRS_STENCILSREF auf den Wert der von Primitiven hinterlassen werden soll
D3DX Effekte Aufteilung des Render-Vorgangs: Zeichnung aller Dreiecke die Material A/Textur A verwenden, dann alle die Material B/Textur B verwenden usw. VOR jedem Rendern: Material muss eingesetzt werden, eventuelle Veränderungen einiger Werte
Effekte D3DX definiert Effektschnittstelle ID3DXEffect Techniken Durchgänge
Render States & Co. Wertezuweisung Texturschicht-/Samplerstate: Darstellung als Array Übernahme aller Namen ohne Präfixe
Transformationsmatrizen Worldtransform ViewTransform ProjectionTransform TextureTransform
Variablentypen Texture DWord Float String
Laden eines Effekts kann aus Datei/Speicher o.ä. geladen werden Funktion: D3DXCreateEffectFromFile
Mit Effekten rendern - 1 Technik durch Typ D3DXHANDLE ansprechen Anzahl verfügbarer Technik Methodenaufruf: ID3DXEffect::GetDesc füllt Struktur D3DXEFFECT_DESC aus Techniques-Element for-Schleife Methode ID3DXEffect::ValidateTechnique dafür D3DXHANDLE-Variable In for-Schleife: Index steht zur Verfügung
Mit Effekten rendern - 2 4. Methode GetTechnique erwartet Technikindex, liefert D3DXHANDLE zurück, der für ValidateTechnique gebraucht wird 5. wenn erfolgreich, dann Aktivierung m.H. der Methode ID3DXEffect::SetTechnique
Effekte aktivieren Effekt aktivieren mit ID3DXEffect::Begin 1. Parameter: Zeiger auf UINT 2. Parameter: 0 oder D3DXFX_DONOTSAVESTATE
Rendern Durchgang jedes einzelnen Durchgangs mit for-Schleife VOR jedem Zeichenvorgang Methodenaufruf ID3DXEffect::BeginPass Aufruf EndPass >nachdem alles gezeichnet ist: ID3DXEffect::End
Transformation umgehen Vertizes wandern durch Transformationspipeline rein: einfache objektrelative/absolute Positionsangaben raus: fertig bearbeitete 2D-Koordinaten Umgehung durch transformierte Vertizes
Unterschied - 1 x/y-Koordinate: echte Bildschirmkoordinaten mit 1 Pixel als Einheit z-Koordinate muss zwischen 0 und 1 liegen zusätzliche Angabe von w-Koordinate
Unterschied - 2 transformierte Vertizes: keine Beleuchtung keine Garantie, dass Clipping durchgeführt wird >transformierte Vertizes hervorragend, weil Raum zur Entwicklung eigener Verfahren
anderes Vertexformat transformierte Vertizes:
Imitation von DirectDraw Blitting > kopieren eines bestimmten Bereichs eines Quellbildes auf ein Zielbild > Verwendung hauptsächlich um Grafikobjekte zu zeichnen, die in seperaten Oberflächen gespeichert sind > immer dann verwenden, wenn Texturen im Spiel sind
Color Keying bestimmte Farben werden ausgelassen in Quellbildern gespeicherte Objekten wird Hintergrundfarbe zugewiesen Pixel in dieser Farbe werden verworfen Verwendung von Alpha-Kanal um Informationen zu speichern nichtkopierte Pixel = Alphawert 0 eingebauter Alphakanalgenerator: D3DXCreateTextureFromFile (Ex)
Rotation Veränderung der Vertex-Position, die Rechteck formen keine Verwendung von Transformationspipeline, sondern Funktion tbvector2TransformCoords > damit Transformation der Vertizes von Hand mit einer vorher erstellen Rotationsmatrix
andere Methode für 2D-Grafik Verzicht von Sichtmatrix und Projektionsmatrix -> Identitätsmatrix Z-Koordinate muss zwischen 0 und 1 liegen Vorteile: kein anderes Vertexformat, Verwendung von Weltmatrix, Clipping funktioniert
In Texturen rendern - 1 erstellen einer Textur/Z-Buffers - Identifizierung der Grafikkarte als Render- Target - Flag: D3DUSAGE_RENDERTARGET übergeben an Funktion D3DCreateTextureFromFile oder Methode IDirect3DDevice9::CreateTextur e
In Texturen rendern - 2 - Flag wird für usage-Parameter angegeben - Speicherklasse muss D3DPOOL_DEFAULT sein - Erzeugung Z-Stencil-Buffer mit Flag D3DUSAGE_DEPTHSTENCIL
In Texturen rendern - 3 2. Schritt: neues Render-Target setzen - rendern auf neu erzeugte Textur und Z-Stencil-Buffer m.H. von 2 Methoden: IDirect3DDevice9::SetRenderTarget SetDepthStencilSurface - erwarten Zeiger auf Direct3D-Oberfläche - zuerst: Oberfläche - SetRenderTarget erwartet Render-Target-Index
In Texturen rendern - 4 3. Schritt: alles rendern was in Textur erscheinen soll - Aufurf von clear am Anfang - Textur: andere Auflösung als alte Back-Buffer
Einfacher mit D3DX erleichtert Vorgang enorm folgende Schnittstellen: ID3RenderToSurface ID3DRenderToEnvMap -> Schnittstellen kümmern sich um Erzeugung Z-Stencil-Buffer, Anpassung an Viewport, ermöglicht rendern auf Texturen, die mit Mip-Mapping arbeiten
DANKE!