Computergrafik

VBOs

GL Vertex Arrays | | Mehrere VBOs

VBOs

VBOs sind im Framework in der lglVBO Klasse abstrahiert.

Es gibt zwei Methoden, um Geometrie zu spezifizieren:

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 (Array) hinzugefügt.

// declare VBO as member variable
lglVBO vbo;

...

// 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();

Zum Zeichnen wird der Buffer am Stück als Speicherbereich zur GPU übertragen und dort gebuffert (gecached). Dies ermöglicht die Wiederverwendung ohne nochmalige Übertragung:

// render VBO
lglRender(vbo);

2) Spezifikation eines VBOs via Interleaved Vertex Array:

lglVBO *vbo; // member variable

...

// dynamically create vertex buffer object (vbo)
vbo = new lglVBO();

// 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);

Gezeichnet wird wie folgt:

// render interleaved vertex array stored in VBO
lglRender(vbo);

Alternativ: Laden eines VBOs aus einer OBJ Datei:

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

Live Demo: VBO (T#1c)

GL Vertex Arrays | | Mehrere VBOs

Options: