使用Vertex Arrays了解glDrawElements的内部行为

时间:2014-09-24 18:32:01

标签: opengl

我试图理解glDrawElements在使用顶点数组时如何知道要发送到GPU的元素范围,因为glVertexPointer或glColorPointer没有关于VBO所具有的元素数量的信息。

OpenGL规范没有说明任何事情所以我假设行为取决于函数的驱动程序实现,但我只能想到一个解决方案,其中驱动程序需要对所有索引进行完全传递来计算在转移到图形内存之前的限制。

如果这是正确的,那么glDrawElements的性能应该比已经知道限制的glDrawRangeElements差很多,但是我在一些网站上找到的信息似乎抵消了这个假设。

任何人都知道有关内部如何运作的具体细节?

1 个答案:

答案 0 :(得分:0)

我觉得你在使用不好的文档来学习: 不应再使用glVertexPointer和glColorPointer,而是选择

glEnableVertexAttribArray();
glVertexAttribPointer();

但是你完全正确:这些调用中没有任何内容可以说明需要哪个数据范围。所需的VBO(或GL_ARRAY_BUFFER)元素范围来自于检查GL_ELEMENT_ARRAY_BUFFER。

嗯,因为如果你将数据设置为VBO,对于驱动程序IMHO来说这可能很麻烦,所有这些都将立即传输到视频RAM。 IBO也是如此。因此,如果有足够的GPU内存,所有数据都已存在,GPU只会转移给glDrawElements的参数。

所以你对glDrawRangeElements的假设是正确的,但是这个调用只是与有限容量设备上的glDrawElements不同的调用,或者当你最大化视频内存时。

其他任何内容取决于驱动程序的实现细节。很可能最快转移整个VBO和IBO(从gpu ram中删除其他数据,这在当时是不必要的),如果内存很少并且在调用glDrawElements之前数据已被删除。