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

Post on 05-Apr-2015

106 views 1 download

transcript

3D- Spieleprogrammierung

Softwaretechnologie IIDozent: Herr Prof. Dr. Manfred Thaller

WS 13/14Referent: Christian Braun

Das

1. D

reie

ck!

Text

uren

!

Initialisierung der SzeneDefinition des Dreiecks(Art, Größe, Farbe..)Definition des Rahmens(Sichtfeld,, 3D-Effekt,

Beleuchtung, Dithering..)

ZeichenvorgangPosition und Verhalten des

Dreiecks(Ausrichtung, Entfernung, Rotation)Eigentlicher Zeichenvorgang

Das

1. D

reie

ckWas brauchen wir dafür?

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

Initi

alis

ieru

ngVertex/ Vertizes

struct SVertex{tbVector3 vPosition; // Position des VertexDWORD dwColor; // Farbe des Vertexstatic const DWORD dwFVF; // Vertexformat (statisch)};

Vertexformat aktivieren

Initi

alis

ieru

ng Dreieck definieren

Svertext g_aTriangleVertex[3]; //Globale Variable

g_aTriangleVertex[0].vPosition = tbVector3 ( 0.0f, 1.0f, 0.0f); // obeng_aTriangleVertex[1].vPosition = tbVector3 ( 1.0f, -1.0f, 0.0f); // rechts unteng_aTriangleVertex[2].vPosition = tbVector3 ( -1.0f, -1.0f, 0.0f);// links unten

g_aTriangleVertex[0]. dwColor = tbColor3 ( 1.0f, 0.0f, 0.0f); // Rotg_aTriangleVertex[1]. dwColor = tbColor3 ( 0.0f, 1.0f, 0.0f); // Grüng_aTriangleVertex[2]. dwColor = tbColor3 ( 0.0f, 0.0f, 1.0f); // Blau

Dreieck definieren

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:BeleuchtungSchattierungFüllmodusDithering

Initi

alis

ieru

ngRender- States

DITHERINGIn

itial

isie

rung

Render- States

..fehlender Farbgenauigkeit..

..starker Verpixelung!

Geringe Anzahl verfügbarer Farben führt zu..

DITHERINGIn

itial

isie

rung

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:

300 Farben OHNE Dithering

DITHERINGIn

itial

isie

rung

RENDER-STATES

16 Farben MIT Dithering

Initi

alis

ieru

ngRENDER-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

o Bestimmt, welcher Teil der Weltmatrix dargestellt wird

o erschafft den eigentlichen 3D Effekto weiter entfernte Objekte erscheinen kleiner, Nahe

wirken GroßIniti

alis

ieru

ngProjektionsmatrix

//Bildseitenverhältnis berechnenFloat fAspect = (float)(g_Direct3DParameters.VideoMode.Width)

/ (float)(g_Direct3DParameters.VideoMode.Heigth);

//Projektionsmatrix erzeugentbMatrix mProjection = tbMatrixProjection (TB_DEG_TO_RAD(90.0f),//Sichtfeld: 90°

fAspect, //Bildseitenverhältnis

0.1f, //Nahe Clipping-Ebene

100.0f); //Ferne Clipping-Ebene

//Projektionsmatrix einsetzenG_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*) (&mProjection));

3D- Effekt erstellen

o tbMatrixTranslationo verschieben des Dreiecks im dreidimensionalem

Raumo 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 tbMatrixRotationYo Rotation um die Y-Achse, einzig ein Winkel wird

benötigto Winkel sollte sich parallel zur abgelaufenen Zeit

seit Programmstart erhöhen=> gleichmäßige Drehung

Zeic

hnen

/ Ren

dern

Translationsmatrix

Rotationsmatrix

Zeic

hnen

/ Ren

dern

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!

Zeic

hnen

/ Ren

dern

Translation & Rotation

tbResult Render(float FNumSecsPassed){

// Rotations- Translationsmatrix des Dreiecks erzeugentbMatrix 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 einsetzentbMatrix mWorld(mRotation * mTranslation);

g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMatrix*)(&mWorld));

Return TB_OK;

Zeic

hnen

/ Ren

dern

Zeichenvorgang

g_pD3DDevice->BeginScene(); //Szene Beginnen

If(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP( // UP= User Pointer

D3DPT_TRIANGLELIST, //Dreiecksliste1, //1 Dreieckg_aTriangleVertex, //Vertizessizeof(Svertex)))) //Vertexgröße

g_pD3DDevice9::EndScene(); //Szene beenden

g_pD3DDevice->Present(NULL, NULL, NULL, NULL); //Bildpuffer sichtbar machen

Return TB_OK;}

o Nichts weiter als Bilder, welche charakteristische Muster und Farben auf Oberfläche übertrageno Simulation von unterschiedlichsten

Oberflächenoaus 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

TexturenSinn und Zweck

Wie wird die Textur an das Objekt angelegt und

positioniert?

TexturenHmm..?

o Textur enthält TEXEL => Pixel einer Texturo 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

0,5

(1, 1)1

1

Zweidimensionales Texturkoordinatensystem

Texturkoordinaten Texturen

Bevorzugter Speicherplatz: Grafikkarteo 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 sindo 1, 2, 4, 8, 16, 32…

TexturenSpeicher und Größe

TexturenHmm..?

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

=

TexturenBilineare Filter

Lösungsmöglichkeit 1:Auflösung der Textur erhöhen

..ABER:Ressourcenunfreundlich hohe SpeicherplatzbelegungGrafikkartenspeicher

Lösungsmöglichkeit 2:

o Interpolation zwischen vier Texturkoordinaten des nächst gelegenen Texel

o Vergrößerte Texturen werden nicht eckiger, sondern runder/weicher

TexturenSo siehts aus!

Der bilineare Filter hat keinen Sinn bei weit entfernten, kleinen Objekten.

Was nun?

TexturenHmm..?

TexturenMIP- Mapping

o Größe der Textur veränderno es entstehen viele verschiedene Versionen

einer einzigen Texturo Direct3D wählt selbstständig passende Version aus

o 256 x 256 => 128 x 128 => 64 x 64 => 32 x 32 …

Dan

ke fü

r....die Aufmerksamkeit!