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