Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

3D- Spieleprogrammierung

Ähnliche Präsentationen


Präsentation zum Thema: "3D- Spieleprogrammierung"—  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 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

4 Eck- oder Scheitelpunkt einer Primitive => Dreieck, Linie, Punkt
Vertex/ Vertizes 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 Initialisierung Vertexformat aktivieren struct SVertex { tbVector3 vPosition; // Position des Vertex DWORD dwColor; // Farbe des Vertex static const DWORD dwFVF; // Vertexformat (statisch) };

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

6 Render- States 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 Initialisierung

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

8 = 1 Pixel Violett Initialisierung
Rende- States DITHERING Initialisierung Technik zur Erzeugung größerer Farbtiefen: 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

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

10 Initialisierung RENDER-STATES Fertige Render-States für unser Dreieck
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; }

11 Initialisierung Bestimmt, welcher Teil der Weltmatrix dargestellt wird
Projektionsmatrix Bestimmt, welcher Teil der Weltmatrix dargestellt wird erschafft den eigentlichen 3D Effekt weiter entfernte Objekte erscheinen kleiner, Nahe wirken Groß Initialisierung 3D- Effekt erstellen //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));

12 Zeichnen/ Rendern tbMatrixTranslation
Translationsmatrix 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 Zeichnen/ Rendern Rotationsmatrix

13 Zeitzähler Zeichnen/ Rendern 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; } Zeichnen/ Rendern

16 Simulation von unterschiedlichsten Oberflächen
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

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

18 Textur enthält TEXEL => Pixel einer Textur
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 (0,0) 0,5 1 u-Achse Zweidimensionales Texturkoordinatensystem 0,5 1 (1, 1) v-Achse

19 Bevorzugter Speicherplatz: Grafikkarte
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

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

21 Auflösung der Textur erhöhen
Bilineare Filter Lösungsmöglichkeit 1: Auflösung der Textur erhöhen ..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

22 So siehts aus! Texturen

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

24 Größe der Textur verändern
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

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


Herunterladen ppt "3D- Spieleprogrammierung"

Ähnliche Präsentationen


Google-Anzeigen