如何使用一个VBO绘制一组点?

时间:2015-10-16 13:27:14

标签: c++ opengl vbo

我的问题与我的另一个问题有关:How to render large number of similar objects?

我试图渲染一组点。有一点我使用这段代码:

glUseProgram(programId);
glUniformMatrix4fv(matrixId, 1, GL_FALSE, &(vp * getModelMatrix(pos, scale))[0][0]);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glDrawArrays(GL_POINTS, 0, 1);
glDisableVertexAttribArray(0);

我对点集的任务感到有些困惑。我为顶点分配了更多内存:

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, totalParticleCount * 3 * sizeof(GLfloat), gVertexBufferData, GL_STATIC_DRAW);

我使用此绘制调用进行渲染:

glDrawArrays(GL_POINTS, 0, totalParticleCount);

但我不明白我必须对glUniformMatrix4fv函数使用哪种转换以及如何设置顶点。我试着这样做:

for (int i = 0; i < totalParticleCount; i++) {
    gVertexBufferData[3 * i + 0] = hState[i].pos.x;
    gVertexBufferData[3 * i + 1] = hState[i].pos.y;
    gVertexBufferData[3 * i + 2] = hState[i].pos.z;
}

并设置统一矩阵:

glUniformMatrix4fv(matrixId, 1, GL_FALSE, &vp[0][0]);

在我的情况下,我什么也看不见,我无法理解什么是错的。

1 个答案:

答案 0 :(得分:0)

这篇文章(https://gamedev.stackexchange.com/questions/90471/should-unbind-buffers)对我的情况非常有帮助。更新顶点后,我必须再次绑定VAO和VBO。现在我有了这个工作代码:

for (int i=0; i<totalParticleCount; i++) {
    gVertexBufferData[3 * i + 0] = hState[i].pos.x;
    gVertexBufferData[3 * i + 1] = hState[i].pos.y;
    gVertexBufferData[3 * i + 2] = hState[i].pos.z;
}

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, totalParticleCount * 3 * sizeof(GLfloat), gVertexBufferData, GL_STATIC_DRAW);

glUseProgram(programId);
glUniformMatrix4fv(matrixId, 1, GL_FALSE, &vp[0][0]);