Computergrafik

VBOs

GL Vertex Arrays | | Native VBOs

VBOs

VBO = Vertex Buffer Object

Ein VBO ist ein Container Objekt für Vertex Array oder Index Face Set.

VBOs sind im LGL Framework in der lglVBO Klasse abstrahiert.

Um einen VBO zu verwenden, müssen in den folgenden Code-Abschnitten die entsprechenden Änderungen vorgenommen werden:

Global

Ein VBO wird global instanziiert (bzw. im Abschnitt protected):

lglVBO vbo;

Init-Funktion

VBOs werden benutzt, um Geometrie effizient zu spezifizieren. Es gibt folgende Methoden, um in der Initialisierungs-Funktion einen VBO anzulegen:

1) Man fügt Vertices und Attribute hinzu, wie man es im Direct Mode gewohnt war. Die Vertices und Attribute werden aber nicht direkt über den Bus zur GPU geschickt, sondern einem Buffer (Vertex Array) hinzugefügt.

// fill VBO once with vertex and attribute data
vbo.lglBegin(LGL_TRIANGLES);
   vbo.lglColor(1, 0, 0, 0);
   vbo.lglVertex(-0.5,-0.5,0);
   vbo.lglColor(0, 1, 0, 0);
   vbo.lglVertex(0.5,-0.5,0);
   vbo.lglColor(0, 0, 1, 0);
   vbo.lglVertex(0,0.5,0);
vbo.lglEnd();

2) Spezifikation eines VBOs via Interleaved Vertex Array:

// dynamically create vertex buffer object (vbo)
// specify interleaved vertex array
static const float array[] =
{
    // component order:
    // x,y,z, r,g,b
    -0.5,-0.5,-1, 1,0,0,
    0.5,-0.5,-1, 0,1,0,
    0,0.5,-1, 0,0,1
};

// copy interleaved vertex array into vbo
// 3 vertices with according x,y,z components
// 3 additional components r,g,b for interleaved color attribute
// 0 additional components nx,ny,nz for interleaved normal attribute
// 0 additional components s,t,r for interleaved texture coordinate attribute
vbo.lglInterleavedVertexArray(LGL_TRIANGLES, array, 3, 3, 0, 0);

3) Laden eines VBOs aus einer OBJ Datei:

lglVBO *vbo = lglLoadObj("filename.obj");

Render-Funktion:

Beim Zeichnen in der Render-Funktion wird der VBO automatisch als zusammenhängender Speicherbereich zur GPU übertragen und dort gebuffert (gecached).

Dies ermöglicht die Wiederverwendung ohne nochmalige Übertragung, d.h. die Vertex-Arrays eines VBO können im Speicher der Grafikhardware resident gehalten werden, so dass nur noch der Befehl zum Zeichnen der entsprechenden Indices des VBO über den Bus geschickt werden muss:

// render VBO
lglRender(vbo);

Live Demo: VBO (T#1c)

GL Vertex Arrays | | Native VBOs

Options: