PDA

View Full Version : OpenGL Vertex Buffer Array/Object



Denarius
8th April 2010, 08:33
Hey,

I wanted to use the vertex buffer array or object from OpenGl, but I can't get it to work.

This is what I do:

I create a widget and setup the opengl stuff.



void Gui::GLWidget::initializeGL(){
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations

GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };

glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Setup The Ambient Light
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);

glEnable(GL_LIGHT1);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
}


Then I paint the stuff in here:



void Gui::GLWidget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0, 0.0, -30.0); // Move Left 1.5 Units And Into The Screen 6.0

world->render();
}

void Bfe::World::render(){
qreal timeElapsed = ((qreal)time.elapsed() / 1000.0);
time.restart();

camera->render();

heightMap->render(wireFrame);

for(QVector<Render::RenderObject *>::Iterator i = objects.begin(); i < objects.end(); i++)
{
(*i)->render();
}
}

//I start rendering the objects with my for loop, which is one cube at the moment. But it doesn't draw

Render::Cube::Cube(){
//Create the object matrix
// cube ///////////////////////////////////////////////////////////////////////
// v6----- v5
// /| /|
// v1------v0|
// | | | |
// | |v7---|-|v4
// |/ |/
// v2------v3
//
//
// TODO: Vertex Array doesn't work yet!

// vertex coords array
GLfloat vertices[] = {1,1,1, -1,1,1, -1,-1,1, 1,-1,1, // v0-v1-v2-v3
1,1,1, 1,-1,1, 1,-1,-1, 1,1,-1, // v0-v3-v4-v5
1,1,1, 1,1,-1, -1,1,-1, -1,1,1, // v0-v5-v6-v1
-1,1,1, -1,1,-1, -1,-1,-1, -1,-1,1, // v1-v6-v7-v2
-1,-1,-1, 1,-1,-1, 1,-1,1, -1,-1,1, // v7-v4-v3-v2
1,-1,-1, -1,-1,-1, -1,1,-1, 1,1,-1}; // v4-v7-v6-v5
this->vertices = &vertices[0];
// normal array
GLfloat normals[] = {0,0,1, 0,0,1, 0,0,1, 0,0,1, // v0-v1-v2-v3
1,0,0, 1,0,0, 1,0,0, 1,0,0, // v0-v3-v4-v5
0,1,0, 0,1,0, 0,1,0, 0,1,0, // v0-v5-v6-v1
-1,0,0, -1,0,0, -1,0,0, -1,0,0, // v1-v6-v7-v2
0,-1,0, 0,-1,0, 0,-1,0, 0,-1,0, // v7-v4-v3-v2
0,0,-1, 0,0,-1, 0,0,-1, 0,0,-1}; // v4-v7-v6-v5
this->normals = &normals[0];

// color array
GLfloat colors[] = {1,1,1, 1,1,0, 1,0,0, 1,0,1, // v0-v1-v2-v3
1,1,1, 1,0,1, 0,0,1, 0,1,1, // v0-v3-v4-v5
1,1,1, 0,1,1, 0,1,0, 1,1,0, // v0-v5-v6-v1
1,1,0, 0,1,0, 0,0,0, 1,0,0, // v1-v6-v7-v2
0,0,0, 0,0,1, 1,0,1, 1,0,0, // v7-v4-v3-v2
0,0,1, 0,0,0, 0,1,0, 0,1,1}; // v4-v7-v6-v5
this->colors = &colors[0];

}

void Render::Cube::render(){
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glNormalPointer(GL_FLOAT, 0, normals);
glColorPointer(3, GL_FLOAT, 0, colors);
glVertexPointer(3, GL_FLOAT, 0, vertices);

glPushMatrix();
// rotate + half the size, else the cube is somewhat under the ground
glTranslatef(position.x(), position.y() + 1, position.z());

glDrawArrays(GL_FLOAT, 0, 24);

glPopMatrix();

glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

}



Can anyone give me a heads-up on what I'm doing wrong?

Also, can anyone tell me if and how I can use a vertex buffer object?

minimoog
8th April 2010, 08:59
Did you setup projective matrix and viewport?

VBO is just buffer for vertices. Vertices are stored in server area (GPU).


glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, 24 * 3 * sizeof(float), vertices, GL_STATIC_DRAW);

When you have bind VBO object then glVertexPointer (and others glColorPointer...) take their data from VBO. The last parameter (pointer to vertices) indicates offset in the binded VBO object. Now, you can store vertices, normals, colors in separate VBO objects, or all together in one VBO object. It's up to you.