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.
Hinweis
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 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Montag, 29. August 2011