32
3D-Grafik mit 3D-Grafik mit der TriBase- der TriBase- Engine Engine Universität zu Köln Universität zu Köln Softwaretechnologie II WS 11/12 Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert Referentin: Nadya Steinert

3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Embed Size (px)

Citation preview

Page 1: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

3D-Grafik mit der 3D-Grafik mit der TriBase-EngineTriBase-Engine

Universität zu KölnUniversität zu Köln

Softwaretechnologie II WS 11/12Softwaretechnologie II WS 11/12

Dozent: Prof. Dr. M. ThallerDozent: Prof. Dr. M. Thaller

Referentin: Nadya Steinert Referentin: Nadya Steinert

Page 2: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Automatische Initialisierung von Automatische Initialisierung von Direct3DDirect3D

Statusänderungen minimierenStatusänderungen minimieren

TexturverwaltungTexturverwaltung

Vertex- und Indexbuffer einfacher Vertex- und Indexbuffer einfacher erstellenerstellen

D3DX-Effekte leichter verwaltenD3DX-Effekte leichter verwalten

Page 3: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Die Klasse Die Klasse tbDirect3DtbDirect3D Dies ist eine Singleton-Klasse, von der nur eine Instanz Dies ist eine Singleton-Klasse, von der nur eine Instanz

erzeugt werden kannerzeugt werden kann

Sie verkörpert die vorher benannten FunktionenSie verkörpert die vorher benannten Funktionen

Die Funktion Die Funktion tbConfigDialog tbConfigDialog sammelt Informationen über die sammelt Informationen über die Direct3D-Einstellungen:Direct3D-Einstellungen:

Adapter, Videomodi, Oberflächenformate usw.Adapter, Videomodi, Oberflächenformate usw.

Die Methode Die Methode tbDirect3D:: Init tbDirect3D:: Init initialisiert Direct3D und initialisiert Direct3D und erstellt das Fenster; ihr werden die erstellt das Fenster; ihr werden die tbConfigtbConfig-Struktur und -Struktur und Fenstertitel und -icon übergebenFenstertitel und -icon übergeben

Die Die Exit- Exit- Methode setzt alle Texturen zurück und löscht alle Methode setzt alle Texturen zurück und löscht alle Direct3D-SchnittstellenDirect3D-Schnittstellen

Page 4: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendeklaration- Klassendeklaration- VariablenVariablen

m_bInitialized m_bInitialized (BOOL) – am Anfang und nach Herunterfahren (BOOL) – am Anfang und nach Herunterfahren FALSE;FALSE; Variable verhindert mehrfaches Aufrufen der Init-FunktionVariable verhindert mehrfaches Aufrufen der Init-Funktion

Zwei ZeigerZwei Zeiger für diefür die Schnittstellen Schnittstellen IDirect3D9 IDirect3D9 und und IDirect3DDevice9IDirect3DDevice9 Die Die D3DCAPS9-D3DCAPS9-Struktur des verwendeten Gerätes speichernStruktur des verwendeten Gerätes speichern Eine Eine HWND-HWND-Variable für das FensterVariable für das Fenster m_bOwnWindowm_bOwnWindow (BOOL) falls der Benutzer eigenes Fenster (BOOL) falls der Benutzer eigenes Fenster

verwendetverwendet Für Kapselung der Methoden SetRenderState, GetRenderState, Für Kapselung der Methoden SetRenderState, GetRenderState,

SetTextureStageState usw. braucht man Tabellen; DWOR- und SetTextureStageState usw. braucht man Tabellen; DWOR- und float-Versionfloat-Version

Ein Array vom Typ Ein Array vom Typ PDIRECT3DBASETEXTURE9 PDIRECT3DBASETEXTURE9 mit 8 Elementen mit 8 Elementen speichert die eingesetzten Texturen speichert die eingesetzten Texturen

m_vScreenSize m_vScreenSize (tbVector2) speichert die Größe des Bildpuffers in (tbVector2) speichert die Größe des Bildpuffers in PixelnPixeln

Page 5: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendeklaration- Klassendeklaration- MethodenMethoden

Init-Init-Methode erwartet zuerst einen Zeiger auf Methode erwartet zuerst einen Zeiger auf tbConfig tbConfig , , erstellt ein Fenster und initialisiert die erstellt ein Fenster und initialisiert die IDirect3DDevice9-IDirect3DDevice9-Schnittstelle; dann ein Fenstername, ein HWND-Parameter Schnittstelle; dann ein Fenstername, ein HWND-Parameter für Benutzerfenster, ein HICON-Parameter für Benutzerfenster, ein HICON-Parameter

Kapselungsmethoden für die verschiedenen States die mit Kapselungsmethoden für die verschiedenen States die mit den DWORD – und float- Tabellen arbeitenden DWORD – und float- Tabellen arbeiten

Verschiedene Hilfsmethoden: Verschiedene Hilfsmethoden: IsInitialized, GetWindow, IsInitialized, GetWindow, GetDirect3D usw.GetDirect3D usw.

Capture-Capture-Methode fragt den aktuellen Status der Methode fragt den aktuellen Status der Geräteschnittstelle abGeräteschnittstelle ab

Page 6: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Die Funktion Die Funktion tbDuConfigDialogtbDuConfigDialog

sie ruft den Konfigurationsdialog aufsie ruft den Konfigurationsdialog auf Füllt die tbConfig-Struktur aus, die die gesamte Füllt die tbConfig-Struktur aus, die die gesamte

Konfiguration von TriBase-Engine beinhaltetKonfiguration von TriBase-Engine beinhaltet

Page 7: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Die Die Init-Init-MethodeMethode Erzeugt das AnwendungsfensterErzeugt das Anwendungsfenster Eine IDirect3D9-SchnittstelleEine IDirect3D9-Schnittstelle Ruft CreateDevice auf, um eine Ruft CreateDevice auf, um eine

IDirect3DDevice9-Schnittstelle zu erhaltenIDirect3DDevice9-Schnittstelle zu erhalten Fragt die Gerätefähigkeiten( D3DCAPS9) abFragt die Gerätefähigkeiten( D3DCAPS9) ab Speichert den aktuellen Status der Tabellen Speichert den aktuellen Status der Tabellen

durch die Capture-Methodedurch die Capture-Methode Setzt Standard-Render und Sampler-StatesSetzt Standard-Render und Sampler-States Setzt m_bInitialized auf trueSetzt m_bInitialized auf true

Page 8: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Speichern des aktuellen Status mit Speichern des aktuellen Status mit Capture()Capture() Diese Methode geht alle Render-States, Diese Methode geht alle Render-States,

Sampler-States usw. durch, deren Werte in Sampler-States usw. durch, deren Werte in Tabellen gespeichert sind, fragt sie ab und Tabellen gespeichert sind, fragt sie ab und speichert siespeichert sie

Doppelte Statusänderungen werden verhindert Doppelte Statusänderungen werden verhindert indem die Set-Methoden prüfen, ob der Status indem die Set-Methoden prüfen, ob der Status schon gesetzt ist und wenn dass der Fall ist, wird schon gesetzt ist und wenn dass der Fall ist, wird sofort unterbrochensofort unterbrochen

// Wenn das Render-State schon gesetzt ist, direkt // Wenn das Render-State schon gesetzt ist, direkt abbrechenabbrechen

if(m_RS.adwRS[RS] == dwValue) return TB_OK;if(m_RS.adwRS[RS] == dwValue) return TB_OK;

Page 9: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Die Die Exit-Exit-Methode setzt alle Texturen, Index- Methode setzt alle Texturen, Index- und Vertex-Buffer zurück, gibt die zwei und Vertex-Buffer zurück, gibt die zwei Schnittstellen frei(D3D und D3DDevice)Schnittstellen frei(D3D und D3DDevice)

Methoden wie SetTextue() erhöhen den Methoden wie SetTextue() erhöhen den Zähler der ihr übergebenen Schnittstelle Zähler der ihr übergebenen Schnittstelle und müssen unbedingt zurückgesetzt und müssen unbedingt zurückgesetzt werden, damit keine Speicherlecks entstehnwerden, damit keine Speicherlecks entstehn

Um auf die Um auf die IDirect3DDevice9 zugreifen zu IDirect3DDevice9 zugreifen zu können, können, wird der ‚->‘-Operator überladenwird der ‚->‘-Operator überladen

PDIRECT3DDEVICE9 PDIRECT3DDEVICE9 operetor ->{return m_pD3DDevice;}operetor ->{return m_pD3DDevice;} D3D->DrawPrimitive() //direkt Methoden von D3D->DrawPrimitive() //direkt Methoden von

IDirect3DDevice9 aufrufenIDirect3DDevice9 aufrufen

Page 10: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

tbTextureManagertbTextureManager Sorgt dafür , dass keine Textur zwei Mal Sorgt dafür , dass keine Textur zwei Mal

geladen wirdgeladen wird Alle geladenen Texturen werden in einer Liste Alle geladenen Texturen werden in einer Liste

mit deren Dateinamen festgehaltenmit deren Dateinamen festgehalten Wenn eine bereits geladene Textur wieder Wenn eine bereits geladene Textur wieder

gefragt ist, wird der Referenzzähler der gefragt ist, wird der Referenzzähler der Texturschnittstelle erhöhtTexturschnittstelle erhöht

Wenn der Referenzzähler null erreicht , wird Wenn der Referenzzähler null erreicht , wird die Textur aus der Liste gelöschtdie Textur aus der Liste gelöscht

Texturen können aus verschiedenen Quellen Texturen können aus verschiedenen Quellen geladen werden: aus Speicher, einer geladen werden: aus Speicher, einer Ressource oder aus Ressource oder aus ZIP_ArchivZIP_Archiv

Page 11: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendefinition von Klassendefinition von tbTextureManagertbTextureManager

Es gibt eine Liste, wo alle Texturen eingetragen werdenEs gibt eine Liste, wo alle Texturen eingetragen werden jeder Textureintrag wird in die Struktur jeder Textureintrag wird in die Struktur tbTextureListEntry tbTextureListEntry

gespeichertgespeichert struct TRIBASE_API tbTextureListEntrystruct TRIBASE_API tbTextureListEntry {{ BOOLbExists;// Existiert diese Textur?BOOLbExists;// Existiert diese Textur? PDIRECT3DBASETEXTURE9pTexture;// Die TexturschnittstellePDIRECT3DBASETEXTURE9pTexture;// Die Texturschnittstelle characSourceFilename[256];// QuelldateinamecharacSourceFilename[256];// Quelldateiname intiWidth;// Breite der TexturintiWidth;// Breite der Textur intiDepth;// Tiefe der TexturintiDepth;// Tiefe der Textur intiHeight;// Höhe der TexturintiHeight;// Höhe der Textur intiNumMIPLevels;// Anzahl der MIP-Mapping-EbenenintiNumMIPLevels;// Anzahl der MIP-Mapping-Ebenen D3DFORMATFormat;// Oberflächenformat der TexturD3DFORMATFormat;// Oberflächenformat der Textur DWORDdwUsage;// VerwendungszweckDWORDdwUsage;// Verwendungszweck D3DPOOLPool;// SpeicherklasseD3DPOOLPool;// Speicherklasse DWORDdwFilter;// Bildfilter (beim Laden)DWORDdwFilter;// Bildfilter (beim Laden) DWORDdwMIPFilter;// MIP-Map-Filter (beim Laden)DWORDdwMIPFilter;// MIP-Map-Filter (beim Laden) D3DCOLORColorKey;// Color-Key (beim Laden)D3DCOLORColorKey;// Color-Key (beim Laden) };};

Page 12: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendefinition -Klassendefinition -VariablenVariablen

Für die Texturen wird eine nicht Für die Texturen wird eine nicht verkette Liste benutzt; der Zeiger verkette Liste benutzt; der Zeiger m_pTextureList zeigt auf eine m_pTextureList zeigt auf eine tbTextureListEntry-Struktur; tbTextureListEntry-Struktur; Speicher wird dynamischreserviertSpeicher wird dynamischreserviert

m_iListSize speichert die aktuelle m_iListSize speichert die aktuelle Größe der TexturlisteGröße der Texturliste

m_iNumTexture- Anzahl der m_iNumTexture- Anzahl der geladene Texturengeladene Texturen

Page 13: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendefinition- Klassendefinition- MethodenMethoden

Init-Init-Methode erwartet als Parameter die Ausgangsgröße der Methode erwartet als Parameter die Ausgangsgröße der Texturliste und reserviert genug SpeisherTexturliste und reserviert genug Speisher

SetListSizeSetListSize verändert die Listengröße, wenn z.B. kein Platz für verändert die Listengröße, wenn z.B. kein Platz für eine neue Textur da isteine neue Textur da ist

GetTextureIndex GetTextureIndex erwartet als Perameter eine erwartet als Perameter eine Texturschnitstelle, sucht sie in der Liste und liefert den Texturschnitstelle, sucht sie in der Liste und liefert den Texturindex zurückTexturindex zurück

GetNewIndex GetNewIndex liefert den nächsten freien Index in der Liste liefert den nächsten freien Index in der Liste zurück, wenn kein Platz -1; es wird nach dem ersten zurück, wenn kein Platz -1; es wird nach dem ersten Listeneintrag gesucht bei dem m_bExist FALSE istListeneintrag gesucht bei dem m_bExist FALSE ist

ReleaseTextureReleaseTexture erwartet auch eine Texturschnittstelle, sucht erwartet auch eine Texturschnittstelle, sucht die Textur und ruft die Textur und ruft Release Release auf; wenn Referenzzähler null, auf; wenn Referenzzähler null, Textur wird gelöschtTextur wird gelöscht

DeleteAllTexture DeleteAllTexture geht die gesamte Liste durch und ruft für geht die gesamte Liste durch und ruft für jede Textur so lange Release auf bis Referenzzähler nulljede Textur so lange Release auf bis Referenzzähler null

Page 14: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendefinition -Klassendefinition -MethodenMethoden

AddTextureToList AddTextureToList fügt eine Textur zur Liste hinzu, und fügt eine Textur zur Liste hinzu, und erweitert diese, wenn kein Platz mehr da isterweitert diese, wenn kein Platz mehr da ist

Load-Load-Methoden für Standard-, Würfel- und Volumentexturen; Methoden für Standard-, Würfel- und Volumentexturen; Für jeden Typ vier verschiedene Versionen, die erwarten Für jeden Typ vier verschiedene Versionen, die erwarten Dateiname, Speicheradresse,Ressourcenangabe, oder Dateiname, Speicheradresse,Ressourcenangabe, oder virtuelle Datei; Die ersten drei Methoden erzeugen eine virtuelle Datei; Die ersten drei Methoden erzeugen eine virtuelle Datei aus der Quelle und rufen die Vierte Version virtuelle Datei aus der Quelle und rufen die Vierte Version auf; sie haben den gleichen Namen und verschiedene auf; sie haben den gleichen Namen und verschiedene Parameter(immer zuerst die Quellangabe)Parameter(immer zuerst die Quellangabe)

Get-Get-Methoden bekommen die Parameter einer Textur und Methoden bekommen die Parameter einer Textur und durchsuchen die Liste nach einer Übereinstimmung, durchsuchen die Liste nach einer Übereinstimmung, passende Textur wird zurückgeliefert(Referenzzähler wird passende Textur wird zurückgeliefert(Referenzzähler wird erhöht); wenn Textur nicht vorhanden, wird die erhöht); wenn Textur nicht vorhanden, wird die entsprächende Load-Methode aufgerufenentsprächende Load-Methode aufgerufen

Page 15: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

tbVertexBuffer und tbVertexBuffer und tbIndexBuffertbIndexBuffer

Informationen zum Art des PuffersInformationen zum Art des Puffers Verwendungszweck: 0 ist Standard; Verwendungszweck: 0 ist Standard;

D3DUSAGE_DYNAMIC(dynamischer D3DUSAGE_DYNAMIC(dynamischer Puffer);D3DUSAGE_WRITEONLY(kein Puffer);D3DUSAGE_WRITEONLY(kein Lesezugriff;Lesezugriff;

Speicherklasse: die vier Flags Speicherklasse: die vier Flags D3DPOOL_DEFAULT,D3DPOOL_MANAGED,D3DD3DPOOL_DEFAULT,D3DPOOL_MANAGED,D3DPOOL_SYSTEMMEM und POOL_SYSTEMMEM und D3DPOOL_SCRATCHstehen zur AuswahlD3DPOOL_SCRATCHstehen zur Auswahl

Sperrmethode: 0, D3DLOCK_NOSYSLOCK, Sperrmethode: 0, D3DLOCK_NOSYSLOCK, D3DLOCK_DISCARD, D3DLOCK_NOOVERWRITE D3DLOCK_DISCARD, D3DLOCK_NOOVERWRITE und D3DLOCK_READONLY und D3DLOCK_READONLY

Page 16: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Funktionsweise von den Funktionsweise von den BuffernBuffern

Beim Initialisieren der Klasse gibt der Benutzer den Beim Initialisieren der Klasse gibt der Benutzer den Verwendungszweck und die Speicherklasse anVerwendungszweck und die Speicherklasse an

Die Größe des Index- und Vertex-Buffer kann eventuell Die Größe des Index- und Vertex-Buffer kann eventuell angepasst werdenangepasst werden

Beide Klassen fertigen sich intern eine Kopie des Beide Klassen fertigen sich intern eine Kopie des gesamten Puffers an; mit SetVertex und SetIndex kann gesamten Puffers an; mit SetVertex und SetIndex kann der Benutzer sie verändern, wenn die Veränderung der Benutzer sie verändern, wenn die Veränderung durchgeführt werden soll, wird Update() aufgerufendurchgeführt werden soll, wird Update() aufgerufen

Der veränderte Speicherbereich wird gesperrt und die Der veränderte Speicherbereich wird gesperrt und die Daten aus der internen Kopie werden in den Puffer kopiertDaten aus der internen Kopie werden in den Puffer kopiert

Bei D3DUSAGE_WRITEONLY wird nur aus der Kopie im Bei D3DUSAGE_WRITEONLY wird nur aus der Kopie im Systemspeicher gelesen und im Puffer nur geschrieben; Systemspeicher gelesen und im Puffer nur geschrieben; GetVertex() fragt Vertizes von der internen Kopie abGetVertex() fragt Vertizes von der internen Kopie ab

Page 17: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendefinition- Klassendefinition- Variablen(VertexBuffer)Variablen(VertexBuffer)

m_pVertexBuffer vom Typ m_pVertexBuffer vom Typ PDIRECT3SVERTEXBUFFER9PDIRECT3SVERTEXBUFFER9

m_pBuffer der auf die interne Kopie zeigt, vom Typ voidm_pBuffer der auf die interne Kopie zeigt, vom Typ void DWORDDWORD m_dwSize speichert die Größe des Puffers in Bytes m_dwSize speichert die Größe des Puffers in Bytes DWORDDWORD m_dwVertexSize- die Größe eines einzelnen Vertex m_dwVertexSize- die Größe eines einzelnen Vertex DWORDDWORD m_dwMaxVertices – Anzahl der Vertizes im Puffer m_dwMaxVertices – Anzahl der Vertizes im Puffer DWORDDWORD dwFVF : der Vertexformat, beim Indexbuffer dwFVF : der Vertexformat, beim Indexbuffer

m_IndexFormat (m_IndexFormat (D3DFMT_INDEX16 oder D3DFMT_INDEX32)D3DFMT_INDEX16 oder D3DFMT_INDEX32) DWORD m_dwUsage : Verwendungszweck des Puffers, DWORD m_dwUsage : Verwendungszweck des Puffers,

D3DUSAGE_WRIETEONLY ist immer gesetztD3DUSAGE_WRIETEONLY ist immer gesetzt D3DPOOL m_Pool: die Speicherklasse, in der sich der Vertex-Buffer D3DPOOL m_Pool: die Speicherklasse, in der sich der Vertex-Buffer

befindetbefindet

Page 18: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendefinition- Klassendefinition- Variablen(VertexBuffer)Variablen(VertexBuffer)

DWORD dwFirstVertex, dwLastVertex speichern DWORD dwFirstVertex, dwLastVertex speichern die Nummern des ersten und des letzten die Nummern des ersten und des letzten veränderten Vertex; SetVertex() setzt die veränderten Vertex; SetVertex() setzt die Variablen, um später den zu sperrenden Bereich Variablen, um später den zu sperrenden Bereich zu ermitteln; nach dem Sperren hat zu ermitteln; nach dem Sperren hat dwFirstVertex den höchst möglichen Wert und dwFirstVertex den höchst möglichen Wert und dwLastVertex 0dwLastVertex 0

DWORD m_dwCursor speichert die Nummer des DWORD m_dwCursor speichert die Nummer des nächsten Vertex, der mit AddVertex() gesetzt nächsten Vertex, der mit AddVertex() gesetzt wirdwird

Page 19: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendeklaration- Klassendeklaration- MethodenMethoden

Init()Init() generiert die IDirect3DVertexBuffer9-Schnittstelle und die generiert die IDirect3DVertexBuffer9-Schnittstelle und die interne Kopie; die erste Version der Methode erwartet die Größe interne Kopie; die erste Version der Methode erwartet die Größe des Vertex-Buffers, die Vertexgröße, den FVF-Bezeichner, des Vertex-Buffers, die Vertexgröße, den FVF-Bezeichner, Vervwendungszweck und SpeicherklasseVervwendungszweck und Speicherklasse

Die zweite Version erwartet einen bereits existierenden Vertex-Die zweite Version erwartet einen bereits existierenden Vertex-Buffer(PDirect3DVertexBuffer9) und die Größe eines Vertex; aus Buffer(PDirect3DVertexBuffer9) und die Größe eines Vertex; aus diesem wird die tbVertexBuffer- Instanz initialisiert; GetDesc() diesem wird die tbVertexBuffer- Instanz initialisiert; GetDesc() fragt die Beschreibung des Vertex-Buffers ab; erste Funktion fragt die Beschreibung des Vertex-Buffers ab; erste Funktion baut auf die zweite aufbaut auf die zweite auf

Exit()Exit() gibt die Schnittstelle und die interne Speicherkopie frei; gibt die Schnittstelle und die interne Speicherkopie frei; wird einmal vom Destruktor und einmal am Anfang von Init() wird einmal vom Destruktor und einmal am Anfang von Init() aufgerufenaufgerufen

SetVertex() SetVertex() erwartet die Nummer des zu setzenden Vertex(0 ist erwartet die Nummer des zu setzenden Vertex(0 ist der erste) und den Vertex selbst; der angegebene Vertex wird in der erste) und den Vertex selbst; der angegebene Vertex wird in die Speicherkopie geschrieben und m_dwFirstVertex und die Speicherkopie geschrieben und m_dwFirstVertex und m_dwLastVertex werden aktualisiertm_dwLastVertex werden aktualisiert

Page 20: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendeklaration- Klassendeklaration- MethodenMethoden

SetVertices() SetVertices() setzt mehrere Vertizes; erster Parameter: Index des setzt mehrere Vertizes; erster Parameter: Index des ersten zu setzenden Vertex; dann Anzahl der Vertizes und ersten zu setzenden Vertex; dann Anzahl der Vertizes und schließlich Zeiger auf die Vertizesschließlich Zeiger auf die Vertizes

AddVertex() AddVertex() fügte dem Vertex-Buffer einen neuen Vertex hinzu und fügte dem Vertex-Buffer einen neuen Vertex hinzu und liefert seinen Index zurück; die Nummer des nächsten Vertex ist im liefert seinen Index zurück; die Nummer des nächsten Vertex ist im m_dwCursorm_dwCursor

AddVertices()AddVertices() fügt gleich mehrere Vertizes hinzu, die im zweiten fügt gleich mehrere Vertizes hinzu, die im zweiten Parameter angegeben sind; Erster Parameter- die AnzahlParameter angegeben sind; Erster Parameter- die Anzahl

SetCursor()SetCursor() setzt den Vertexcursor auf den durch den Parameter setzt den Vertexcursor auf den durch den Parameter angegebenen Wert; wenn Vertex-Buffer voll Cursor wird per Hand angegebenen Wert; wenn Vertex-Buffer voll Cursor wird per Hand zurückgesetztzurückgesetzt

GetVertex() GetVertex() liefert den durch den Index angegebenen Vertexliefert den durch den Index angegebenen Vertex GetVertices() : GetVertices() : erste Parameter gibt den Index des ersten erste Parameter gibt den Index des ersten

abzufragenden Vertex an; 2. Parameter: Anzahl der abzufragenden abzufragenden Vertex an; 2. Parameter: Anzahl der abzufragenden Vertizes; dritter: Zeiger auf den Speicher Bereich, wo es hinkopiert Vertizes; dritter: Zeiger auf den Speicher Bereich, wo es hinkopiert werden sollwerden soll

Page 21: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendeklaration- Klassendeklaration- MethodenMethoden

Update()Update() schreibt die veränderte Vertizes in den schreibt die veränderte Vertizes in den Vertex-Buffer; biem dynamischen Puffer Sperflag Vertex-Buffer; biem dynamischen Puffer Sperflag D3DLOCK_DISCARD; m_dwFirstVertex und D3DLOCK_DISCARD; m_dwFirstVertex und m_dwLastVertex werden zurückgesetztm_dwLastVertex werden zurückgesetzt

Verschiedene Inline- MethodenVerschiedene Inline- Methoden

Page 22: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

tbEffecttbEffect Optionen zum zeichnen eines Objekts oder eins Materials Optionen zum zeichnen eines Objekts oder eins Materials

werden in eine Effekt-Datei gespeichert werdenwerden in eine Effekt-Datei gespeichert werden Der Benutzer kann selbst festlegen Welche Techniken Der Benutzer kann selbst festlegen Welche Techniken

benutzt werden oder überlässt das der Klassebenutzt werden oder überlässt das der Klasse Ein globales Effekt-Pool ermöglicht es , das verschiedene Ein globales Effekt-Pool ermöglicht es , das verschiedene

Effekte ihre Parameter teilen; wird in Init() erstelltEffekte ihre Parameter teilen; wird in Init() erstellt

Page 23: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendeklaration- Klassendeklaration- VariablenVariablen

LPD3DXEFFECT m_pEffect : die Effekt-LPD3DXEFFECT m_pEffect : die Effekt-SchnittstelleSchnittstelle

D3DXEFFECT_DESC m_Desc :die D3DXEFFECT_DESC m_Desc :die EffektbeschreibungEffektbeschreibung

BOOL m_bStateSaved: TRUE , wenn beim Aufruf BOOL m_bStateSaved: TRUE , wenn beim Aufruf von Begin() angegeben wurde, dass dewr von Begin() angegeben wurde, dass dewr aktuelle Status gespeichert werden sollaktuelle Status gespeichert werden soll

BOOL m_bCaptureOnFinish: TRUE; WENN BEIM BOOL m_bCaptureOnFinish: TRUE; WENN BEIM Beenden des Effekts automatisch Capture() Beenden des Effekts automatisch Capture() aufgerufen werden sollaufgerufen werden soll

Page 24: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Klassendeklaration - Klassendeklaration - MethodenMethoden

5 Init-Methoden: Initialisierung aus einem String , der den gesamten 5 Init-Methoden: Initialisierung aus einem String , der den gesamten Code enthält; aus einer virtuellen Datei; einer echten Datei, einem Code enthält; aus einer virtuellen Datei; einer echten Datei, einem Speicherbereich oder einer RessourceSpeicherbereich oder einer Ressource

Exit() Exit() löscht die Schnoittstellen und verringert die Referenzzähler der löscht die Schnoittstellen und verringert die Referenzzähler der TexturenTexturen

SetTechnique: SetTechnique: setzt eine Technik , die durch ihre Nummer angegeben setzt eine Technik , die durch ihre Nummer angegeben wird; gibt man -1 an, sucht die Methode die erste gültige Technik auswird; gibt man -1 an, sucht die Methode die erste gültige Technik aus

Begin()Begin() : erster BOOL-Parameter bestimmt, ob die Änderungen später : erster BOOL-Parameter bestimmt, ob die Änderungen später rückgängig gemacht werden sollen; der zweite BOOL-Parametergibt rückgängig gemacht werden sollen; der zweite BOOL-Parametergibt an, ob die internen Tabellen der Render-States, Texturschicht-State an, ob die internen Tabellen der Render-States, Texturschicht-State usw. in der tbDirect3D-Klasse aktualisiert werden sollenusw. in der tbDirect3D-Klasse aktualisiert werden sollen

Die beide Parameter werden in m_bStateSaved bzw. in Die beide Parameter werden in m_bStateSaved bzw. in m_bCaptureOnFinish gespeichert;Rückgabewert von Begin() ist die m_bCaptureOnFinish gespeichert;Rückgabewert von Begin() ist die Anzahl der benötigten Durchgänge für den EffektAnzahl der benötigten Durchgänge für den Effekt

End() End() beendet den Effektbeendet den Effekt Pass() Pass() aktiviert den durch seine Nummer angegebenen durchgang aktiviert den durch seine Nummer angegebenen durchgang

Page 25: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Ein BeispielEin Beispiel Die Wasseroberfläche wird in eine Gitter eingeteiltDie Wasseroberfläche wird in eine Gitter eingeteilt Die Höhe jedes Vertex wird einmal pro Frame aktualisiert und Die Höhe jedes Vertex wird einmal pro Frame aktualisiert und

hängt von der abgelaufene Zeit und von x- un z-position abhängt von der abgelaufene Zeit und von x- un z-position ab Wellen lassen sich durch Sinus-Funktionen simulierenWellen lassen sich durch Sinus-Funktionen simulieren Globale Variablen und Strukturen: zwei Strukturen, eine für die Globale Variablen und Strukturen: zwei Strukturen, eine für die

Wasser-Vertizes und eine für die SkyBox-VertizesWasser-Vertizes und eine für die SkyBox-Vertizes // Globale Variablen// Globale Variablen tbConfigg_Config;// KonfigurationsstrukturtbConfigg_Config;// Konfigurationsstruktur PDIRECT3DTEXTURE9g_pWaterTexture = NULL;// WassertexturPDIRECT3DTEXTURE9g_pWaterTexture = NULL;// Wassertextur PDIRECT3DCUBETEXTURE9g_pEnvMap = NULL;// UmgebungstexturPDIRECT3DCUBETEXTURE9g_pEnvMap = NULL;// Umgebungstextur tbEffect*g_pWaterEffect = NULL;// WassereffekttbEffect*g_pWaterEffect = NULL;// Wassereffekt tbEffect*g_pSkyBoxEffect = NULL;// Sky-Box-EffekttbEffect*g_pSkyBoxEffect = NULL;// Sky-Box-Effekt tbVertexBuffer*g_pWaterVB = NULL;// Wasser-Vertex-BuffertbVertexBuffer*g_pWaterVB = NULL;// Wasser-Vertex-Buffer tbIndexBuffer*g_pWaterIB = NULL;// Wasser-Index-BuffertbIndexBuffer*g_pWaterIB = NULL;// Wasser-Index-Buffer tbVertexBuffer*g_pSkyBoxVB = NULL;// Sky-Box-Vertex-BuffertbVertexBuffer*g_pSkyBoxVB = NULL;// Sky-Box-Vertex-Buffer tbIndexBuffer*g_pSkyBoxIB = NULL;// Sky-Box-Index-BuffertbIndexBuffer*g_pSkyBoxIB = NULL;// Sky-Box-Index-Buffer const intg_iResolution = 64;// Die Auflösung der Wasseroberflächeconst intg_iResolution = 64;// Die Auflösung der Wasseroberfläche floatg_fTime = 0.0f;// Globaler Zeitzählerfloatg_fTime = 0.0f;// Globaler Zeitzähler

Page 26: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

ProgramminitialisierungProgramminitialisierung Konfigurationsdialog wird aufgerufen und das Ergebnis wird Konfigurationsdialog wird aufgerufen und das Ergebnis wird

in g_Config gespeichertin g_Config gespeichert Danach wird die Danach wird die tbDitrect3-tbDitrect3-Klasse initialisiertKlasse initialisiert Ein Texturemanagerobjekt wird erstellt um die beiden Ein Texturemanagerobjekt wird erstellt um die beiden

Texturen zu ladenTexturen zu laden InitWater() und InitSkyBox() werden als nächstes aufgerufenInitWater() und InitSkyBox() werden als nächstes aufgerufen Gitterprinzip: es wird ein Statischer IndexBuffer erstellt, der Gitterprinzip: es wird ein Statischer IndexBuffer erstellt, der

mir den zu dritt gruppierten Indizes gefüllt wird; Die mir den zu dritt gruppierten Indizes gefüllt wird; Die Methode GetVertexIndex(DWORD x, DWORD y) findet den Methode GetVertexIndex(DWORD x, DWORD y) findet den Index jedes Vertex indem sie die Reihe mit der Anzahl Index jedes Vertex indem sie die Reihe mit der Anzahl Vertizes pro Reihe multipliziert und die Spalte dazu addiertVertizes pro Reihe multipliziert und die Spalte dazu addiert

InitWater(): InitWater(): Vertex- und Index-Buffer werden erstellt; Vertex- und Index-Buffer werden erstellt; IndexBuffer wird gefüllt; Texturen und Effekte werden IndexBuffer wird gefüllt; Texturen und Effekte werden aufgerufen aufgerufen

Page 27: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Die AnimationDie Animation Einmal pro Frame geht das Programm alle Einmal pro Frame geht das Programm alle

Vertizes durch und generiert sie neu, abhängig Vertizes durch und generiert sie neu, abhängig von position und Zeit; drei Funktionen erwarten von position und Zeit; drei Funktionen erwarten eine Positionsangabe und mit hilfe des eine Positionsangabe und mit hilfe des Zeitzählers liefern die Vertexposition(besonders Zeitzählers liefern die Vertexposition(besonders Höhe), Normalenvektor und Texturkoordinaten: Höhe), Normalenvektor und Texturkoordinaten: PositionProc(tbVector3 v), NormalProc() und PositionProc(tbVector3 v), NormalProc() und TextureProc()TextureProc()

UpdateWater() ruft diese Funktionen auf und UpdateWater() ruft diese Funktionen auf und füllt den VertexBufferfüllt den VertexBuffer

Die Render-Funktion: der Z-Buffer wird Die Render-Funktion: der Z-Buffer wird ausgeschaltetausgeschaltet

Page 28: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

ModelldateienModelldateien Sie sollen flexibel und offen für die Zukunft sein Sie sollen flexibel und offen für die Zukunft sein Flexibilität durch Chunks: jeder Chunk hat ein Flexibilität durch Chunks: jeder Chunk hat ein

Header(Beschreibung), gefolgt von den Daten , die Nach Header(Beschreibung), gefolgt von den Daten , die Nach Chunktyp interpretiert werden; die Größe der Daten ist im Chunktyp interpretiert werden; die Größe der Daten ist im Header angegeben, was erlaubt das unrelevante Chunks Header angegeben, was erlaubt das unrelevante Chunks einfach übersprungen werdeneinfach übersprungen werden

Struktur für ChunkHeader:Struktur für ChunkHeader: struct TRIBASE_API tbModelChunkHeaderstruct TRIBASE_API tbModelChunkHeader {{ tbModelChunkTypeChunkType;// Typ des ChunkstbModelChunkTypeChunkType;// Typ des Chunks DWORDdwDataSize;// Größe der Daten des ChunksDWORDdwDataSize;// Größe der Daten des Chunks ChunkType ist vom Typ enum; alle ChunkTypen beginnen mit ChunkType ist vom Typ enum; alle ChunkTypen beginnen mit

TB_CT_TB_CT_

Page 29: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Vertexdaten-Chunk: TB_CT_MODEL_VERTICESVertexdaten-Chunk: TB_CT_MODEL_VERTICES struct TRIBASE_API tbModelVerticesChunkHeaderstruct TRIBASE_API tbModelVerticesChunkHeader {{ DWORDdwFVF;// VertexformatDWORDdwFVF;// Vertexformat DWORDdwVertexSize;// Größe eines einzelnen VertexDWORDdwVertexSize;// Größe eines einzelnen Vertex DWORDdwNumVertices;// Anzahl der VertizesDWORDdwNumVertices;// Anzahl der Vertizes floatfBoundingSphereRadius;// Radius der umgebenden KugelfloatfBoundingSphereRadius;// Radius der umgebenden Kugel tbVector3vBoundingBoxMin;// Minimumpunkt des umgebenden QuaderstbVector3vBoundingBoxMin;// Minimumpunkt des umgebenden Quaders tbVector3vBoundingBoxMax;// Maximumpunkt des umgebenden QuaderstbVector3vBoundingBoxMax;// Maximumpunkt des umgebenden Quaders Indexdaten-Chunk Indexdaten-Chunk TB_CT_MODEL_INDICES TB_CT_MODEL_INDICES struct TRIBASE_API tbModelIndicesChunkHeaderstruct TRIBASE_API tbModelIndicesChunkHeader {{ D3DFORMATIndexFormat;// D3DFMT_INDEX16 oder D3DFORMATIndexFormat;// D3DFMT_INDEX16 oder

D3DFMT_INDEX32D3DFMT_INDEX32 DWORDdwIndexSize;// Größe eines IndexDWORDdwIndexSize;// Größe eines Index DWORDdwNumIndices;// Anzahl der IndizesDWORDdwNumIndices;// Anzahl der Indizes

Page 30: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

Effekt-Chunk TB_CT_MODEL_EFFECTS Effekt-Chunk TB_CT_MODEL_EFFECTS struct TRIBASE_API tbModelEffectHeaderstruct TRIBASE_API tbModelEffectHeader {{ characName[256];// Name des EffektscharacName[256];// Name des Effekts BOOLbAlphaBlended;// Mit Alpha-Blending rendern?BOOLbAlphaBlended;// Mit Alpha-Blending rendern? D3DPRIMITIVETYPEPrimitiveType;// Typ der PrimitivenD3DPRIMITIVETYPEPrimitiveType;// Typ der Primitiven DWORDdwStartIndex;// Wo mit dem Rendern anfangen?DWORDdwStartIndex;// Wo mit dem Rendern anfangen? DWORDdwNumPrimitives;// Wie viele Primitiven rendern?DWORDdwNumPrimitives;// Wie viele Primitiven rendern? DWORDdwMinIndex;// Kleinster verwendeter IndexDWORDdwMinIndex;// Kleinster verwendeter Index DWORDdwNumVertices;// Größter Index - Kleinster Index DWORDdwNumVertices;// Größter Index - Kleinster Index

+ 1+ 1 DWORDdwEffectCodeSize;// Größe des EffektquellcodesDWORDdwEffectCodeSize;// Größe des Effektquellcodes };};

Page 31: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert

To be continued…To be continued…

Page 32: 3D-Grafik mit der TriBase-Engine Universität zu Köln Softwaretechnologie II WS 11/12 Dozent: Prof. Dr. M. Thaller Referentin: Nadya Steinert