在OpenGL中,使用VBO时如何使用偏移量

18

我的目标是使用相同的VBO但不同的偏移量多次呈现网格。例如:

//Load VBO
glGenBuffers(2, &bufferObjects[0]);
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*size(vertices)*3, &vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*size(indices), &indices[0], GL_STATIC_DRAW);

//Render VBO
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
glDrawElements(renderFlag, nrIndices, GL_UNSIGNED_INT, 0);

如果我同时绘制洞的网格,那么没有问题,但是是否可以使用不同的起始索引绘制相同的网格,像这样:

glDrawElements(renderFlag, 20, GL_UNSIGNED_INT, "WHAT TO WRITE HERE"?);
1个回答

30

“start index”是什么意思?你可能指的是以下两种情况之一:

从缓冲对象中的不同位置开始

那么,只需这样做。glDrawElements接受一个偏移量来确定它从缓冲对象中开始提取索引的位置。因此,只需添加一个值即可。

glDrawElements(renderFlag, 20, GL_UNSIGNED_INT, (void*)(ixStart * sizeof(GLuint)));

对从缓冲区获取的索引值进行偏移

这意味着您想要绘制相同范围的索引,但是想要将这些索引值本身应用偏移量。因此,如果您的索引缓冲区看起来像这样:(1、4、2、0、5、...),并且您应用了一个偏移量为20,则它将获取这些索引:(21、24、22、20、25、...)。

使用 glDrawElementsBaseVertex 实现这一功能,它类似于以下内容:

glDrawElementsBaseVertex(renderFlag, 20, GL_UNSIGNED_INT, 0, offset);

也许你应该乘以大小而不是加上它:(void*)(ixStart * sizeof(GLuint)) - Kimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接