Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Computer graphics & visualization Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10.

Ähnliche Präsentationen


Präsentation zum Thema: "Computer graphics & visualization Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10."—  Präsentation transkript:

1 computer graphics & visualization Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10

2 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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

3 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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;

4 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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(); };

5 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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

6 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Dynamisches und statisches Binden Wenn die Funktion dynamisch zur Laufzeit ausgewählt werden soll, muss man die Funktion 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

7 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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, deshalb nennt man sie abstrakte Klasse. Davon abgeleitete Klassen sind ebenfalls abstrakt, sofern sie nicht alle pure virtual Funktionen implementieren.

8 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Mehrfachvererbung Im Gegensatz zu Java ist in C++ Mehrfach-Vererbung möglich: – class Foo { public: int a; } class Bar { public: int b; } class FooBar : public Foo, public Bar {…};  FooBar verfügt sowohl über a als auch über b!

9 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Ü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;

10 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Templates (Generische Programmierung) Templates sind „Programmgerüste“, die eine vom Datentyp unabhängige Programmierung ermöglichen. Beispiel: – template T getMax(T a, T b) { if (a (x, y);

11 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Standard Template Library (STL) Das Ganze geht auch mit Klassen. Beispiel sind die Template-Klassen der STL: – vector (dynamisch wachsendes lineares "Feld„) – list (doppelt verkettete Liste) – u.v.m. Beispiel: – vector v; v.push_pack(42);// fügt 42 am Ende hinzu cout << v.size() << endl;// liefert die Anzahl der Elemente cout << v[0] << endl;// [] liefert das erste Element v.pop_pack();// entfernt das letzte Element; Das aber nur als kurzer Einblick…

12 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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 sollte der Programmierer mit einer expliziten Typwandlung das gewünschte Verhalten herbeiführen.

13 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Datentyp-Umwandlungen in C++ Explizite Typwandlung (Teil 1) – Konvertierung verwandter Typen ( static_cast ) Beispiel: – float f = 3.14f; int i = static_cast ( 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 (rawData);

14 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Datentyp-Umwandlungen in C++ Explizite Typwandlung (Teil 2) – Konvertierung mit Prüfung zur Laufzeit ( dynamic_cast ) Beispiel: – void Foo(CBase *b) { if ( dynamic_cast ( 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 ;-)

15 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Datentyp-Umwandlungen in C++ Es gibt noch weitere Arten wie man casten kann: Beispiel: – float f=3.1415f;// Gleitkomma-Literale mit dem Suffix f oder F // sind vom Typ float, ansonsten vom Typ double – int i=(int)f;// C-style cast – int j=int(f);// 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. Durch diese Mächtigkeit und die Unauffälligkeit der Schreibweise können diese Casts leicht zu Fehlern führen und sollten daher vermieden werden.

16 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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

17 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Präprozessor: Bedingte Übersetzung Mit Hilfe des Präprozessors kann man auch Macros definieren, z.B.: #define DEBUG// ohne Wert #define PI // 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“)

18 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Präprozessor: include-Guards Beispiel: – In den Headern “Foo.h” und “Bar.h” wird 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. Um dies zu verhindern, verwendet man Macros und bedingte Übersetzung. Foo.h Bar.h FooBar.h

19 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Präprozessor: include-Guards Beispiel “FooBar.h”: #ifndef FOO_BAR_H// Um Namenskonflikten zu verhindern wählt #define FOO_BAR_H// 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++!

20 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann „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

21 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Pixel Stage Vertex Stage User / Driver Rendering Pipeline Transform & Lighting Rasterisierer Texturing Blending/Ops Texture 3 Texture 2 Texture 1 Texture 0 Vertex Stream Fragment Stream

22 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Direct3D 10 Pipeline Die Pipeline besteht aus: – Programmierbaren Einheiten: Vertex Shader Geometrie Shader Pixel Shader – Fixed-Function Einheiten Input Assembler Stream Output Setup / Rasterizer Output Merger Input Assembler MemoryMemory Setup / Rasterizer Vertex Shader Geometry Shader Output Merger Pixel Shader Stream Output

23 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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.

24 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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;// Position D3DXVECTOR4 Color; // Farbe (RGBA) };

25 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Vertex Layout Mit Hilfe des Vertex Layouts kann man die Eingabedaten für die GPU definieren: 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 ) }, { 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 ) }, }; Bei einem statische angelegten Array kann man die Anzahl der Elemente berechnen: UINT numVertices = sizeof(vertices) / sizeof(vertices[0]); Einzelne Vertices PositionFarbe

26 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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.

27 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Input Layout D3D10_INPUT_ELEMENT_DESC hat folgende Felder: FelderBedeutung SemanticNameName des Elements (muss mit dem Namen im Shader übereinstimmen) SemanticIndexIndex der dafür genutzt werden kann, mehrfach den selben semantischen Namen zu verwenden. FormatDatentyp des Elements (DXGI_FORMAT). InputSlotGanzzahl, 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. AlignedByteOffsetOffset 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 InstanceDataStepRateAnzahl der Instanzen für die dieselben Daten genutzt werden sollen. 0 für D3D10_INPUT_PER_VERTEX_DATA.

28 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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 );

29 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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

30 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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 );

31 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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. Beispiele: – D3D10_PRIMITIVE_TOPOLOGY_POINTLIST – D3D10_PRIMITIVE_TOPOLOGY_LINELIST – D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP – D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST Festlegen können wir die aktuelle Topologie mit: D3D10_PRIMITIVE_TOPOLOGY pt = D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP; g_pd3dDevice->IASetPrimitiveTopology( pt ); Primitive Topology

32 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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 GetPassByIndex( p )->Apply(0); g_pd3dDevice->Draw( 3, 0 ); // DrawIndexed } Anzahl der zu zeichnenden Vertices Index des ersten Vertex

33 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Index Buffer Das Anlegen funktioniert wie beim Vertex Buffer: // 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; // Set index buffer g_pd3dDevice->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 ); Einzige Ausnahme

34 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Rendern (DrawIndexed) Beim Rendern ändert sich lediglich der Draw-Befehl: … g_pd3dDevice->DrawIndexed( 6, 0, 0 ); … Hinweis: Der letzte Parameter kann auch negativ sein. Anzahl der zu zeichnenden Indizes Index des ersten Vertex Erster zu zeichnender Index

35 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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.

36 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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.

37 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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.

38 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann DXUT Zusätzliche Features: – Kamera-Klassen CFirstPersonCamera(„First Person“) CModelViewerCamera(„Third Person“) – Graphical User Interface – Rendern von Text – Device Settings Dialog

39 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann 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:

40 computer graphics & visualization 3D Praktikum WS08/09 – Echtzeitgraphik in C++ und DirectX10 K. Bürger, R. Fraedrich, Prof. Dr. Westermann Referenzen The DirectX Software Development Kit Direct3D 10 Graphics (Programming Guide, Reference, Tutorials, Samples) DXUT Programming Guide DXUT Reference


Herunterladen ppt "Computer graphics & visualization Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10."

Ähnliche Präsentationen


Google-Anzeigen