Search code examples
openglglslvbovaolarge-data

VBO wont draw, large dataset


I am trying to render a large dataset of ~100 000 values in OpenGL, right now only as points, later using sprites.

My vector "positions" is ordered like this: +------------------------------------------------- | x | y | z | w | x | y | z | w | x | y | z | ... +------------------------------------------------- where the fourth component (w) is a scaling factor that is used in the vertex/fragment shaders..

VBO creation [ EDIT ]

...
v_size = positions.size();
GLint positionAttrib = _programObject->attributeLocation("in_position");

glGenVertexArrays(1, &_vaoID);
glGenBuffers(1, &_vboID);

glBindVertexArray(_vaoID);

glBindBuffer(GL_ARRAY_BUFFER, _vboID);
glBufferData(GL_ARRAY_BUFFER, v_size*sizeof(GLfloat), &positions[0], GL_STATIC_DRAW);

glEnableVertexAttribArray(positionAttrib);
glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), 0 );
glBindVertexArray(0);

Render-stage: [ EDIT ]

This works now, but I am not sure if 100% correct, feel free to criticize:

GLint vertsToDraw = v_size / 4;
GLint positionAttrib = _programObject->attributeLocation("in_position");
// edit 1. added vao bind
glBindVertexArray(_vaoID); 
glEnableVertexAttribArray(positionAttrib);     
    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
    //glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (void*)0);
    // edit 2. no stride
    glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, 0, (void*)0); 
    glDrawArrays(GL_POINTS, 0, vertsToDraw);
glDisableVertexAttribArray(positionAttrib);
glBindVertexArray(0);

Please let me know if any more code is needed.


Solution

  • Fixed everything as suggested by derhass and keltar, see comments for post. Everything works now.