C++ 如何使用一个VBO绘制点集?

C++ 如何使用一个VBO绘制点集?,c++,opengl,vbo,C++,Opengl,Vbo,我的问题与我的另一个问题有关: 我正在尝试渲染点集。对于我使用此代码的一点: glUseProgram(programId); glUniformMatrix4fv(matrixId, 1, GL_FALSE, &(vp * getModelMatrix(pos, scale))[0][0]); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glVertexAttribPointer

我的问题与我的另一个问题有关:

我正在尝试渲染点集。对于我使用此代码的一点:

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;
}
就我而言,我什么也看不见,也不明白哪里出了问题。

这篇文章对我的情况很有帮助。更新顶点后,我必须再次绑定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]);

我认为最好在GameDev exchange中发布。gamedev.stackexchange。com@iFarbod为什么?这里很好。&vp*getModelMatrixpos,scale[0][0]@BartekBanachewicz:很确定临时文件应该足够长,glUniformMatrix4fv可以复制它需要的信息。您可能会想到使用客户端内存的glVertex*指针:这些指针需要持续到glDrawArrays/glDrawElements完成为止。@BartekBanachewicz实际上我有一点不同的代码,但我有相同的逻辑。我在发布之前检查了这段代码,它运行良好。
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]);