6

出于学习目的,我决定使用 3 种方法绘制球体

  1. 显示列表
  2. Voa Vbo (GL_TRIANGLE_STRIPE)
  3. Vao Vbo 和 Ibo (GL_TRIANGLES)

我读到使用 ibo 可以使程序运行得更快,但这是真的吗?对于 100 个切片和 100 个堆栈的球体,第 2 种方法产生 40400 个顶点,而第 3 个“仅”产生 19802 个顶点。通过这样做,我每 32 个字节 = 659136 个字节节省 20598 个顶点。

  1. verticesSize=(slices*4)*(stacks+1);

  2. IBO verticesSize=(slices*2)*(stacks-1)+2;

但是,我需要创建索引数组,在这种情况下,索引的大小为 118800(创建所有面所需的索引数)*4(无符号整数的大小)=475200 字节!第二种方法以 15fps 渲染 1000 个球体,而第三种方法以几乎 6pfs 渲染 1000 个球体

  1. 将索引数组从 GL_TRIANGLE 转换为 GL_TRIANGLE_STRIP 是否会提供比第二种方法更有效的方法?
  2. 使用 ibo 渲染球体是个坏主意吗?
  3. 为什么它更慢?索引数组中的顺序有什么问题吗?

或者,也许我写的代码完全错误,这就是为什么它如此挣扎:(如果有人感兴趣,这是我的代码http://pastebin.com/raw.php?i=74jLKV5M

4

1 回答 1

1

glDrawElements 调用是错误的。count 参数应该是索引的数量,而不是数字乘以 4。尝试更改它。

使用索引而不是三角形条应该几乎总是更快。事实上,如果驱动程序也在幕后使用索引来渲染三角形条带,我不会感到惊讶。

此外,正如我在评论中提到的,您拥有索引的顺序会影响性能。然而,对于您的领域,您使用的索引模式可能是最优化的,即使如此,它所产生的差异也很小。

于 2012-09-19T14:42:57.040 回答