3d- spieleprogrammierung softwaretechnologie ii dozent: herr prof. dr. manfred thaller ws 13/14...
Post on 05-Apr-2015
106 Views
Preview:
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!
top related