VerticesWie die Überschrift schon vermuten lässt, werden wir uns zuerst mit den Vertices beschäftigen. Vertices ist zunächst einmal der Plural von Vertex - deswegen auch VertexBuffer. Aber was ist nun ein Vertex. Ein Vertex ist vom Prinzip her ein Punkt im Raum, an dem sich zwei Kanten treffen (z. B. die Spitze eines Dreiecks). Das heißt, ein Vertex hat zumindest drei Raumkoordinaten (x, y, z). Das ist aber noch nicht alles. In Direct3D kann ein Vertex noch viele weitere Eigenschaften haben, so zum Beispiel eine Farbe oder Texturinformationen.Vertex-FormateGenau für diese Zwecke sind in DirectX verschiedene Strukturen definiert, da nicht zwangsläufig alle Angaben enthalten sein müssen. In der folgenden Tabelle sind einige Strukturen aufgeführt und mit einer kleinen Erklärung der Unterschiede versehen. Doch zunächst noch eine kleine Beschreibung der dort gebrauchten Begriffe: |
3D-Koordinaten: 3D-Koordinaten heißt, dass der Vertex mindestens drei Felder für die x-, y- und z-Koordinate hat. Dabei handelt es sich um Raumkoordinaten, die noch nicht in für den Bildschirm passende Koordinaten umgewandelt wurden. Normale: Die Normale ist die Gerade, die man senkrecht auf eine Ebene stellen könnte, so dass sie immer einen Rechten Winkel zu der Ebene einnimmt (siehe Bild links). Die Normale kann ebenso für Geraden und Punkte konstruiert werden.
Es gibt natürlich noch einige weitere Formate, deren Funktion sich an Hand der Tabelle aber recht einfach erschließen sollte. Außerdem gibt es noch die Möglichkeit, eigene VertexBuffer-Formate zu definieren.
Aktualisierung der InitializeGraphics-MethodeIn der InitializeGraphics-Methode hat sich natürlich einiges getan. Hier noch einmal der Code-Ausschnit:Listing 5.1 - VertexBuffer.cs:
In Zeile 11 wurde zunächst ein Objekt vom Typ VertexBuffer deklariert, welches später die Vertices für das Quadrat enthalten wird. In Zeile 30 wird das Objekt dann schließlich erstellt. Das Objekt bekommt dabei 6 Parameter übergeben. VertexBuffer können immer nur Vertices eines Typs enthalten - und diesen Typ geben wir mit dem ersten Parameter an. Der zweite Parameter gibt an, wieviele Vertices der Buffer maximal aufnehmen kann. Normalerweise ist dies auch gleich der Anzahl der tatsächlich gespeicherten Vertices. Der dritte Parameter ist der Gerätekontext und der vierte Parameter besteht aus zahlreichen Flags zur Vertexverarbeitung. Von diesen zahlreichen Optionen brauchen wir aber erstmal keine. Wer mehr Interesse hat, sollte sich an dieser Stelle die SDK-Hilfe zu Gemüte ziehen.An fünfter Stelle wird nocheinmal der Typ der Vertices übergeben. Das liegt daran, dass man auch eigene Vertex-Strukturen definieren kann. Also nicht wundern, dass es zweimal vorkommt. Und der letzte Parameter beschäftigt sich noch mit der Speicherung der Vertices. In unserem Fall reicht aber der Standardwert Pool.Default. In Zeile 31 wird noch ein EventHandler erstellt, der OnCreateVertexBuffer nach der Erstellung aufruft. Selbiges passiert auch einmal von Hand in der darauf folgenden Zeile. VertexBuffer befüllen
So, dass wars eigentlich auch schon zur Erstellung des VertexBuffers. Aber wir wollen den VertexBuffer auch gleich mal
noch mit Daten füttern. Dazu noch einmal folgender Codeausschnitt zur Erinnerung: |
Listing 5.2 - VertexBuffer.cs:
|
In Zeile 44 erstellen wir eine Referenz auf einen
GraphicStream, indem wir den VertexBuffer
vor Veränderungen von anderer Stelle sperren. Die drei Parameter geben dabei Anfang und Größe des zu sperrenden Bereichs
an sowie einige weitere Flags. 0 an zweiter Stelle sperrt den ganzen VertexBuffer. Anschließend wird ein CustomVertex.TransformedColored-Array erstellt, welches die Informationen zu einzelnen Vertices enthalten wird. Dieses Array wird anschließend befüllt. Die X, Y und Z-Parameter geben natürlich die bereits in Bildschirmkoordinaten übersetzen Koordinaten des Objekts an. Rhw wird passend auf 1 gesetzt (wird mal wieder nicht benötigt) und Color gibt noch die Farbe des Vertex an. Zwischen je zwei verbundenen Vertices werden dann später die Farben ineinander übergeblendet. In Zeile 77 wird das Array dann noch in den VertexBuffer geschrieben um anschließend noch die Sperre des VertexBuffers aufzuheben. Im nächsten Unterkapitel werden wir dann den VertexBuffer auf den Bildschirm zaubern - also wieder schnell weiterlesen. |