顶点缓冲对象的最大大小(OpenGL ES 2.0)

12

GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY_BUFFER绑定的顶点缓冲对象最大大小是否有限制?

原本,我正在绘制一个由16个子网格组成的网格。对于每个子网格,我创建了一个顶点缓冲区,在渲染阶段期间,我调用了glDrawElements。 在iOS模拟器上这很好用,但是当我尝试渲染到我的设备时,屏幕不断闪烁且网格没有显示。

然后我阅读了一些资料,并发现在渲染阶段中不应该过多地调用glDrawElements。 我尝试将所有子网格合并到一个顶点缓冲区中。 绑定到GL_ARRAY_BUFFER的缓冲区包含3969个顶点,其中每个顶点包含20个浮点数。因此,该缓冲区的大小为317520字节。 绑定到GL_ELEMENT_ARRAY_BUFFER的索引是16425个shorts。因此,该缓冲区的大小为32850字节。

在OpenGL维基上,它说"根据一个nVidia文件,1MB到4MB是一个不错的大小"。

在绑定每个缓冲对象和调用glDrawElements之后,我打印出glGetError的结果,并且没有看到任何错误。 然而,我的网格没有正确显示。似乎只有第一个网格被正确绘制。我实现时是否存在任何问题?如果需要额外的信息来回答这个问题,请让我知道。如果在理论上没有什么问题,也许我实现时犯了一个错误。

3个回答

6

从某种意义上说,GPU始终可以发出GL_OUT_OF_MEMORY错误,因此存在最大尺寸。但除此之外,没有其他限制。


2
我知道回答这个问题已经太晚了。但是,我希望这个答案能帮助到某些人!
根据《OpenG图形系统规范(版本4.5(核心配置文件)-2015年5月28日)》,它声明:“除了顶点数组的大小之外,可以指定的顶点数量没有限制。”请参见第322页。
抱歉,还有尼古拉·博拉斯在这里提到: https://dev59.com/WGs05IYBdhLWcg3wPPaB#7369392 干杯, Naif

1
OpenGL 4.5规范与OpenGL ES 2.0有什么关系? - genpfault
1
事实上,OpenGL ES 基于 OpenGL 2.0 图形系统,这就是为什么引用它的原因。但我同意,我应该参考 OpenGL ES 规范!感谢您的评论。 - Nai

2

看这里:

http://www.sunsetlakesoftware.com/2008/08/05/lessons-molecules-opengl-es

使用较小的数据类型存在一些自然限制,例如使用 short 作为索引时显然会受到 ~65000 的限制。

但更重要的是,在链接中有一些额外的帮助,其中包括一些趣闻轶事证明了在自然功能极限范围内使用 short 是可行的。该链接是一个非常好的教程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接