Tipp 0472
|
Vertex-Buffer
|
|
|
Autor/Einsender: Datum: |
|
Alexander Csadek 21.11.2005 |
|
Entwicklungsumgebung:
DirectX-Version: |
|
VB 6
DirectX 8 |
|
|
Warum einen Vertex-Buffer verwenden, wenn die Daten der Vertexe in einem VB-Array liegen,
das dann an Direct3D
zum Rendern übergeben
werden kann.
|
Vertexe liegen im Hauptspeicher (RAM). Jedes Mal, wenn die Vertexe gerendert werden, müssen diese erst über den
AGP Port (bzw. PCI Port) zur Grafikkarte. Bei ein paar Vertexen ist dies nicht weiter schlimm, aber bei ein paar
tausend oder hunderttausend sieht das schon anders aus. Dazu kommt noch, dass diese Vertexe aus dem VB-Array
von DirectX
noch in einen internen Vertex-Buffer umkopiert werden. Es wäre also besser, wenn die Vertexe gleich im Videospeicher liegen
würden, und das geht mit dem Vertex-Buffer.
|
Ein Vertex-Buffer ist ein Speicherbereich im Videospeicher, in dem die Daten der Vertexe liegen. Die Zugriffsart auf den
Vertex-Buffer kann noch eine weitere Verbesserung der Geschwindigkeit bringen.
|
Wie geht das nun?
|
Zunächst wird das Vertex-Format definiert, damit das VB-Array befüllt,
und anschließend ein Vertex-Buffer erzeugt.
|
|
|
Public vxbVertexBuffer As Direct3DVertexBuffer8
Set vxbVertexBuffer = _
gD3DDevice8.CreateVertexBuffer(Len(cvx) * 60, _
D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED)
|
|
|
In diesem Fall ist cvx der Vertex-Datentyp und 60 Vertexe sollen in den
Vertex-Buffer. Daher wird die Länge
des Datentyps mit der Anzahl der Vertexe multipliziert. DirectX weiss nun, dass 60 Vertexe mit der Länge des Vertex-Format
in den Vertex-Buffer kommen.
|
Die Art, wie auf den Vertex-Buffer zugegriffen wird, gibt DirectX die Möglichkeit
sich den besten
Platz im Speicher zu nehmen. Ich habe mich für WriteOnly entschieden, weil ich in dem Beispiel die Vertex-Daten
aus dem Vertex-Buffer nicht mehr auslesen möchte (hat nichts mit dem rendern zu tun). Dann wird
DirectX noch mitgeteilt,
in welches Format die Vertex-Daten haben, und dass DirectX die Verwaltung managen soll (in diesem Fall würde das bedeuten,
dass selbst wenn der 3D-Device verloren geht, die Vertex-Daten noch da wären und nicht neu geladen werden
müssen). In der DirectX-MSDN, sind alle Flags genau
beschrieben.
|
Nun werden die Vertex Daten in den Vertex-Buffer geladen.
|
|
|
D3DVertexBuffer8SetData vxbVertexBuffer, 0, Len(cvx) * 24, _
0, vxWand(0)
D3DVertexBuffer8SetData vxbVertexBuffer, Len(cvx) * 24, _
Len(cvx) * 6, 0, vxBoden(0)
D3DVertexBuffer8SetData vxbVertexBuffer, Len(cvx) * 30, _
Len(cvx) * 6, 0, vxHimmel(0)
D3DVertexBuffer8SetData vxbVertexBuffer, Len(cvx) * 36, _
Len(cvx) * 24, 0, vxHorizont(0)
|
|
|
Der erste Parameter ist der Vertex-Buffer selbst, dann kommt die Startposition in Bytes, ab der die Daten geschrieben, und die Anzahl der Bytes, die geschrieben werden sollen. Ein weiterer Verwendungsflag könnte als nächster Parameter
angegeben werden, und als Letztes kommt die Quelle der Vertex-Daten.
|
Damit nun DirectX weiss, woher die Vertex-Daten kommen,
wird ein sogenannter Daten Kanal (Stream Source) gesetzt.
|
|
|
gD3DDevice8.SetStreamSource 0, vxbVertexBuffer, Len(cvx)
|
|
|
Nun weiss DirectX, dass die Daten über den Kanal 0 aus dem Vertex-Buffer kommen und wie lange ein Vertex in Bytes ist.
Wenn sich die Vertexe nicht ändern, dann muss SetStreamSource nicht im BeginScene und EndScene
aufgerufen werden.
Beim Rendern ist die DrawPrimitive-Methode des 3D-Device zu
verwenden.
|
|
|
gD3DDevice8.DrawPrimitive D3DPT_TRIANGLELIST, 30, 2
|
|
|
Der vorletzte Parameter gibt an, ab welchem Vertex aus dem Vertex-Buffer die Daten gerendert werden
sollen, und der letzte
Parameter gibt an, wie viele Primitiv ihr gerendert haben wollt.
|
Wichtig: Bei D3DPT_TRIANGLELIST hat ein Primitiv 3 Vertexe.
|
|
|
Um dieses Beispiel ausführen zu können, wird die DirectX 8 for Visual Basic Type Library
benötigt (siehe dazu die Erläuterungen in der DirectX-Rubrik).
|
|
Windows-Version |
95 |
|
|
98 |
|
|
ME |
|
|
NT |
|
|
2000 |
|
|
XP |
|
|
Vista |
|
|
Win
7 |
|
|
|
VB-Version |
VBA 5 |
|
|
VBA 6 |
|
|
VB 4/16 |
|
|
VB 4/32 |
|
|
VB 5 |
|
|
VB 6 |
|
|
|
|
Download (202 kB)
|
Downloads bisher: [ 313 ]
|
|
|