glDrawRangeElements
函数是有意义的。知道索引渲染数据的范围所以,按照我的解释,如果我有一个大缓冲区(包含多个网格的数据),并且打算计划调用
glDrawRangeElements
而是指定此调用将使用的最小和最大索引值,我可以实现加速。这是
glDrawRangeElements
的正确用例吗?几乎总是知道最小和最大索引值(因为我会提前知道要绘制的内容),所以看起来
glDrawRangeElements
应该只是glDrawElements
的替代品。但是答案暗示
glDrawRangeElements
实际上可能会更慢。那么,使用glDrawRangeElements的利弊是什么?
#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
一起忽略start
和end
,并且GL_MAX_ELEMENTS_ {INDICES | VERTICES}的值是“无穷大”。根据规范正确使用每当
glDrawElements
超过GL_MAX_ELEMENTS_ {INDICES | VERTICES}而glDrawRangeElements
没有超过GL_MAX_ELEMENTS_ {INDICES | VERTICES}时。
评论
真有趣的问题。我一直想知道今天此功能的实际实用性是什么,尤其是因为以后没有出现对任何更高级的绘制调用(例如实例渲染)的远程调用。好像是过去的遗物(也许是VBO之前的时代)。