我有一个结构来存储 2 个不同模型的顶点数据,一个是立方体,另一个是金字塔。
struct Model{
GLuint vboID;
GLfloat* vbo;
GLuint vaoID;
GLfloat* vao;
GLuint vertexStart;
GLuint vertexCount;
};
我创建 vbos 并像这样生成它们的缓冲区:
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() 的两组指令,而是使用所有金字塔模型的数据。这很有趣,因为我的 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,而不是使用我用来存放手柄。