1 / 25

3D- Spieleprogrammierung

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..)

arlais
Download Presentation

3D- Spieleprogrammierung

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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. 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) };

  5. 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

  6. 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

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

  8. 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:

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

  10. 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; }

  11. 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));

  12. 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

  13. 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!

  14. 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;

  15. 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. 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. Hmm..? Wie wird die Textur an das Objekt angelegt und positioniert? Texturen

  18. 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

  19. 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, verpixelteVierecke?! Texturen Texturauflösung zu gering = Mehr Pixel als Texel = Viele nebeneinanderliegende Pixel erhalten den gleichen Texel

  21. 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

  22. So siehts aus! Texturen

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

  24. 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..

More Related