IBO 比 GL_TRIANGLE_STRIP 更糟?

Posted

技术标签:

【中文标题】IBO 比 GL_TRIANGLE_STRIP 更糟?【英文标题】:IBO worse then GL_TRIANGLE_STRIP? 【发布时间】:2012-09-19 12:02:17 【问题描述】:

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

    显示列表 Voa Vbo (GL_TRIANGLE_STRIPE) Vao Vbo 和 Ibo (GL_TRIANGLES)

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

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

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

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

    是否将索引数组从 GL_TRIANGLES 转换为 GL_TRIANGLE_STRIP 将提供比第二种更有效的方法 方法? 使用 ibo 渲染球体是个坏主意吗? 为什么比较慢?索引数组的顺序有关系吗?

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

【问题讨论】:

索引的顺序可以而且确实很重要,它与顶点获取缓存有关。但这可能不是,让我检查您的代码并回复您 【参考方案1】:

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

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

正如我在 cmets 中提到的,索引的顺序会影响性能。但是,对于您的球体,您使用的索引模式可能是最优化的,即使如此,它所产生的差异也很小。

【讨论】:

以上是关于IBO 比 GL_TRIANGLE_STRIP 更糟?的主要内容,如果未能解决你的问题,请参考以下文章

IBO 中的三倍序列如何工作?

为啥使用 VBO 和/或 IBO 而不是简单的顶点数据?

背面剔除 + GL_TRIANGLE_STRIP?

如何使用 GL_TRIANGLE_STRIP 绘制一个矩形框?

使用 IBO/EBO 时,程序仅在我调用 glBindBuffer 以在创建 VAO 后绑定 IBO/EBO 时才有效

Delphi:从 IBO 迁移到 FireDac