【发布时间】:2013-09-06 16:51:48
【问题描述】:
我有一个结构来存储 2 个不同模型的顶点数据,一个是立方体,另一个是金字塔。
struct Model{
GLuint vboID;
GLfloat* vbo;
GLuint vaoID;
GLfloat* vao;
GLuint vertexStart;
GLuint vertexCount;
};
我创建 vbo 并像这样生成它们的缓冲区:
Model cubeModel;
Model pyramidModel;
cubeModel.vbo = cubeVerts; //A GLfloat array I created earlier in code earlier.
cubeModel.vertexCount= sizeof(cubeVerts);//size of the GLfloat array in bytes
pyramidModel.vbo = pyVerts;
pyramidModel.vertexCount= sizeof(pyVerts);
glGenBuffers(1, &cubeModel.vboID); //Generate a buffer for the vertices
glBindBuffer(GL_ARRAY_BUFFER, cubeModel.vboID); //Bind the vertex buffer
glBufferData(GL_ARRAY_BUFFER, cubeModel.vertexCount, cubeModel.vbo, GL_STATIC_DRAW);
然后我使用:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, cubeModel.vertexCount);
glDisableClientState(GL_VERTEX_ARRAY);
哪个有效,我成功绘制了立方体,但我也一直在尝试多种方法来绘制金字塔。
我需要做什么才能同时在屏幕上渲染?
编辑:这是我专门尝试过的,复制 glBufferData() 调用并传入金字塔数据,然后制作 glDrawArays(GL_TRIANGLES,0,cubeModel.drawcount+pyramidModel.drawCount) 计算顶点数据会堆叠,而 glDrawArrays 会一口气遍历所有传递的几何图形。
我也尝试过从 glGenBuffers() 到 glDisableClientState() 的 2 组指令,而是使用金字塔模型的所有数据。这很有趣,因为我的 glDrawArrays 是:
glDrawArrays(GL_TRIANGLES, 0, cubeModel.drawCount);
glTranslatef(4.0f,0.0f,0.0f);
glDrawArrays(GL_TRIANGLES, 0, pyramidModel.drawCount);
它最终绘制了一个非常混乱的金字塔 2 次,让我相信当我第二次调用 glBufferData() 两次时会覆盖之前传递的数据。
编辑 2:阅读 Andon 的评论后,我编辑了一些代码以澄清事情,drawCount 现在是 vertexCount,m_vertexBuffer 现在正确引用了我存储在 cubeModel 中的句柄,cubeModel.vboID,而不是使用旧的类变量 I是用来存放手柄的。
【问题讨论】:
-
你对 VBO 的理解是错误的......当我看到一个类/结构的字段名为
vbo时,我首先想到的是:“这必须是一个 OpenGL 名称(句柄)到 VBO”。另一方面,您正在使用此字段来存储您将填充 VBO 的实际数据。与其按照现在的方式进行操作,不如尝试将 vbo 设置为GLuint并执行以下操作:glGenBuffers (1, &cubeModel.vbo)。您可以将顶点数据存储在任何您想要的位置,因为在将其提供给 VBO 之后,您就不再需要它了。为了清楚起见,也使用vertexCount而不是drawCount。 -
我知道只要有人说什么,我就会有一个捂脸的时刻。我也确实将其存储在结构中。模型结构中的 GLuint vboID。所以在这种情况下 cubeModel.vboID