Input Assembler

Transcrição

Input Assembler
Praktikum:
Echtzeitgraphik in C++ und DirectX10
*
*
computer graphics & visualization
* By „Elusive“ Erdt, elusive.imperianer.de
Übung 2
• Kurze Einführung in die Rendering-Pipeline
– Die „Fixed-Function“ Pipeline
– Die Direct3D 10 Pipeline
– DXUT
• .obj-Format
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Rendering Pipeline (Fixed Function)
User / Driver
Vertex Stream
Transform & Lighting
Fragment Stream
Texturing
Vertex Stage
Rasterisierer
Pixel Stage
Blending/Ops
Texture
0 1
Texture
Texture
2 3
Texture
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Direct3D 10 Pipeline
• Die Pipeline besteht aus:
– Programmierbaren Einheiten
• Vertex Shader
• Geometry Shader
• Pixel Shader
Input
Assembler (IA)
Vertex
Shader (VS)
Geometry
Shader (GS)
– Fixed-Function Einheiten
•
•
•
•
Input Assembler
Stream Output
Setup / Rasterizer
Output Merger
Stream
Output (SO)
Setup /
Rasterizer (RS)
Pixel
Shader (PS)
Output
Merger (OM)
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Input Assembler
• Aufgabe:
– Vertex Daten lesen/erzeugen
Input
Assembler (IA)
Vertex Buffer
Vertex
Shader (VS)
Texture/Buffer
Geometry
Shader (GS)
Texture/Buffer
• Input:
– Vertex Buffer + Index Buffer
• Output:
– Vertices mit Attributen und Indices pro
Vertex, Primitiv und Objekt
• Steuerbar durch:
– IASetVertexBuffers/SetIndexBuffer
– IASetInputLayout
– IASetPrimitiveTopology
Index Buffer
Stream
Output (SO)
Buffer
Memory
Setup /
Rasterizer (RS)
Pixel
Shader (PS)
Texture/Buffer
Depth
Output
Merger (OM)
Color
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Input Assembler
Input Layout:
• Position (float3 – slot 0)
• Normal (float3 – slot 0)
• Color
(float 3 – slot 1)
Vertex Buffer:
Input
Assembler
Primitive Topology:
Triangle List
Slot 0:
3F A4 91 8C 7A 42 B9 6F 73 E9 37 FF …
Slot 1:
2E 94 BB 6C 5A 47 F9 FE 26 C7 4A 72 …
Index Buffer:
0 4 8 0 1 3 5 3 6 10 2 4 3 7 5 2 14 8 23 11 9 4 …
Output (Vertices):
• Position 3F A4 91 8C 7A 42
• Normal 89 6F 73 E9 37 FF
• Color
2E 94 BB 6C 5A 47
• Vertex ID:
0
• Primitive ID:
0
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Input Assembler (IA)
Die Input Assembler Einheit ist dafür verantwortlich, der restlichen
Pipeline Geometriedaten (z.B. Linien, Dreiecke) zur Verfügung zu stellen.
• Sie liest benutzergefüllte Speicherblöcke und
– weiß anhand des gesetzten Input Layout wie diese Daten zu interpretieren sind
– erstellt daraus eine Menge von geometrischen Primitiven, abhängig vom gesetzten
Primitivtyp (D3D10_PRIMITIVE_TOPOLOGY)
– Stellt die assemblierten Primitive den folgenden Pipeline Einheiten zur Verfügung
• Die elementare Einheit sind dabei Eckpunkte (Vertices), die
verschiedene Eigenschaften haben können (z.B. Position, Farbe,
Normale, …)
• Die Input Assembler Einheit errechnet zusätzlich sogenannte „system
generated values“ für jedes Primitiv und stellt sie den folgenden
Shader
Einheiten
zur
Verfügung
(z.b
SV_VertexID,
SV_PrimitiveID, ...)
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Vertices
• Vertices können verschiedene Attribute haben:
–
–
–
–
Position
Normale
Farbe(n)
Textur-Koordinate(n)
• Meistens werden Vertices durch ein struct
repräsentiert:
– struct SimpleVertex
{
D3DXVECTOR4 Pos;
D3DXVECTOR2 UV;
};
// Position
// Texturkoordinaten
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Vertex Data
• Die Vertices werden der Reihe nach in einem Array
gespeichert:
SimpleVertex vertices[] =
{
{ D3DXVECTOR4 (-1.0f,
{ D3DXVECTOR4 ( 1.0f,
Einzelne
Vertices
{ D3DXVECTOR4 ( 1.0f,
{ D3DXVECTOR4 (-1.0f,
};
1.0f,
1.0f,
1.0f,
1.0f,
-1.0f,
-1.0f,
1.0f,
1.0f,
1.0f),
1.0f),
1.0f),
1.0f),
Position
D3DXVECTOR2
D3DXVECTOR2
D3DXVECTOR2
D3DXVECTOR2
(0.0f,
(0.0f,
(0.0f,
(1.0f,
0.0f)
1.0f)
1.0f)
1.0f)
},
},
},
}
Texturkoordinate
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Input Layout
• Der GPU werden die Daten als „Rohdaten“ in einem
Buffer übergeben.
• Damit die GPU die Daten richtig interpretieren kann
müssen wir daher ein Input-Layout definieren.
• Ein D3D10_INPUT_ELEMENT_DESC beschreibt darin
ein einzelnes Vertex-Attribut.
• Muss genau mit den Elementen eines Vertex
übereinstimmen!
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Input Layout
• D3D10_INPUT_ELEMENT_DESC hat folgende Felder:
Felder
Bedeutung
SemanticName
Name des Elements (muss mit dem Namen im Shader übereinstimmen)
SemanticIndex
Index der dafür genutzt werden kann, mehrfach den selben semantischen Namen
zu verwenden.
Format
Datentyp des Elements (DXGI_FORMAT).
InputSlot
Ganzzahl, die beschreibt von welchem Input Slot die Daten für dieses Element
gelesen werden sollen. In DX10 ist es möglich auf, dass die GPU auf mehrere
Vertex Buffer simultan zugreift.
AlignedByteOffset
Offset vom Beginn eines jeden Vertex zu diesem Element.
D3D10_APPEND_ALIGNED_ELEMENT kann zur automatischen Bestimmung des Offset
genutzt werden (sofern die Reihenfolge der Elemente im Vertex Layout und Input
Layout übereinstimmen).
InputSlotClass
D3D10_INPUT_PER_VERTEX_DATA oder D3D10_INPUT_PER_INSTANCE_DATA
InstanceDataStepRate
Anzahl der Instanzen für die dieselben Daten genutzt werden sollen.
0 für D3D10_INPUT_PER_VERTEX_DATA.
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Input Layout
• Definitions-Beispiel:
D3D10_INPUT_ELEMENT_DESC layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 16, D3D10_INPUT_PER_VERTEX_DATA, 0 },
};
UINT numElements = sizeof(layout) / sizeof(layout[0]);
• Zum Erstellen braucht man zusätzlich die Input Signature des
Vertex Shaders (hier: die Signatur einer technique):
D3D10_PASS_DESC PassDesc;
g_pTechnique->GetPassByIndex( 0 )->GetDesc( &PassDesc );
if (FAILED (g_pd3dDevice->CreateInputLayout (layout, numElements,
PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize, &g_pVertexLayout)))
return FALSE;
• Verwenden kann man das Input Layout anschließend mit:
g_pd3dDevice->IASetInputLayout( g_pVertexLayout );
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Vertex Buffer
• Damit weiß die GPU wie die Daten zu interpretieren
sind. Was noch fehlt sind die Daten an sich.
• Dafür müssen wir einen Vertex Buffer auf der GPU
anlegen und ihn mit unseren Daten füllen.
• Dafür benötigen wir zwei Strukturen:
– D3D10_BUFFER_DESC zur Beschreibung des Buffers
– D3D10_SUBRESOURCE_DATA zur Übergabe der Daten
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Vertex Buffer
• Beispiel:
// Create and fill description
D3D10_BUFFER_DESC bd;
::ZeroMemory (&bd, sizeof (bd));
bd.Usage = D3D10_USAGE_DEFAULT;
bd.ByteWidth = sizeof (SimpleVertex) * numVertices;
bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
// Define initial data
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = vertices;
// Create Buffer
if (FAILED (pd3dDevice->CreateBuffer (&bd, &InitData, &g_pVertexBuffer)))
return FALSE;
// Set vertex buffer
UINT stride = sizeof (SimpleVertex);
UINT offset = 0;
pd3dDevice->IASetVertexBuffers (0, 1, &g_pVertexBuffer, &stride, &offset);
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Primitive Topology
• Jetzt verfügt die GPU über die Vertex-Daten und weiß
auch wie sie zu interpretieren sind.
• Was noch fehlt ist welche geometrischen Primitive wir
mit den Daten beschreiben.
2
4
0
1
• Beispiele:
–
–
–
–
D3D10_PRIMITIVE_TOPOLOGY_POINTLIST
D3D10_PRIMITIVE_TOPOLOGY_LINELIST
D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP
D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST
5
3
2
4
0
1
2
5
3
4
0
2
1
3
5
4
0
1
• Festlegen können wir die aktuelle Topologie mit:
3
D3D10_PRIMITIVE_TOPOLOGY pt = D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP;
g_pd3dDevice->IASetPrimitiveTopology (pt);
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
5
Rendern (Draw)
• Wenn Input Layout, Vertex Buffer und die Primitve
Topology gesetzt sind, können wir eine technique
anwenden und Daten „zeichnen“:
// Render
D3D10_TECHNIQUE_DESC techDesc;
g_pTechnique->GetDesc( &techDesc );
for( UINT p = 0; p < techDesc.Passes; ++p ) {
g_pTechnique->GetPassByIndex( p )->Apply(0);
g_pd3dDevice->Draw( 3, 0 );
}
Anzahl der zu
zeichnenden Vertices
Index des ersten
Vertex
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Index Buffer
• Das Anlegen funktioniert wie beim Vertex Buffer:
// Create
// Create data for the index buffer
DWORD indices[] =
{
3,1,0,
2,1,3,
};
UINT numInd = sizeof(indices) / sizeof(indices[0]);
// Create and fill description
D3D10_BUFFER_DESC bd;
bd.Usage = D3D10_USAGE_DEFAULT;
bd.ByteWidth = sizeof( DWORD ) * numInd;
bd.BindFlags = D3D10_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = 0;
bd.MiscFlags = 0;
// Define initial data
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = indices;
// Create Buffer
hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pIndexBuffer );
if( FAILED(hr) )
return hr;
// Render
Einziger
Unterschied
// Set index buffer
g_pd3dDevice->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 );
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Rendern (DrawIndexed)
• Beim Rendern ändert sich lediglich der Draw-Befehl:
…
pd3dDevice->DrawIndexed( 6 , 0 , 0 );
…
Anzahl der zu
zeichnenden Indizes
Index des ersten
Vertex
Erster zu zeichnender
Index
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Vertex Shader
• Programmierbar!
• Berechnungen pro Vertex:
– Transformationen
– (Beleuchtung)
Input
Assembler (IA)
Vertex Buffer
Vertex
Shader (VS)
Texture/Buffer
Geometry
Shader (GS)
Texture/Buffer
• Input:
Stream
Output (SO)
– Vertex
• Output:
– Vertex
• Lesen vom Speicher möglich
Index Buffer
Buffer
Memory
Setup /
Rasterizer (RS)
Pixel
Shader (PS)
Texture/Buffer
Depth
Output
Merger (OM)
Color
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Transformationen
• In der Computer-Graphik werden verschiedene
Koordinaten-Systeme verwendet:
(Lokale) Objekt-Koordinaten
World Transformation
(Globale) Welt-Koordinaten
View Transformation
Kamera-Koordinaten
Projection Transformation
Clipping-Koordinaten
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Transformationen
• Punkte und Vektoren werden in DirectX durch ZeilenVektoren in homogenen Koordinaten repräsentiert:
– Punkt: (x, y, z, 1)
– Vektor: (x, y, z, 0)
• Transformationen entsprechen 4x4-Matrizen:
lineare Transformationen
(Rotation / Skalierung)
x y z
x
y
 L11
L
12
w 
 L13

 t x
L21
L22
L23
ty
L31 0
L32 0

L33 0

t z 1
x'
y ' z ' w
Translation
 World   View   Projection 
z w 
  Transform  Transform  x'
Transform

 
 

y' z ' w'
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Geometry Shader
• Programmierbar!
• Berechnungen pro Primitiv:
– Erzeugen / Löschen von Primitiven
– Verändern von Primitiven
Input
Assembler (IA)
Vertex Buffer
Vertex
Shader (VS)
Texture/Buffer
Geometry
Shader (GS)
Texture/Buffer
• Input:
Stream
Output (SO)
– 1 Primitiv
• Output:
– k Primitive
• Lesen vom Speicher möglich
Index Buffer
Buffer
Memory
Setup /
Rasterizer (RS)
Pixel
Shader (PS)
Texture/Buffer
Depth
Output
Merger (OM)
Color
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Stream Out
• Aufgabe:
– Daten der Primitive können in
einen Buffer umgeleitet werden
• Steuerbar durch:
– SOSetTargets
Input
Assembler (IA)
Vertex Buffer
Vertex
Shader (VS)
Texture/Buffer
Geometry
Shader (GS)
Texture/Buffer
Index Buffer
Stream
Output (SO)
Buffer
Memory
Setup /
Rasterizer (RS)
Pixel
Shader (PS)
Texture/Buffer
Depth
Output
Merger (OM)
Color
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Setup / Rasterizer
• Aufgabe:
– Clipping + Culling
– Erzeugung von Fragmenten
– Dehomogenisierung
• Input:
Input
Assembler (IA)
Vertex Buffer
Vertex
Shader (VS)
Texture/Buffer
Geometry
Shader (GS)
Texture/Buffer
– 1 Primitiv
Stream
Output (SO)
• Output:
– n Fragmente
• Steuerbar durch:
– RSSetState
– RSSetViewports/ScissorRects
Index Buffer
Buffer
Memory
Setup /
Rasterizer (RS)
Pixel
Shader (PS)
Texture/Buffer
Depth
Output
Merger (OM)
Color
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Clipping + Culling
• Ergebnis der Transformationen ist ein Halbwürfel, der
den sichtbaren Bereich darstellt, d.h. nur alles was
innerhalb liegt ist sichtbar und muss gerastert werden:
– außerhalb liegende Primitive werden verworfen („Frustum Culling“)
– teilweise innerhalb liegende Primitive werden auf den Würfel
zugeschnitten („Clipping“)
– zusätzlich kann man optional auch all diejenigen Polygone verwerfen, von
denen die Rückseite (o. Vorderseite) zu sehen ist („Back-face Culling“)
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Erzeugung der Fragmente
• Beim Rasterisieren werden für die von den Primitiven
überdeckten Raster-Punkte Fragmente erzeugt:
• Die Attribute der Vertices (Farbe, Textur-Koordinaten,
Normale, etc.) werden dabei interpoliert:
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Pixel / Fragment Shader
• Programmierbar
• Berechnungen pro Fragment:
– Shading
– Texturing
Input
Assembler (IA)
Vertex Buffer
Vertex
Shader (VS)
Texture/Buffer
Geometry
Shader (GS)
Texture/Buffer
• Input:
Stream
Output (SO)
– 1 Fragment
• Output:
– 0 oder 1 Fragment
• Lesen vom Speicher möglich
Index Buffer
Buffer
Memory
Setup /
Rasterizer (RS)
Pixel
Shader (PS)
Texture/Buffer
Depth
Output
Merger (OM)
Color
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Output Merger
• Aufgabe:
– Depth- / Stencil-Tests
– Color Buffer Blending
• Input:
– 1 Fragment
Input
Assembler (IA)
Vertex Buffer
Vertex
Shader (VS)
Texture/Buffer
Geometry
Shader (GS)
Texture/Buffer
• Output:
– Mögliche Veränderung vom
Farb- und Tiefenwert
• Steuerbar durch:
– OMSetRenderTargets
– OMSetBlendState
– OMSetDepthStencilState
Index Buffer
Stream
Output (SO)
Buffer
Memory
Setup /
Rasterizer (RS)
Pixel
Shader (PS)
Texture/Buffer
Depth
Output
Merger (OM)
Color
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Wozu dient der Tiefenwert?
• Problem:
– Berechnung der korrekten Tiefen-Reihenfolge ist viel zu aufwendig
• Wie entscheidet man was vorne liegt, wenn die
Geometrie in beliebiger Reihenfolge gerendert wird?
– Beim Rendern wird sowohl ein Farb- als auch ein Tiefenwert gespeichert
– Das Überschreiben der Werte erfolgt abhängig vom Tiefenwert











2
2
2


2
2
2
2
2




2
2
2
2





2
2







2




















Frame Buffer
7
7 7
7 7 7
7 7 7 7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7






7




2
2
2
7

2
2
2
2
2
7
7


2
2
2
2
7
7



2
2
7
7
7


7
7
2
7
7
7

7
7
7
7
7
7
7









5 5 5 5
5 5 5
5 5
5
5
5
5
5
5



5


7




2
2
2
7

2
2
2
2
2
5
7


2
2
2
2
5
5



2
2
5
5
5
5

7
7
2
7
7
7

7
7
7
7
7
7
7









+ Neues Dreieck  Frame Buffer + Neues Dreieck  Frame Buffer
Anmerkung: Farb- und Tiefenwerte werden in unterschiedlichen Buffern gespeichert.
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Effect Techniques
• In DirectX legt man mit Hilfe einer Effect Technique
den Ablauf der Rendering-Pipeline fest.
• Gespeichert werden Effect Techniques und deren
„Details“ in einem separaten Effect-File (.fx).
• Mit der Funktion D3DX10CreateEffectFromFile
kann man ein Effekt-Objekt laden.
• Mit der Member-Funktion GetTechniqueByName
kann man anschließend ein handle auf eine einzelne
Effect Technique bekommen.
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
DXUT
• Die DirectX Utility Library (DXUT) vereinfacht die
Verwendung der Windows- und Direct3D-APIs.
• Hilfe bietet DXUT unter anderem beim
–
–
–
–
Erstellen von Fenstern
Erstellen eines Direct3D Device
Handling von Device und Window Events
usw.
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
DXUT
• Der Umgang mit DirectX und Windows wird mit Hilfe
von Callback-Funktionen geregelt:
– DXUTSetCallbackD3D10DeviceCreated:
Hier wird alles initialisiert, was nicht von der Größe des Fensters abhängt.
– DXUTSetCallbackD3D10SwapChainResized:
Hier wird alles initialisiert, was von der Größe des Fensters abhängt.
– DXUTSetCallbackD3D10SwapChainReleasing:
Hier muss alles freigegeben werden, was in OnSwapChainResized erstellt
wurde.
– DXUTSetCallbackD3D10DeviceDestroyed:
Hier muss alles freigegeben werden, was in OnDeviceCreated erstellt wurde.
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
DXUT
• Fortsetzung der Callback-Funktionen:
– DXUTSetCallbackD3D10FrameRender:
Hier wird die Szene gerendert.
– DXUTSetCallbackFrameMove:
Für Direct3D-unabhängige Aktualisierung der Szene vor dem Rendern.
– DXUTSetCallbackMsgProc:
Für das Handling von Window Messages.
– DXUTSetCallbackKeyboard:
Für das Handling von Keyboard-Eingaben.
– DXUTSetCallbackDeviceChanging:
Wird vor dem Erstellen vom Direct3D Device aufgerufen und kann somit dessen
Einstellungen ändern.
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
DXUT
• Zusätzliche Features:
– Kamera-Klassen
• CFirstPersonCamera
• CModelViewerCamera
(„First Person“)
(„Third Person“)
– Graphical User Interface
– Rendern von Text
– Device Settings Dialog
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Speicherfreigabe (DXUT)
• Auch auf der GPU immer daran denken, Speicher wieder
freizugeben, wenn man ihn nicht mehr braucht (z.B. für
Buffer, Input Layout, usw.).
• Unter DXUT geht das mit SAFE_RELEASE (Pointer).
• Wenn beim Beenden des Programms Objekte noch nicht
freigegeben wurden, erscheint im Debug-Modus folgende
Meldung:
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Referenzen
• The DirectX Software Development Kit
http://msdn.microsoft.com/en-us/library/bb219737.aspx
• Direct3D 10 Graphics (Programming Guide, Reference, Tutorials, Samples)
http://msdn.microsoft.com/en-us/library/bb205066.aspx
• DXUT Programming Guide
http://msdn.microsoft.com/en-us/library/bb173316.aspx
• DXUT Reference
http://msdn.microsoft.com/en-us/library/bb173249.aspx
• HLSL Programming Guide
http://msdn.microsoft.com/en-us/library/bb509635(VS.85).aspx
• HLSL Reference
http://msdn.microsoft.com/en-us/library/bb509638(VS.85).aspx
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Aufgabenblatt 2
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
Aufgabenblatt 2
• .obj Format
• Einfaches Rendering
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
.obj Format
• Entwickelt von Wavefront (später Alias|Wavefront,
später Alias, jetzt Autodesk)
• Entstanden in den 1980er Jahren als Teil von „The
Advanced Visualizer“
• ASCII Format
• De-facto Standard für Datenaustausch
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
.obj Format
• Enthält mindestens Positionen, optional auch
Normalen und UV-Koordinaten pro Vertex
• Ein Wert pro Zeile
– v 1 2 3 => Vertex-Position, x=1, y=2, z=3
– vn, vt, etc. bilden unabhängige Streams!
• Faces mit n Vertices
–
–
–
–
Indices in die einzelnen Streams, 1-basiert
f 1 2 3 => Positionen 0, 1, 2
f 1/1 2/1 3/2 => Positionen 0, 1, 2, UV-Koord. 0, 0, 1
f 1/1/1 2/1/2 3/2/3 => Positionen, UVs und Normalen
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
.obj Format
• Viele weitere Tokens möglich
–
–
–
–
mtllib: „Material Library“, Verweis auf .mtl-File
usemtl: „Use Material“
g: „Group“
…
• # beginnt Kommentar-Zeilen
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
.obj Parsing
• Einlesen mittels std::ifstream
• Erstes Token anschauen
– std::ifstream file(‚file.obj‛);
std::string tmp;
file >> tmp; // Lesen bis Leerzeichen/newline
if (tmp == ‚f‛) readF ();
else if (tmp == ‚v‛) readV ();
• Zeilenweise lesen
– std::string line;
std::getline(file, line);
std::istringstream str(line);
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
.obj Parsing
• Falls der Input-Stream 1/2/3 enthält
– int i;
stream >> i; // i == 1, stream.peek () == ‘/’
• Positionen (UVs, Normalen) in Arrays zwischenspeichern
– struct float3 { float x; float y; float z; };
std::vector<float3> p;
p.push_back (…);
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization
.obj Parsing
• Vorsicht: Bei .obj beginnen die Indices mit 1
– Negative Indices sind auch möglich, dann sollte das n-letzte
Element ausgewählt werden (ähnlich wie bei Python)
• Vorsicht: Textur-Koordinaten können mehr als 2
Komponenten enthalten
• Vorsicht: Auch f 1//1 2//2 3//3 möglich
• Vorsicht: Faces können mehr als 3 Vertices enthalten
– Als „Triangle Fan“ in Dreiecke zerlegen
3D Praktikum SS 2010 – Echtzeitgraphik in C++ und DirectX10
M. Chajdas, M. Treib, K. Bürger, Prof. Dr. R. Westermann
computer graphics & visualization

Documentos relacionados