OpenGL中的顶点限制

3
我有一个包含数千个顶点的OpenGL场景,想要将它们作为VBOs/IBOs传递。 执行glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &maxVertices)命令会揭示一个2048个顶点的最大限制,尽管我的显卡很新。 此外,C语言中的数组仅限于int类型,因此最多只能有32k个顶点。 如何解决这些限制以显示所有对象?

C语言中的数组是否限制于int类型? - Flexo
当我在方括号中使用除整数以外的其他变量(例如,MyArray[double_variable])时,会提示“数组下标不是整数”。 - Laurent Crivello
2
double不能作为数组索引,但是long可以。intlong都是整数。在拥有最新显卡的平台上,int很少会小于16位。 - Flexo
这是哪个OpenGL实现和平台/编译器? - Dr. Snoopy
MAX_ELEMENTS_VERTICESMAX_ELEMENTS_INDICES仅仅是建议值,而不是硬性限制。OpenGL规范(第329页)指出,如果您将大小/范围保持在这些限制以下,您将获得最佳性能。如果您超过这些建议值,可能会导致性能下降。 - doug65536
显示剩余2条评论
3个回答

5
“GL_MAX_ELEMENTS_VERTICES”常量仅适用于“glDrawRangeElements”调用,即使值更大,它也不会比“glDrawElements”慢。手动将批处理分割成较小的部分并不是一个好主意,因为批处理应尽可能大,绘制调用应尽可能少。忘记这个值吧,它已经没有任何实际意义了。
顺便说一下,我很确定您的int可以容纳比32k大得多的值,因为在现代平台上(至少具有支持VBO的图形设备的平台)int应该至少有32位宽度(因此能够容纳像2G / 4G之类的值)。虽然在嵌入式设备(使用OpenGL ES)上,仍可能受到16位顶点索引的限制。

谢谢,但是在 C 中,数组只接受整数作为索引,因此最多只能有 32k 个元素。那么我该如何访问你的2M元素呢? - Laurent Crivello
1
@Laurent,就像我和awoodland的评论所说的那样,在现代平台上,C语言中的int类型只有16位宽度(相当于+/-32k范围)是非常不可能的,通常应该至少为32位宽度(意味着+/-2G范围,而不仅仅是2M)。你从哪里得到了int类型只有16位的信息? - Christian Rau
谢谢,现在我开始慢慢理解了!我不知道我从哪里得到的32k整数限制,也许确实是过去的事情了。我正在使用Cocoa/Xcode进行开发。那我还是试试用int吧。 - Laurent Crivello
@Christian Rau:您能确认GL_MAX_ELEMENTS_VERTICES和GL_MAX_ELEMENTS_INDICES不再使用吗?在决定何时拆分绘制调用时,还可以使用什么?在OpenGL ES中会使用什么?请参见我的问题此处 - Bim

2
GL_MAX_ELEMENTS_VERTICES只是告诉您可以传递到glDrawRangeElements单个调用中的最多顶点数。您为什么不能将场景分成几部分,逐个渲染这些部分呢?

1
所以基本上我可以使用 glDrawRangeElement 逐块传递一个由三万个元素组成的 VBO 吗? - Laurent Crivello
是的,我认为是这样的。请参阅文档:http://www.opengl.org/sdk/docs/man/xhtml/glDrawRangeElements.xml 为了避免可能的性能降低,您只需要为使用的索引指定边界。 - Rupert Swarbrick

1

将总顶点数除以2048,创建相应数量的VBO

void glGenBuffersARB(GLsizei n, GLuint* ids)

所以 n 的值为 (total / 2048)+1,ids 是一个包含 (total / 2048)+1 个 GLuint 元素的数组。


谢谢。我是不是应该为每个单独的VBO执行glBindBuffer、glBufferData、glVertexPointer和glDrawElements,还是只运行一次就足够了? - Laurent Crivello

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