我必须将一些代码(处理为 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]和lengthscontains [3,5]。
为什么indices不应该[0,0x3]?