Simulation und 3D-Programmierung Praxis: Dreiecke, Texturen, Vertex-Buffer Universität zu Köln Historisch Kulturwissenschaftliche Informationsverarbeitung Visuelle Programmierung Teil 1, WS 12 / 13 Dozent: Dr. Prof. Manfred Thaller Referent: Nelson Marambio
Simulation und 3D-Programmierung : Vertex, Interpolation Primitive: einfache geometrische Grundform (Dreieck, Linie, Punkt) Vertex: Eckpunkt einer Primitive Deklaration des Vertexformat nötig, bevor ein Vertex definiert werden kann: SetFVF (Bitmaske) Interpolation (allgemein): Berechnung von Werten innerhalb definierter Grenzen (hier im Kontext von Farbwerten oder Punkt-Koordinaten) Vorteil: Programmierer muss nur Grenzwerte definieren Nachteil: Ergebnis optisch nicht zwangsläufig ansprechend, Beispiel Scanner
Simulation und 3D-Programmierung : Vertex struct Svertex { tbVector3 vPosition; DWORD dwColor; };
Simulation und 3D-Programmierung : Primitive-Type Primitive: einfache geometrische Grundform (Dreieck, Linie, Punkt) Primitive-Type präzisiert den Modus, wie z.B. bei einem Dreieck die Punktkoordinaten verarbeitet werden, wesentlich Dreieckslisten (intuitiv, drei Punkte bilden ein Dreieck, d.h. Anzahl der Punkte muss durch 3 teilbar sein) Verbundene Dreiecke (Anzahl der Punkte > 3, „1. Seite des 2. Dreiecks ist die 3. Seite des 1. Dreiecks“, S. 142)
Simulation und 3D-Programmierung : Render-States R-S setzen Einstellungen für die gesamte Szene, z.B. Beleuchtung Füllmodus Schattierung Culling (welche Primitive werden überhaupt angezeigt ?) Dithering (Farbe eines Pixels wird aus den Farben umliegender Pixel gemischt)
Simulation und 3D-Programmierung : Matrizen Rendering: Bild wird intern, d.h. nicht sichtbar, gezeichnet und abgespeichert Projektionsmatrix: unbewegtes, dreidimensionales Bild benötigt Sichtfeld (Winkel), Seitenverhältnis, Sichtfeld-Grenze (Clipping) Translationsmatrix: definiert den Abstand des Objekts zum Betrachter Rotationsmatrix: definiert Umdrehung eines oder mehrerer Objekte pro Render-Vorgang
Simulation und 3D-Programmierung : Zeichenvorgang Render-States setzen Bildpuffer leeren (komplett, oder nur einzelne Objekte), Übersicht Parameter S. 140 Szene einleiten (IDirect3Device9::BeginScene() ) Objekte in Bildpuffer zeichnen (hier: einzelnes Dreieck) Szene beenden (IDirect3Device9::EndScene() ) Bildpuffer ausgeben (IDirect3DDevice9:Present(), S. 144)
Simulation und 3D-Programmierung : Texturen Textur = Grafik, die definiert um ein dreidimensionales Objekt „gewickelt“ wird Texel = Pixel einer Textur Schema (bei Dreieck): jedem Vertex wird ein Punkt der Textur zugeordnet, dadurch wird der passende Ausschnitt der Textur ohne Verzerrung über das Objekt gelegt (Textur-Koordinaten sind unabhängig von absoluter Auflösung, Größe eines Punktes wird berechnet ) Ursprung linke obere Ecke
Simulation und 3D-Programmierung : Texturen Textur = Grafik, die definiert um ein dreidimensionales Objekt „gewickelt“ wird Texel = Pixel einer Textur Schema : jedem Vertex wird ein Punkt der Textur zugeordnet, dadurch wird der passende Ausschnitt der Textur ohne Verzerrung über das Objekt gelegt (Textur-Koordinaten sind unabhängig von absoluter Auflösung, Größe eines Punktes wird berechnet ) Ursprung linke obere Ecke
Simulation und 3D-Programmierung : Sampler-States Sampler-States informieren über die Methode, mit der die Grafikkarte die Farbe eines texturierten Pixels ermittelt Intuitiv: absolutes Auslesen des korrespondierenden Texels Nachteil: Pixelkoordinaten werden bei geringer Distanz zum Objekt abgerundet („Playstation-Effekt“) Abhilfe: bilinearer Filter a) rundet nicht ab, b) interpoliert mit vier umliegenden Texeln Effekt: weiche Farbübergänge, Rasterung vermieden Filter definierbar für Textur-Vergrößerung und -Verkleinerung
Simulation und 3D-Programmierung : Sampler-States Texturkoordinaten eigentlich immer nur zwischen 0 und 1 (Konvention: x/y für Vertex- , u/v für Texturkoordinaten) Sampler-State D3DSAMP_ADDRESSU , D3DSAMP_ADDRESSV definieren Verhalten, wenn Koordinaten die physische Textur verlassen. Möglichkeiten (S. 154): Kachelung (mit und ohne Spiegelung) (D3DTADDRESS_WRAP, D3DTADDRESS_MIRROR) Randfarbe (Werte größer 1 auf 1 zurücksetzen) (D3DTADDRESS_CLAMP) Definierte Randfarbe (per D3DTADDRESS_BORDERCOLOR) 1x spiegeln (Betrag aus Koordinate bilden, danach Randfarbe)
Simulation und 3D-Programmierung : MIP-Mapping Problem: bei kleinen Objekten ist Textur größer als das Objekt = Textur hat nicht genügend Platz Lösung: MIP (multum in parvo)-Maps erstellen, enthalten kleinere Ausschnitte der Original-Textur (jeweils ¼ 256x256 , 128x128, 64x64 usw.)
Simulation und 3D-Programmierung : Verwendung, Speicherklasse D3DUSAGE: - 0 für normale Textur, - D3DUSAGE_RENDERTARGET für animierte Texturen - D3DUSAGE_DYNAMIC (komfortabel, aber nicht von jeder GraKa unterstützt) D3DPOOL (in welchem Speicher wird die Ressource abgelegt ?): D3DPOOL _DEFAULT (optimaler Speicher wird ausgewählt) D3DPOOL _MANAGED (Systemspeicher + Kopie in schnelleren Speicher, wenn verfügbar) D3DPOOL_SYSTEMMEN (Systemspeicher, Kopie in anderen Speicher muss manuell angestoßen werden) D3DPOOL_SCRATCH (Systemspeicher, unabhängig, ob Hardware Format der Ressource unterstützt) Filter S. 161
Simulation und 3D-Programmierung : Vertex- / Index-Buffer Bisher: Anlegen von Arrays aus Punkten in Systemspeicher einfach, aber langsam Vertex-Buffer: Speicher innerhalb der Grafikkarte, enthält … was ??? Index-Buffer: s.o. Vorteil: schnellere Zugriffszeit, weil näher an „ausführender“ Hardware Filter S. 161
Simulation und 3D-Programmierung : Sperren Um Daten aus Buffern (woraus später Objekte gezeichnet werden) verändern zu können, muss der Buffer ganz oder teilweise gesperrt werden. Prinzip: Buffer wird gesperrt Auslesen der Daten aus Buffer und Kopie in Systemspeicher (Anwendung kann erst jetzt Daten „sehen“) Anwendung manipuliert Daten … kopiert Daten zurück in den Buffer Entsperrt Buffer Objekte können gerendert werden Filter S. 161