Post on 05-Apr-2015
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:– tbVector3
• Makros:– 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: DirectXTextureTool1. neue Textur erstellen
2. cubeMapTexture wählen
3. 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:1. Schicht = normale Oberflächenstruktur
2. Schicht = Bump-Map
3. Schicht = Environment Map
Aktivierung der Bump Map
• Farboperator stellen auf:– D3DTOP_BUMPENVMAP– D3DTOP_BUMPENVMAPLUMINANCE
• gleiche Texturkoordinaten:– D3DTSS_TCI_CAMERASPACEPERFECTIONVECTOR und D3DTTFF_COUNT3
Erzeugung der Bump Map
• Direct3D erwartet Steigung– 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
1. Render-State (RS) D3DRS_TWOSIDEDSTENCILMODE auf TRUE
2. danach weitere RS zur Verfügung3. RS legen Stencil-Buffer-Einstellungen fest, die
auf Bildschirm GEGEN den Uhrzeigersinn angeordnet sind
4. 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 ansprechen1. Anzahl verfügbarer Technik
1. Methodenaufruf: ID3DXEffect::GetDesc
2. füllt Struktur D3DXEFFECT_DESC aus
3. Techniques-Element
1. for-Schleife1. Methode ID3DXEffect::ValidateTechnique
2. dafür D3DXHANDLE-Variable
1. 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
1. erstellen einer Textur/Z-Buffers
- Identifizierung der Grafikkarte als Render-Target
- Flag: D3DUSAGE_RENDERTARGET übergeben an Funktion D3DCreateTextureFromFile oder Methode IDirect3DDevice9::CreateTexture
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!