3

我有一个具有数千个顶点的 OpenGL 场景,并希望将它们作为 VBO/IBO 传递。执行 glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &maxVertices) 命令显示最大顶点数限制为 2048,尽管事实上我有一个最近的视频卡。除此之外,C 中的数组仅限于 int,因此最多 32k 个顶点。

如何解决这些限制以显示我的所有对象?

4

3 回答 3

5

GL_MAX_ELEMENTS_VERTICES常量仅适用于glDrawRangeElements调用,即使如此,大于该值的值也肯定不会glDrawRangeElementsglDrawElements. 手动将批次拆分成更小的部分并不是一个好主意,因为批次应该尽可能大,并且绘制调用尽可能少。忘记这个值吧,它已经没有真正的意义了。

顺便说一句,我很确定您的 int 可以保存比 32k 大得多的值,因为在现代平台上(至少是那些具有支持 VBO 的图形设备的平台),int 应该至少为 32 位宽(因此能够保持值,如 2G/4G)。尽管在嵌入式设备上(使用 OpenGL ES),您可能仍受限于 16 位顶点索引。

于 2011-08-19T15:22:28.923 回答
2

GL_MAX_ELEMENTS_VERTICES 不只是告诉您可以传递给 glDrawRangeElements 的单个调用的最多顶点吗?您是否有理由不能将场景分割成位并逐位渲染?

于 2011-08-19T14:38:43.477 回答
1

将您的顶点总数除以 2048 并创建比许多 VBO

void glGenBuffersARB(GLsizei n, GLuint* ids)

所以 n 将是 (total / 2048)+1 并且 ids 将是包含 (total / 2048)+1 的 GLuint 数组

于 2011-08-19T14:42:00.843 回答