我必须转换一些代码(处理为2D形状的轮廓构建VBO数据,即它们不仅仅是三角形网格,它们可以是任意长度的多边形轮廓),从使用原始重启到使用{{ 1}}。我现在意识到glMultiDrawElements
实际上更适合我的应用程序,但这与问题无关(事实上,如果我更聪明并将其移植到使用glMultiDrawArrays
,我就不会遇到这个奇怪的问题)
我组装了两个向量来存储用于存储必需值的数据:
glMultiDrawArrays
然后我所做的是对于每个具有N个顶点的多边形将单个值推送到struct E_MDEGBuffer {
std::vector<GLvoid*> indices;
std::vector<GLsizei> lengths;
};
和indices
,lengths
我插入了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
?
答案 0 :(得分:0)
提供给OpenGL缓冲区函数(例如glVertexAttribPointer
)的偏移量始终是数据大小偏移量,而不是索引。
传入的数字必须是GLvoid*
(或者在本例中为GLvoid**
)类型,但其值为字节偏移量。它有助于思考如何为这个参数指定一个指针类型,并且它是一个字节偏移值(很短的方向)。
我一开始并不知道是什么让我觉得这只是指数偏移,但这是错误的,我支付了价格。