IBO比GL_TRIANGLE_STRIP差吗?

use*_*940 6 c++ opengl

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

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

我读到使用ibo让程序运行得更快,但这是真的吗?对于100个切片和100个堆栈的球体,第二个方法产生40400个顶点,而第三个"仅"19802.通过这样做,我保存20598个每个32字节= 659136个字节.

  1. verticesSize =(切片*4)*(堆叠+ 1);

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

但是我需要创建索引数组,在这种情况下,大小为118800(创建所有面所需的索引数)*4(unsigned int的大小)= 475200字节!虽然第二种方法使用15fps渲染1000个球体,但第三种方法使用仅仅6pfs渲染1000个球体

  1. 将指数数组从GL_TRIANGLES转换为GL_TRIANGLE_STRIP会提供更有效的方法,然后第二种方法吗?
  2. 使用ibo渲染球体是不是很糟糕?
  3. 为什么它更慢?indices数组中的顺序是否有任何问题?

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

Han*_*esh 1

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

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

另外,正如我在评论中提到的,索引的顺序会影响性能。然而,对于您的领域来说,您使用的索引模式可能是最佳的,即使如此,它造成的差异也很小。