我正在尝试了解何时使用glDrawRangeElements函数是有意义的。知道索引渲染数据的范围


所以,按照我的解释,如果我有一个大缓冲区(包含多个网格的数据),并且打算计划调用glDrawRangeElements而是指定此调用将使用的最小和最大索引值,我可以实现加速。

这是glDrawRangeElements的正确用例吗?

几乎总是知道最小和最大索引值(因为我会提前知道要绘制的内容),所以看起来glDrawRangeElements应该只是glDrawElements的替代品。

但是答案暗示glDrawRangeElements实际上可能会更慢。

那么,使用glDrawRangeElements的利弊是什么?

评论

真有趣的问题。我一直想知道今天此功能的实际实用性是什么,尤其是因为以后没有出现对任何更高级的绘制调用(例如实例渲染)的远程调用。好像是过去的遗物(也许是VBO之前的时代)。

#1 楼

顶点缓冲区的出现有效地解决了发明glDrawRangeElements的问题,从而得以解决。有了这些知识,他们就可以将该值的范围读取到单独的缓冲区中,然后从该缓冲区进行渲染。在不知道索引范围的情况下,这是不可能的,因为索引列表可以从任何索引中选取。

但这仅在从客户端内存读取时有用。将范围复制到客户端内存之外,可以异步呈现。您复制所需的值,并发出渲染命令,然后返回调用方。

如果您正在从缓冲区对象中读取数据,这不是一件有用的事情。而且由于核心OpenGL甚至不允许您选择使用客户端内存,因此glDrawRangeElements命令不再有用。

评论


$ \ begingroup $
“您复制所需的值,并发出渲染命令,然后返回给调用方” –这是在EBO中指定索引,即“复制值”时的含义,“返回呼叫者”是什么意思-呼叫者就是您的应用程序?
$ \ endgroup $
– Startec
18年2月1日在17:40

$ \ begingroup $
“复制值时的含义”“顶点数组包含要用于渲染的顶点数据。复制出值将复制出将要呈现的数据。 “您所说的“返回到调用者”是什么意思“ glDrawRangeElements的调用者。
$ \ endgroup $
–尼科尔·波拉斯(Nicol Bolas)
18-2-1在17:43



#2 楼

从OpenGL 4.5规范开始,glDrawRangeElements



实现表示建议的最大顶点和索引数据量,可通过使用pnames调用GetIntegerv来查询
MAX_ELEMENTS_VERTICES和MAX_ELEMENTS_INDICES。

如果end − start +1大于MAX_ELEMENTS_VERTICES的值,或者计数大于MAX_ELEMENTS_INDICES的值,则该调用可能会降低性能。


如果索引计数或隐式范围超过实现相关的GL_MAX_ELEMENTS_ {INDICES | VERTICES},则我的解释是glDrawElements的性能可能会比glDrawRangeElements差。对于始终优先于glDrawElements的平台,我希望glDrawRangeElements一起忽略startend,并且GL_MAX_ELEMENTS_ {INDICES | VERTICES}的值是“无穷大”。

根据规范正确使用每当glDrawElements超过GL_MAX_ELEMENTS_ {INDICES | VERTICES}而glDrawRangeElements没有超过GL_MAX_ELEMENTS_ {INDICES | VERTICES}时。