Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

3D- Spieleprogrammierung Softwaretechnologie II Dozent: Herr Prof. Dr. Manfred Thaller WS 13/14 Referent: Christian Braun.

Ähnliche Präsentationen


Präsentation zum Thema: "3D- Spieleprogrammierung Softwaretechnologie II Dozent: Herr Prof. Dr. Manfred Thaller WS 13/14 Referent: Christian Braun."—  Präsentation transkript:

1 3D- Spieleprogrammierung Softwaretechnologie II Dozent: Herr Prof. Dr. Manfred Thaller WS 13/14 Referent: Christian Braun

2 Das 1. Dreieck! Texturen!

3 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 Das 1. Dreieck Was brauchen wir dafür?

4 o Eck- oder Scheitelpunkt einer Primitive => Dreieck, Linie, Punkt o enthält Angaben zu Position, Farbe, Transparenz usw… o Grundsatz für die meisten Informationen: Interpolation zwischen Vertizes Initialisierung Vertex/ Vertizes struct SVertex { tbVector3 vPosition;// Position des Vertex DWORD dwColor;// Farbe des Vertex static const DWORD dwFVF;// Vertexformat (statisch) }; Vertexformat aktivieren

5 Initialisierung Dreieck definieren Svertext g_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 Dreieck definieren

6 o Einstellungen, um später etwas auf Bildschirm sehen zu können o Kontrolle des Rasterizers sowie Anweisung, WIE das Dreieck gezeichnet werden soll o SetRenderState => Setzt Status auf angegebenen Wert o GetRenderState => Fragt Status ab und liefert ihn zurück o Starten alle mit: D3DRS_ o Möglichkeiten des Render-States: Beleuchtung Schattierung Füllmodus Dithering Initialisierung Render- States

7 DITHERING Initialisierung Render- States..fehlender Farbgenauigkeit....starker Verpixelung! Geringe Anzahl verfügbarer Farben führt zu..

8 DITHERING Initialisierung Rende- States o Pixel wird von menschlichem Auge nicht als Einzelobjekt wahrgenommen o eine Farbe wird aus verschiedenfarbigen Pixeln gemischt 1 Pixel Blau + 1 Pixel Rot = 1 Pixel Violett Technik zur Erzeugung größerer Farbtiefen:

9 300 Farben OHNE Dithering DITHERING Initialisierung RENDER-STATES 16 Farben MIT Dithering

10 Initialisierung RENDER-STATES tbResult InitScene() { HRESULT hResult; g_pD3DDevice->SetRenderState(D3DRS_Lighting, FALSE); g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE); Return TB_OK; } Fertige Render-States für unser Dreieck

11 o Bestimmt, welcher Teil der Weltmatrix dargestellt wird o erschafft den eigentlichen 3D Effekt o weiter entfernte Objekte erscheinen kleiner, Nahe wirken Groß Initialisierung Projektionsmatrix //Bildseitenverhältnis berechnen Float fAspect = (float)(g_Direct3DParameters.VideoMode.Width) / (float)(g_Direct3DParameters.VideoMode.Heigth); //Projektionsmatrix erzeugen tbMatrix mProjection = 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)); 3D- Effekt erstellen

12 o tbMatrixTranslation o verschieben des Dreiecks im dreidimensionalem Raum o Beobachter befindet sich(ohne spezielle Sichtmatrix) beim Punkt (0,0,0) o Dreieck wird im Beispiel auf (0,0,2), also um 2 Einheiten in die Tiefe verschoben o tbMatrixRotationY o Rotation um die Y-Achse, einzig ein Winkel wird benötigt o Winkel sollte sich parallel zur abgelaufenen Zeit seit Programmstart erhöhen => gleichmäßige Drehung Zeichnen/ Rendern Translationsmatrix Rotationsmatrix

13 Zeichnen/ Rendern Zeitzähler tbResult Move(float fNumSecsPassed) { g_fTime += fNumSecsPassed; // Zeitzähler erhöhen return TB_OK; } Variable g_fTime wird erhöht um die abgelaufene Zeit seit dem letzten Bild!

14 Zeichnen/ Rendern Translation & Rotation tbResult Render(float FNumSecsPassed) { // Rotations- Translationsmatrix des Dreiecks erzeugen tbMatrix mRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime *90.0f))); tbMatrix mTranslation(tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f))); //Beide Matrizen kombinieren und als Weltmatrix einsetzen tbMatrix mWorld(mRotation * mTranslation); g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMatrix*)(&mWorld)); Return TB_OK;

15 Zeichnen/ Rendern 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; }

16 o Nichts weiter als Bilder, welche charakteristische Muster und Farben auf Oberfläche übertragen o Simulation von unterschiedlichsten Oberflächen o aus Kugel wird mit passender Textur Fußball o Gute Verarbeitungsgeschwindigkeit => kein Unterschied in Performance zwischen einem texturierten und einem nicht texturierten Dreieck o Nachteil: Eventuelle Unebenheiten werden nicht berücksichtigt, Oberfläche bleibt stets flach Texturen Sinn und Zweck

17 Wie wird die Textur an das Objekt angelegt und positioniert? Texturen Hmm..?

18 o Textur enthält TEXEL => Pixel einer Textur o Zuordnung von Texel(Textur) und Vertex(Objekt) o jeder Vertex erhält sein Gegenüber auf der Textur (0,0) u-Achse v-Achse 0,5 (1, 1) 1 1 Zweidimensionale s Texturkoordinaten system Texturkoordinaten Texturen

19 Bevorzugter Speicherplatz: Grafikkarte o Häufiger Zugriff nötig, schneller Zugriff gewährleistet o Große Texturen problematisch, weil zu wenig Speicher Bevorzugte Größe: quadratische Texturen Zweierpotenzregel beachten o viele 3D Grafikkarten akzeptieren nur Texturen, dessen Breite und Höhe Zweierpotenzen sind o 1, 2, 4, 8, 16, 32… Texturen Speicher und Größe

20 Texturen Hmm..? Bei Objekten, welche nah an der Kamera und dementsprechend groß sind, erscheinen hässliche, verpixelte Vierecke?! Texturauflösung zu gering Viele nebeneinanderliegende Pixel erhalten den gleichen Texel = Mehr Pixel als Texel =

21 Texturen Bilineare Filter Lösungsmöglichkeit 1:Auflösung der Textur erhöhen..ABER: Ressourcenunfreundlich hohe Speicherplatzbelegung Grafikkartenspeicher Lösungsmöglichkeit 2: o Interpolation zwischen vier Texturkoordinaten des nächst gelegenen Texel o Vergrößerte Texturen werden nicht eckiger, sondern runder/weicher

22 Texturen So siehts aus!

23 Der bilineare Filter hat keinen Sinn bei weit entfernten, kleinen Objekten. Was nun? Texturen Hmm..?

24 Texturen MIP- Mapping o Größe der Textur verändern o es entstehen viele verschiedene Versionen einer einzigen Textur o Direct3D wählt selbstständig passende Version aus o 256 x 256 => 128 x 128 => 64 x 64 => 32 x 32 …

25 Danke für....die Aufmerksamkeit!


Herunterladen ppt "3D- Spieleprogrammierung Softwaretechnologie II Dozent: Herr Prof. Dr. Manfred Thaller WS 13/14 Referent: Christian Braun."

Ähnliche Präsentationen


Google-Anzeigen