我有一个包含数千个顶点的OpenGL场景,并希望将它们作为VBO / IBO传递。 执行glGetIntegerv(GL_MAX_ELEMENTS_VERTICES,& maxVertices)命令显示最大2048个顶点数量的限制,尽管事实上我有一个最近的视频卡。 除此之外,C中的数组仅限于int,因此最多32k个顶点
如何解决这些限制,无论如何都要显示我的所有对象?
答案 0 :(得分:5)
GL_MAX_ELEMENTS_VERTICES
常量仅适用于glDrawRangeElements
调用,即使那时大于此值的值肯定不会使glDrawRangeElements
慢于glDrawElements
。手动将批次拆分为较小的部分并不是一个好主意,因为批次应尽可能大,并尽可能少地拨打电话。忘掉这个价值,它就没有任何实际意义了。
顺便说一下,我非常确定你的int可以容纳大于32k的值,就像现代平台(至少那些支持VBO的图形设备)一样,int应该至少为32位宽(因此能够保持2G / 4G等值。虽然在嵌入式设备上(使用OpenGL ES),您可能仍然只能使用16位顶点索引。
答案 1 :(得分:2)
GL_MAX_ELEMENTS_VERTICES不会告诉您可以传递给glDrawRangeElements的单个调用的最多顶点吗?有没有理由你不能将你的场景分成比特并逐个渲染这些比特?
答案 2 :(得分:1)
将顶点总数除以2048并创建多个VBO
void glGenBuffersARB(GLsizei n, GLuint* ids)
所以n将是(total / 2048)+1,而id将是一个包含(total / 2048)+1的GLuint数组