1

我有一个结构来存储 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,而不是使用我用来存放手柄。

4

1 回答 1

2

我不想弄乱评论部分,因为您的代码有很多问题。但我现在也没有时间浏览所有这些,所以这是一种临时答案。

glBufferData (...)从技术上讲,它不会覆盖以前传递的数据,它做的事情要糟糕得多。每次调用glBufferData (...)它都会创建一个与您传递的大小相同的新数据存储,并(可选)用您提供的数据填充它(如果您传递非 NULL 的内容)。把它想象成调用free (...)and thenmalloc (...)delete [] ...and new Type [...]

glBufferSubData (...)是将顶点附加到顶点缓冲区的首选技术。不幸的是,它不会调整数据存储的大小。有时,过度分配您的 VBO 并将数据推迟到稍后提供(使用glBufferSubData)会很方便。

如果您使用一个 VBO 来存储两个模型,您需要知道每个模型的起始顶点和顶点数,因为它与您的 VBO 数据相关。现在你只知道顶点的数量(你把它命名为奇怪的名字drawCount而不是vertexCount)。对大多数人来说,drawCount表示你想要绘制某物的次数,而不是它包含的顶点或元素的数量。

调用的大小字段glBufferData (...)应该是顶点数据的大小(以字节为单位)。现在你正在传递顶点的数量。您很可能打算使用sizeof (YourVertexDataStructure)单个顶点的大小(sizeof (float [3])在这种情况下),以及类似sizeof (cubeVerts)/sizeof (YourVertexDataStructure)来计算实际存储在该数组中的顶点数。那么你传递给的大小glBufferData (...)将是:_size * count_

于 2013-09-06T17:13:15.480 回答