关于 GL_VERTEX_ARRAY 的问题
Posted
技术标签:
【中文标题】关于 GL_VERTEX_ARRAY 的问题【英文标题】:A question about GL_VERTEX_ARRAY 【发布时间】:2011-09-22 10:57:20 【问题描述】:这只是出于兴趣,但是 GL_VERTEX_ARRAY 将“保持”并通过 drawArrays() 之类的东西渲染的顶点数量是否有限制?或者我理论上是否可以通过几百万个顶点仍然能够调用 drawArrays()?
【问题讨论】:
哦,对了,对不起,我是论坛的新手,谢谢,我会确保现在这样做:) 【参考方案1】:从 OpenGL-1.2 开始,在使用 glDrawRangeElements
时存在某种限制:
实现表示推荐的最大顶点和索引数量 数据,可以通过调用查询
GetIntegerv
带有符号 常量MAX_ELEMENTS_VERTICES
和MAX_ELEMENTS_INDICES
。如果结束-开始+1 大于MAX_ELEMENTS_VERTICES
的值,或者如果 count 为 大于MAX_ELEMENTS_INDICES
的值,则调用可能会在 性能降低。没有 要求所有顶点在 范围开始;最后被引用。 但是,实施可能 部分处理未使用的顶点, 降低性能 用最优索引集来实现。
但这更像是一个建议,一个硬性约束。除此之外,真正的限制是安装的内存量,以及为索引元素数组选择的类型可以解决的问题
不过,glDrawRangeElements
的限制通常也可以很好地指示批量大小。
【讨论】:
这些值不只适用于范围(glDrawRangeElements)命令吗?我记得这些值在我的 7950 上非常小(例如 4k 或其他值)。 @Christian Rau:确实,该规范在 glDrawRangeElements 之后有这一段,但据我所知,它是普遍适用的,因为 glDrawElements 本质上是 glDrawRangeElement(start=0, end=maximum_value_of_index_type, ...) (当然,驱动程序的实现可能不会那么天真)。 但是这些枚举也来自EXT_draw_range_elements
扩展。我总是理解这样的:当范围有效时,调用可以优化一点并且运行得更快,但是当范围太大时,它会恢复到类似于glDrawElements
(甚至更糟)的东西,但我没有对驱动程序的了解过多。
@Christian Rau:你说得对,我刚刚阅读并比较了从扩展到当前的规范,如果查看文档的交集,这是唯一有意义的解释。编辑了我对此的回答。【参考方案2】:
肯定是有限制的,但据我所知,它只是基于可用内存,所以你很可能有几百万个顶点。
【讨论】:
以上是关于关于 GL_VERTEX_ARRAY 的问题的主要内容,如果未能解决你的问题,请参考以下文章