Hi all
im´try to draw a cube using vertex buffer object and vertex array object
this is my code that contains the vbo class with draws a cube
the problem is that noting is draw on the screen!
Can you guys see what is wrong with my code?
Thanks!
#include "Vertex_buffer_object.h"
#include <cstring>
#include <iostream>
Vertex_buffer_object::Vertex_buffer_object()
{
initVB();
}
Vertex_buffer_object::~Vertex_buffer_object() {}
void Vertex_buffer_object::draw()
{
glPushMatrix();
glBindVertexArray(_vao);
glBindBuffer(GL_ARRAY_BUFFER, _positionVBO);
glBindBuffer(GL_ARRAY_BUFFER, _normalVBO);
glBindBuffer(GL_ARRAY_BUFFER, _colorVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexVBO);
//Enable vertex,normals,colors and indices state.
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, 0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_UNSIGNED_BYTE, 0, NULL);
glEnableClientState(GL_ELEMENT_ARRAY_BUFFER);
glDrawElements(GL_QUADS, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
//desabilitando modos de desenho.
glDisableClientState(GL_ELEMENT_ARRAY_BUFFER);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
//desabilitando vertex buffer
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
void Vertex_buffer_object::initVB()
{
if (!glGenBuffers || !glBindBuffer || !glBufferData)
{
std::cerr << "VBOs are not supported by your graphics card" << std::endl;
}
// Variables for the cube data
float _vertex[] = {((-1.0f, -1.0f, 1.0f),
( 1.0f, -1.0f, 1.0f),
( 1.0f, 1.0f, 1.0f),
(-1.0f, 1.0f, 1.0f),
(-1.0f, -1.0f, -1.0f),
(1.0f, -1.0f, -1.0f),
(1.0f, 1.0f, -1.0f),
(-1.0f, 1.0f, -1.0f))
};
float _normal[] = {((-1.0f, -1.0f, 1.0f),
( 1.0f, -1.0f, 1.0f),
( 1.0f, 1.0f, 1.0f),
(-1.0f, 1.0f, 1.0f),
(-1.0f, -1.0f, -1.0f),
(1.0f, -1.0f, -1.0f),
(1.0f, 1.0f, -1.0f),
(-1.0f, 1.0f, -1.0f))
};
static const GLsizeiptr ColorSize = 8 * 3 * sizeof(GLubyte);
static const GLubyte _color[] =
{
255, 0, 0,
255, 255, 0,
0, 255, 0,
0, 255, 0,
0, 0, 255,
255, 0, 0,
255, 255, 0,
0, 255, 0
};
// Element Indicies for the Cube
unsigned int _index[] =
{
0, 1, 2, 2, 3, 0,
3, 2, 6, 6, 7, 3,
7, 6, 5, 5, 4, 7,
4, 0, 3, 3, 7, 4,
0, 1, 5, 5, 4, 0,
1, 5, 6, 6, 2, 1
};
const unsigned _vertexSize = 24;
glGenVertexArrays(1, &_vao);
glBindVertexArray(_vao);
//gerando a vbo para as posições
glGenBuffers(1, &_positionVBO);
glBindBuffer(GL_ARRAY_BUFFER, _positionVBO);
glBufferData(GL_ARRAY_BUFFER, _vertexSize * sizeof(float), NULL, GL_STATIC_DRAW);
void* positionPtr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
memcpy(positionPtr, (float*) _vertex, 24 * sizeof(float));
glUnmapBuffer(GL_ARRAY_BUFFER);
//gerando a vbo para as normais
glGenBuffers(1, &_normalVBO);
glBindBuffer(GL_ARRAY_BUFFER, _normalVBO);
glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(float) , NULL, GL_STATIC_DRAW);
void* normalPtr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
memcpy(normalPtr, (float*) _normal, 24 * sizeof(float));
glUnmapBuffer(GL_ARRAY_BUFFER);
//gerando a vbo para as cores
glGenBuffers(1, &_colorVBO);
glBindBuffer(GL_ARRAY_BUFFER, _colorVBO);
glBufferData(GL_ARRAY_BUFFER, ColorSize , NULL, GL_STATIC_DRAW);
void* colorPtr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
memcpy(colorPtr, (GLubyte*) _color, ColorSize);
glUnmapBuffer(GL_ARRAY_BUFFER);
//gerando a vbo para os indices
glGenBuffers(1, &_indexVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(unsigned int), NULL, GL_STATIC_DRAW);
//setando os dados para index
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexVBO);
void* indexPtr = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
memcpy(indexPtr,(unsigned int*) _index, 36 * sizeof(unsigned int));
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}