glMultiDrawElements:传递给“indices”参数的值(GLvoid **)

时间:2012-07-02 01:28:59

标签: opengl vbo vertex vertex-buffer

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

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

glMultiDrawArrays

然后我所做的是对于每个具有N个顶点的多边形将单个值推送到struct E_MDEGBuffer { std::vector<GLvoid*> indices; std::vector<GLsizei> lengths; }; indiceslengths我插入了indices (char*)NULL+index }是IBO中与多边形的第一个顶点对应的索引,在index中,我将整数个顶点放在该多边形中。

lengths结构用于将值传递给E_MDEGBuffer,如下所示:

glMultiDrawElements

我测试了我的程序,渲染完全搞砸了。

最后,我将一些硬编码的值传递给glMultiDrawElements(GL_TRIANGLE_FAN, mde.lengths.data(), GL_UNSIGNED_INT, (const GLvoid**)mde.indices.data(), mde.indices.size()); 并且发现我的指数值偏差了4倍。

例如,考虑第一个多边形有3个顶点,第二个多边形有5个顶点。

要获得正确的结果,我的glMultiDrawElements向量包含indices[0,0xc]包含lengths

为什么[3,5]不是indices

1 个答案:

答案 0 :(得分:0)

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

传入的数字必须是GLvoid*(或者在本例中为GLvoid**)类型,但其值为字节偏移量。它有助于思考如何为这个参数指定一个指针类型,并且它是一个字节偏移值(很短的方向)。

我一开始并不知道是什么让我觉得这只是指数偏移,但这是错误的,我支付了价格。