关于 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_VERTICESMAX_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 的问题的主要内容,如果未能解决你的问题,请参考以下文章

glDrawElements 只绘制半个四边形

几个关于tableView的问题解决方式整合

关于VM虚拟机(Finalshell的连接问题)

关于数据库优化1——关于count,count(*),和count(列名)的区别,和关于表中字段顺序的问题

这是一个关于计算机体系结构的问题,基本上是关于逻辑门

OpenGL仅从顶点数组中绘制一些索引