我有一个平面和一个索引缓冲区,或带有图像上标记的索引的 EBO:
现在,如果我打电话:
glDrawElementsBaseVertex(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0, 0);
我明白了:
这个我明白。此外,如果我这样做:
glDrawElementsBaseVertex(GL_TRIANGLES, 9, GL_UNSIGNED_INT, 0, 0);
这也是有道理的。但是当我更改其他参数之一时,我的理解完全崩溃了。如果我这样做:
glDrawElementsBaseVertex(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0, 3);
它看起来像这样:
因此,通过将参数 3 传递给 basevertex 参数(最后一个),它开始使用索引,而不是从索引的 3 个位置开始,甚至不是从索引的 3 个三角形开始,而是从大约 6 个三角形开始,或更准确地说索引号 18。我无法理解这种行为。
此外,我已经阅读了这些函数中“索引”参数的矛盾含义:
void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);
void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, GLvoid *indices, GLint basevertex);
我读过索引指针使您可以通过提供指针直接引用索引缓冲区,如果它为空,则索引缓冲区取自当前绑定的 GL_ELEMENT_ARRAY_BUFFER。然而,从一个版本的文档中它说:
indices 将字节偏移量(转换为指针类型)指定到绑定到 GL_ELEMENT_ARRAY_BUFFER 的缓冲区中以开始读取索引。
在另一个版本中它说:
indices 指定一个指向索引存储位置的指针。
如果我用倒数第二个参数(索引)作为 (void*)3 调用 glDrawElementsBaseVertex,我将第一个三角形绘制为红色。如果我指定 (void*)6 我没有突出显示三角形。如果我指定 (void*)9 我会突出显示第二个三角形。
我无法理解这一切。那么这个参数,indices,是不是一个可选的指针,指向你希望使用的索引,而不是使用当前绑定的元素数组缓冲区?