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
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
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
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
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
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
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
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;
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
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
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) };};
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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_
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
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 };};
To be continued…To be continued…