0

我必须将一些代码(处理为 2D 形状的轮廓构建数据的 VBO,即它们不仅仅是三角形网格,它们可以是任意长度的多边形轮廓)从使用原始重启转换为使用glMultiDrawElements. 我现在意识到glMultiDrawArrays实际上更适合我的应用程序,但这与问题无关(如果我更聪明并移植它来代替使用,我确实不会遇到这个奇怪的问题glMultiDrawArrays)。

我组装了两个向量来存储用于存储必要值的数据:

struct E_MDEGBuffer {
    std::vector<GLvoid*> indices;
    std::vector<GLsizei> lengths;
};

然后我所做的是为每个具有 N 个顶点的多边形将单个值推送到两个indiceslengths,在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]

4

1 回答 1

0

提供给 OpenGL 缓冲区函数(例如glVertexAttribPointer)的偏移量始终是数据大小偏移量,而不是索引。

传入的数字必须是GLvoid*(或在这种情况下GLvoid**)类型,但其值是字节偏移量。它有助于考虑如何可能有理由为此参数使用该指针类型,并且它是一个字节偏移值(一种短的方式)朝着那个方向发展。

我不知道一开始是什么让我认为这只是索引偏移,但这是错误的,我付出了代价。

于 2012-07-02T01:28:59.993 回答