如何使用一个 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 为什么?这里完全没问题。&(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 绘制一组点?的主要内容,如果未能解决你的问题,请参考以下文章