Vertex Layout
Transcription
Vertex Layout
Bachelor Praktikum: Echtzeitgraphik in C++ und DirectX10 computer graphics & visualization Diese Woche... • Abschluss der C++‐Einführung: – Objektorientierung in C++ – Datentypen‐Umwandlung – Präprozessor • Einführung in DirectX – – – – Übertragung von Geometrie‐Daten an die GPU Festlegung der Topologie von Primitiven Rendern der Daten DXUT 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization struct • eigentlich nur ein anderer Name für class, außer dass standardmäßig alle Elemente public statt private sind. • struct wird daher vorwiegend für zusammen‐gesetzte Typen verwendet. • Beispiel: – struct Farbe { unsigned char r; unsigned char g; unsigned char b; } … Farbe f(255,255,0); f.r = 0; 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Vererbungslehre und Verwandtes • Vererbung funktioniert wie in Java, nur die Syntax ist etwas anders: – class SuperClass { public: void foo(); }; class SubClass : public SuperClass { public: void bar(); }; 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Dynamisches und statisches Binden • Im Gegensatz zu Java werden in C++ generell statisch gebunden: – class SuperClass { void foo(); }; class SubClass : public SuperClass { void foo(); }; … SubClass a; SuperClass *p = &a; p‐>foo(); // SuperClass::foo() wird aufgerufen 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Dynamisches und statisches Binden • Wenn die Funktion dynamisch zur Laufzeit ausgewählt werden soll, muss man die Funktion als virtual deklarieren: – class SuperClass { virtual void foo(); }; class SubClass : public SuperClass { virtual void foo(); }; … SubClass a; SuperClass *p = &a; p‐>foo(); // SubClass::foo() wird aufgerufen 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Abstrakte Klassen • Darüber hinaus kann man eine Funktion pure virtual deklarieren, d.h. die Funktion wird von der Klasse nicht implementiert: – virtual void foo() = 0; • In diesem Fall kann von der Klasse keine Instanz erzeugt werden. In diesem Fall spricht man von einer abstrakten Klasse. • Davon abgeleitete Klassen sind ebenfalls abstrakt, sofern sie nicht alle pure virtual Funktionen implementieren. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Mehrfachvererbung • Im Gegensatz zu Java ist in C++ Mehrfach‐Vererbung möglich: – class Foo { public: int a; } Bar Foo class Bar { public: int b; } FooBar class FooBar : public Foo, public Bar {…}; → FooBar verfügt sowohl über a als auch über b! 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Überladen von Operatoren • Ein weiterer Vorteil von C++ ist, dass Operatoren überladen werden können: – class Vec3 { … // subscript‐operator float &operator[](int k); // Addition Vec3 operator+(const Vec3 &v) const; … } … Vec3 v1(1,2,3); Vec3 v2(2,3,4); Vec3 v3 = v1 + v2; v3[2] = 0; // Anwendung des +‐Operators // Anwendung des []‐Operators 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Templates (Generische Programmierung) • Templates sind „Programmgerüste“, die eine vom Datentyp unabhängige Programmierung ermöglichen. • Beispiel: – template<typename T> T getMax(T a, T b) { if (a < b) return b; else return a; } float x = 1.0f; float y = 1.1f; float m = getMax<float>(x, y); 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Standard Template Library (STL) • Das Ganze geht auch mit Klassen. • Beispiel sind die Template‐Klassen der STL: – vector<T> – list<T> – u.v.m. (dynamisch wachsendes lineares "Feld„) (doppelt verkettete Liste) • Beispiel: – vector<int> v; v.push_pack(42); cout << v.size() << endl; cout << v[0] << endl; v.pop_pack(); // fügt 42 am Ende hinzu // liefert die Anzahl der Elemente // [] liefert das erste Element // entfernt das letzte Element; • Das aber nur als kurzer Einblick… 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Datentyp‐Umwandlungen in C++ • Implizite Typumwandlung – in C++ können fundamentale Datentypen in einer verblüffenden Anzahl von Möglichkeiten ineinander umgewandelt werden. – i.d.R. geben Compiler eine Warnung aus, wenn durch die Typumwandlung Information verloren gehen kann. • Beispiele: double → float, float → int, int → short, etc. • Hinweis: – Diese Warnungen sollten niemals ignoriert werden! – Stattdessen solltet ihr mit einer expliziten Typwandlung das gewünschte Verhalten herbeiführen. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Datentyp‐Umwandlungen in C++ • Explizite Typwandlung (Teil 1) – Konvertierung verwandter Typen (static_cast) • Beispiel: – float f = 3.14f; int i = static_cast<int> ( f ); // konvertiert 3.14 in 3 – Konvertierung nicht verwandter Typen (reinterpret_cast) • Beispiel: – char rawData[256]; … // hier werden die Rohdaten aus einer Datei gelesen … // da wir sicher wissen, dass es sich um int‐Werte handelt: int *data = reinterpret_cast<int*>(rawData); 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Datentyp‐Umwandlungen in C++ • Explizite Typwandlung (Teil 2) – Konvertierung mit Prüfung zur Laufzeit (dynamic_cast) • Beispiel: – void Foo(CBase *b) { if ( dynamic_cast<CDerived*> ( b ) != NULL) cout << “b IS of class CDerived!”; else cout << “b is NOT of class CDerived!” } – Konvertierung zur Entfernung des const‐Qualifiers (const_cast) • Ganz böse… deswegen kein Beispiel ;‐) 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Datentyp‐Umwandlungen in C++ • Es gibt noch weitere Arten wie man casten kann: • Beispiel: – float f=3.1415f; – int i=(int)f; – int j=int(f); // Gleitkomma‐Literale mit dem Suffix f oder F // sind vom Typ float, ansonsten vom Typ double // C‐style cast // function‐style cast • Diese Casts führen jede Konvertierung durch, die als Kombination aus static_cast, reinterpret_cast und const_cast ausgedrückt werden können. • Üblich zur Konvertierung von integrierten Datentypen (um das umständliche „static_cast“ zu vermeiden) • Bei anderen Typumwandlungen kann die Mächtigkeit dieser Operationen und die Unauffälligkeit der Schreibweise leicht zu Fehlern führen und sollten daher vermieden werden. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Präprozessor: Compiler‐Direktiven • Der Präprozessor wird vor dem Compiler‐Aufruf automatisch gestartet und bearbeitet den Quellcode durch Einfügen, Löschen und Ersetzen von Text. • Präprozessor‐Befehle fangen mit # an. • Häufigstes Beispiel: – Einfügen einer Header‐Datei aus dem aktuellen Verzeichnis: #include „MyClass.h“ #include „util/MyUtility.h“ – Einfügen einer Header‐Datei aus dem Include‐Verzeichnis des Compilers: #include <iostream> 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Präprozessor: Bedingte Übersetzung • Mit Hilfe des Präprozessors kann man auch Macros definieren, z.B.: #define DEBUG #define PI 3.14159 // ohne Wert // mit Wert • Macros ohne Wert werden für bedinge Übersetzung verwendet, z.B.: #ifdef DEBUG cout << „PI is defined as “ << PI; #endif • darüber hinaus gibt es auch #else und #ifndef („if not defined“) 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Präprozessor: include‐Guards • Beispiel: <iostream> – In den Headern “Foo.h” und “Bar.h” wird <iostream> inkludiert und eine Datei “FooBar.h” inkludiert wiederum diese beiden Header. – Da Klassen, Funktionen und Variablen nur einmal deklariert werden dürfen, führt dies zu einem Compiler‐Fehler. Foo.h Bar.h FooBar.h • Um dies zu verhindern, verwendet man Macros und bedingte Übersetzung. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Präprozessor: include‐Guards • Beispiel “FooBar.h”: #ifndef FOO_BAR_H #define FOO_BAR_H // Um Namenskonflikten zu verhindern wählt // man das Macro abhängig vom Klassennamen class Foobar { … }; #endif • Anmerkung: denselben Zweck erfüllt die Präprozessor Direktive #pragma once, allerdings gehört sie nicht zum Standard von C++! 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization „Fixed Function Pipeline“ • Für diese Woche nur so viel: – Input: Geometrische Primitive – Output: Bild wird auf Bildschirm ausgegeben • Überblick: – – – – Übertragung von Geometrie‐Daten an die GPU Topologie der Primitive festlegen Rendern der Daten DXUT 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Rendering Pipeline 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 SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Direct3D 10 Pipeline • Die Pipeline besteht aus: – Programmierbaren Einheiten • Vertex Shader • Geometrie Shader • Pixel Shader Input Assembler Vertex Shader Geometry Shader Stream Output – Fixed‐Function Einheiten • • • • Input Assembler Stream Output Setup / Rasterizer Output Merger Memory Setup / Rasterizer Pixel Shader Output Merger 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Input Assembler • Aufgabe: – Vertex Daten lesen/erzeugen • Input: – Vertex Buffer + Index Buffer • Output: – Vertices mit Attributen und Indices pro Vertex, Primitiv und Objekt • Steuerbar durch: – IASetVertexBuffers/SetIndexBuffer – IASetInputLayout – IASetPrimitiveTopology Vertex Buffer Input Assembler Index Buffer Vertex Shader Texture/Buffer Geometry Shader Texture/Buffer Stream Output Texture/Buffer Setup / Rasterizer Memory Pixel Shader Texture/Buffer Output Merger Depth Color 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Input Assembler Input Layout: • Position (float3 – slot 0) • Normal (float3 – slot 0) • Farbe (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 • Farbe 2E 94 BB 6C 5A 47 •Vertex ID: 0 •Primitive ID: 0 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. 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, die verschiedenste Eigenschaften haben können (z.B. Position, Farbe, Normale, …) • Die Input Assembler Einheit errechnet weiterhin zusätzliche 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 SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Vertex Layout • Vertices können verschiedene Attribute haben: – – – – Position Normale Farbe(n) Textur‐Koordinat(en) • Ein Vertex‐Layout definiert wie die Attribute im Speicher abgelegt werden. Meistens wird das Vertex‐ Layout durch ein struct repräsentiert: – struct SimpleVertex { D3DXVECTOR3 Pos; D3DXVECTOR4 Color; }; // Position // Farbe (RGBA) 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Vertex Layout • Mit Hilfe des Vertex Layouts definiert man die Eingabedaten für die GPU: SimpleVertex vertices[] = { { D3DXVECTOR3( ‐1.0f, 1.0f, ‐1.0f ), D3DXVECTOR4( 0.0f, 0.0f, 1.0f, 1.0f ) }, { D3DXVECTOR3( 1.0f, 1.0f, ‐1.0f ), D3DXVECTOR4( 0.0f, 1.0f, 0.0f, 1.0f ) }, Einzelne Vertices { D3DXVECTOR3( 1.0f, 1.0f, 1.0f ), D3DXVECTOR4( 0.0f, 1.0f, 1.0f, 1.0f ) }, { D3DXVECTOR3( ‐1.0f, 1.0f, 1.0f ), D3DXVECTOR4( 1.0f, 0.0f, 0.0f, 1.0f ) }, }; Position Farbe • Bei einem statische angelegten Array kann man die Anzahl der Elemente berechnen: UINT numVertices = sizeof(vertices) / sizeof(vertices[0]); 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Input Layout • Das Vertex Layout ist die Repräsentation der Daten im Hauptspeicher. • Der GPU werden die Daten aber als „Rohdaten“ in einem Buffer übergeben. • Damit die GPU die Daten richtig interpretieren kann müssen wir daher ein Input‐Layout definieren. • Das struct D3D10_INPUT_ELEMENT_DESC dient dazu ein einzelnes Vertex‐Attribut zu beschreiben. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. 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 SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Input Layout • Definitions‐Beispiel: D3D10_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }, }; UINT numElements = sizeof(layout) / sizeof(layout[0]); • Zum Erstellen braucht man zusätzlich die Input Signature der kompilierten Effect 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 SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. 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 SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Vertex Buffer • Beispiel: // Create and fill description D3D10_BUFFER_DESC bd; bd.Usage = D3D10_USAGE_DEFAULT; bd.ByteWidth = sizeof( SimpleVertex ) * numVertices; bd.BindFlags = D3D10_BIND_VERTEX_BUFFER; bd.CPUAccessFlags = 0; bd.MiscFlags = 0; // Define initial data D3D10_SUBRESOURCE_DATA InitData; InitData.pSysMem = vertices; // Create Buffer if( FAILED( g_pd3dDevice‐>CreateBuffer( &bd, &InitData, &g_pVertexBuffer ) ) ) return FALSE; // Set vertex buffer UINT stride = sizeof( SimpleVertex ); UINT offset = 0; g_pd3dDevice‐>IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset ); 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. 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 5 3 • Beispiele: – – – – D3D10_PRIMITIVE_TOPOLOGY_POINTLIST D3D10_PRIMITIVE_TOPOLOGY_LINELIST D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST 2 4 0 1 2 5 3 4 0 2 1 3 5 4 0 1 3 • Festlegen können wir die aktuelle Topologie mit: D3D10_PRIMITIVE_TOPOLOGY pt = D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP; g_pd3dDevice‐>IASetPrimitiveTopology( pt ); 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization 5 Rendern (Draw) • Wenn Input Layout, Vertex Buffer und die Primitve Topology gesetzt sind, können wir eine Effect 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 ); // DrawIndexed } Anzahl der zu zeichnenden Vertices Index des ersten Vertex 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Index Buffer • Das Anlegen funktioniert wie beim Vertex Buffer: // Create data for the index buffer DWORD indices[] = { Einzige 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; // Set index buffer g_pd3dDevice‐>IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 ); Ausnahme 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Rendern (DrawIndexed) • Beim Rendern ändert sich lediglich der Draw‐Befehl: … g_pd3dDevice‐>DrawIndexed( 6 , 0 , 0 ); … Anzahl der zu zeichnenden Indizes Index des ersten Vertex Erster zu zeichnender Index Hinweis: Der letzte Parameter kann auch negativ sein. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization Effect Techniques • In DirectX legt man mit Hilfe einer Effect Technique den Abauf der Rendering‐Pipeline fest. • Gespeichert werden Effect Techniques und deren „Details“ in einem separaten Effect‐File (mehr dazu nächste Woche). • Mit der Funktion D3DX10CreateEffectFromFile kann man ein Effekt‐Objekt laden. • Mit der Member‐Funktion GetTechniqueByName kann man anschließend einen Pointer auf eine einzelne Effect Technique bekommen. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization DXUT • Die DirectX Utility Library (DXUT) dient dazu die Verwendung der Windows‐ und Direct3D‐APIs zu vereinfachen. • Hilfe bietet DXUT unter anderem beim – – – – Erstellen von Fenstern Erstellen von einem Direct3D Device Handling von Device und Window Events usw. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. 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. – DXUTSetCallbackD3D10FrameRender : Hier wird die Szene gerendert. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization DXUT • Fortsetzung der Callback‐Funktionen: – DXUTSetCallbackFrameMove : Für Direct3D‐unabhängige Aktualisierung der Szene pro Frame vor dem Rendern. – DXUTSetCallbackMsgProc : Für das Handling von Window Messages. – DXUTSetCallbackKeyboard : Für das Handling von Keyboard‐Eingaben. – DXUTSetCallbackDeviceChanging : Wird vor dem Erstelln vom Direct3D Device aufgerufen und kann somit dessen Einstelungen ändern. 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization DXUT • Zusätzliche Features: – Kamera‐Klassen • CFirstPersonCamera („First Person“) • CModelViewerCamera („Third Person“) – Graphical User Interface – Rendern von Text – Device Settings Dialog 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. 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 vom Visual Studio folgende Meldung: 3D Praktikum SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. 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 SS2009 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann computer graphics & visualization