250 likes | 374 Views
3D- Spieleprogrammierung. Softwaretechnologie II Dozent: Herr Prof. Dr. Manfred Thaller WS 13/14 Referent: Christian Braun. Das 1. Dreieck!. Texturen!. Was brauchen wir dafür?. Das 1. Dreieck. Initialisierung der Szene Definition des Dreiecks( Art, Größe, Farbe..)
E N D
3D- Spieleprogrammierung Softwaretechnologie II Dozent: Herr Prof. Dr. Manfred Thaller WS 13/14 Referent: Christian Braun
Das 1. Dreieck! Texturen!
Was brauchen wir dafür? Das 1. Dreieck Initialisierung der Szene Definition des Dreiecks(Art, Größe, Farbe..) Definition des Rahmens(Sichtfeld,, 3D-Effekt, Beleuchtung, Dithering..) Zeichenvorgang Position und Verhalten des Dreiecks(Ausrichtung, Entfernung, Rotation) Eigentlicher Zeichenvorgang
Vertex/ Vertizes Initialisierung • Eck- oder Scheitelpunkt einer Primitive => Dreieck, Linie, Punkt • enthält Angaben zu Position, Farbe, Transparenz usw… • Grundsatz für die meisten Informationen: Interpolation zwischen Vertizes Vertexformat aktivieren structSVertex { tbVector3 vPosition; // Position des Vertex DWORD dwColor; // Farbe des Vertex staticconstDWORD dwFVF; // Vertexformat (statisch) };
Dreieck definieren Initialisierung Dreieck definieren Svertextg_aTriangleVertex[3]; //Globale Variable g_aTriangleVertex[0].vPosition = tbVector3 ( 0.0f, 1.0f, 0.0f); // oben g_aTriangleVertex[1].vPosition = tbVector3 ( 1.0f, -1.0f, 0.0f); // rechts unten g_aTriangleVertex[2].vPosition = tbVector3 ( -1.0f, -1.0f, 0.0f);// links unten g_aTriangleVertex[0]. dwColor = tbColor3 ( 1.0f, 0.0f, 0.0f); // Rot g_aTriangleVertex[1]. dwColor = tbColor3 ( 0.0f, 1.0f, 0.0f); // Grün g_aTriangleVertex[2]. dwColor = tbColor3 ( 0.0f, 0.0f, 1.0f); // Blau
Render- States Initialisierung • Einstellungen, um später etwas auf Bildschirm sehen zu können • Kontrolle des Rasterizers sowie Anweisung, WIE das Dreieck gezeichnet werden soll • SetRenderState => Setzt Status auf angegebenen Wert • GetRenderState=> Fragt Status ab und liefert ihn zurück • Starten alle mit: D3DRS_ • Möglichkeiten des Render-States: Beleuchtung Schattierung Füllmodus Dithering
Render- States DITHERING Initialisierung • Geringe Anzahl verfügbarer Farben führt zu.. ..fehlender Farbgenauigkeit.. ..starker Verpixelung!
Rende- States DITHERING Initialisierung • Pixel wird von menschlichem Auge nicht als Einzelobjekt wahrgenommen • eine Farbe wird aus verschiedenfarbigen Pixeln gemischt 1 Pixel Blau + 1 Pixel Rot = 1 Pixel Violett Technik zur Erzeugung größerer Farbtiefen:
RENDER-STATES DITHERING Initialisierung 300 Farben OHNE Dithering 16 Farben MIT Dithering
RENDER-STATES Initialisierung Fertige Render-States für unser Dreieck tbResultInitScene() { HRESULT hResult; g_pD3DDevice->SetRenderState(D3DRS_Lighting, FALSE); g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE); Return TB_OK; }
Projektionsmatrix Initialisierung • Bestimmt, welcher Teil der Weltmatrix dargestellt wird • erschafft den eigentlichen 3D Effekt • weiter entfernte Objekte erscheinen kleiner, Nahe wirken Groß 3D- Effekt erstellen //Bildseitenverhältnis berechnen FloatfAspect = (float)(g_Direct3DParameters.VideoMode.Width) / (float)(g_Direct3DParameters.VideoMode.Heigth); //Projektionsmatrix erzeugen tbMatrixmProjection = tbMatrixProjection (TB_DEG_TO_RAD(90.0f), //Sichtfeld: 90° fAspect, //Bildseitenverhältnis 0.1f, //Nahe Clipping-Ebene 100.0f); //Ferne Clipping-Ebene //Projektionsmatrix einsetzen G_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*) (&mProjection));
Translationsmatrix Zeichnen/ Rendern • tbMatrixTranslation • verschieben des Dreiecks im dreidimensionalem Raum • Beobachter befindet sich(ohne spezielle Sichtmatrix) beim Punkt (0,0,0) • Dreieck wird im Beispiel auf (0,0,2), also um 2 Einheiten in die Tiefe verschoben • tbMatrixRotationY • Rotation um die Y-Achse, einzig ein Winkel wird benötigt • Winkel sollte sich parallel zur abgelaufenen Zeit seit Programmstart erhöhen => gleichmäßige Drehung Rotationsmatrix
Zeitzähler Zeichnen/ Rendern tbResultMove(floatfNumSecsPassed) { g_fTime+= fNumSecsPassed; // Zeitzähler erhöhen return TB_OK; } Variable g_fTime wird erhöht um die abgelaufene Zeit seit dem letzten Bild!
Translation & Rotation Zeichnen/ Rendern tbResultRender(floatFNumSecsPassed) { // Rotations- Translationsmatrix des Dreiecks erzeugen tbMatrixmRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime *90.0f))); tbMatrixmTranslation(tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f))); //Beide Matrizen kombinieren und als Weltmatrix einsetzen tbMatrixmWorld(mRotation * mTranslation); g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMatrix*)(&mWorld)); Return TB_OK;
Zeichenvorgang g_pD3DDevice->BeginScene(); //Szene Beginnen If(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP( // UP= User Pointer D3DPT_TRIANGLELIST, //Dreiecksliste 1, //1 Dreieck g_aTriangleVertex, //Vertizes sizeof(Svertex)))) //Vertexgröße g_pD3DDevice9::EndScene(); //Szene beenden g_pD3DDevice->Present(NULL, NULL, NULL, NULL);//Bildpuffer sichtbar machen Return TB_OK;} Zeichnen/ Rendern
Sinn und Zweck • Nichts weiter als Bilder, welche charakteristische Muster und Farben auf Oberfläche übertragen • Simulation von unterschiedlichsten Oberflächen • aus Kugel wird mit passender Textur Fußball • Gute Verarbeitungsgeschwindigkeit => kein Unterschied in Performance zwischen einem texturierten und einem nicht texturierten Dreieck • Nachteil: Eventuelle Unebenheiten werden nicht berücksichtigt, Oberfläche bleibt stets flach Texturen
Hmm..? Wie wird die Textur an das Objekt angelegt und positioniert? Texturen
Texturkoordinaten • Textur enthält TEXEL => Pixel einer Textur • Zuordnung von Texel(Textur) und Vertex(Objekt) • jeder Vertex erhält sein Gegenüber auf der Textur Texturen 1 (0,0) 0,5 u-Achse Zweidimensionales Texturkoordinatensystem 0,5 1 (1, 1) v-Achse
Speicher und Größe Bevorzugter Speicherplatz: Grafikkarte • Häufiger Zugriff nötig, schneller Zugriff gewährleistet • Große Texturen problematisch, weil zu wenig Speicher Bevorzugte Größe: quadratische Texturen Zweierpotenzregel beachten • viele 3D Grafikkarten akzeptieren nur Texturen, dessen Breite und Höhe Zweierpotenzen sind • 1, 2, 4, 8, 16, 32… Texturen
Hmm..? Bei Objekten, welche nah an der Kamera und dementsprechend groß sind, erscheinen hässliche, verpixelteVierecke?! Texturen Texturauflösung zu gering = Mehr Pixel als Texel = Viele nebeneinanderliegende Pixel erhalten den gleichen Texel
Bilineare Filter Auflösung der Textur erhöhen Lösungsmöglichkeit 1: ..ABER: Ressourcenunfreundlich hohe Speicherplatzbelegung Grafikkartenspeicher Texturen Lösungsmöglichkeit 2: • Interpolation zwischen vier Texturkoordinaten des nächst gelegenen Texel • Vergrößerte Texturen werden nicht eckiger, sondern runder/weicher
So siehts aus! Texturen
Hmm..? Der bilineare Filter hat keinen Sinn bei weit entfernten, kleinen Objekten. Was nun? Texturen
MIP- Mapping • Größe der Textur verändern • es entstehen viele verschiedene Versionen einer einzigen Textur • Direct3D wählt selbstständig passende Version aus • 256 x 256 => 128 x 128 => 64 x 64 => 32 x 32 … Texturen
..die Aufmerksamkeit! Danke für..