我必须将一些代码(处理为 2D 形状的轮廓构建数据的 VBO,即它们不仅仅是三角形网格,它们可以是任意长度的多边形轮廓)从使用原始重启转换为使用glMultiDrawElements
. 我现在意识到glMultiDrawArrays
实际上更适合我的应用程序,但这与问题无关(如果我更聪明并移植它来代替使用,我确实不会遇到这个奇怪的问题glMultiDrawArrays
)。
我组装了两个向量来存储用于存储必要值的数据:
struct E_MDEGBuffer {
std::vector<GLvoid*> indices;
std::vector<GLsizei> lengths;
};
然后我所做的是为每个具有 N 个顶点的多边形将单个值推送到两个indices
和lengths
,在indices
我插入的(char*)NULL+index
位置index
是 IBO 中与多边形的第一个顶点相对应的索引,并在其中lengths
放置整数个顶点多边形。
该E_MDEGBuffer
结构用于传递值,glMultiDrawElements
如下所示:
glMultiDrawElements(GL_TRIANGLE_FAN, mde.lengths.data(), GL_UNSIGNED_INT, (const GLvoid**)mde.indices.data(), mde.indices.size());
我测试了我的程序,渲染完全搞砸了。
最终,我稍微摆弄了一些硬编码的值glMultiDrawElements
,我发现我的索引值偏离了 4 倍。
例如,第一个多边形有 3 个顶点,第二个多边形有 5 个顶点。
为了得到正确的结果,我的indices
向量 contains[0,0xc]
和lengths
contains [3,5]
。
为什么indices
不应该[0,0x3]
?