0

我正在尝试在 OpenGL 中渲染约 100 000 个值的大型数据集,现在仅作为点,稍后使用精灵。

我的向量"positions"是这样排序的: +------------------------------------------------- | x | y | z | w | x | y | z | w | x | y | z | ... +------------------------------------------------- 其中第四个分量 (w) 是在顶点/片段着色器中使用的缩放因子。

VBO创作[编辑]

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

渲染阶段:[编辑]

这现在有效,但我不确定是否 100% 正确,请随时批评:

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

如果需要更多代码,请告诉我。

4

1 回答 1

0

按照 derhass 和 keltar 的建议修复了所有问题,请参阅帖子评论。现在一切正常。

于 2014-08-28T16:24:24.877 回答