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

Posted

技术标签:

【中文标题】如何使用一个 VBO 绘制一组点?【英文标题】:How to draw set of point using one VBO? 【发布时间】:2015-10-16 13:27:13 【问题描述】:

我的问题与另一个我的问题有关: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]);

在我的情况下,我什么也看不到,我不明白出了什么问题。

【问题讨论】:

我认为最好将其发布在 GameDev 交流中。 gamedev.stackexchange.com @iFarbod 为什么?这里完全没问题。 &amp;(vp * getModelMatrix(pos, scale))[0][0] @BartekBanachewicz:很确定临时应该last for the duration of the expression,足够长glUniformMatrix4fv() 复制它需要的信息。您可能正在考虑使用客户端内存的glVertex*Pointer():这些指针需要持续到glDrawArrays()/glDrawElements() 完成。 @BartekBanachewicz 实际上我有一些不同的代码,但我有相同的逻辑。我在发布之前检查了这段代码,它工作正常。 【参考方案1】:

这篇文章 (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]);

【讨论】:

以上是关于如何使用一个 VBO 绘制一组点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Matplotlib 中绘制模糊点

将点列表排序为多边形

找到并绘制回归平面到一组点

如何使用不同的 VAO、VBO 绘制 2 个或更多对象?

如何使用 VBO 和单个 OpenGL drawelements 调用绘制多个对象?

不使用函数绘制圆圈