【发布时间】:2013-06-09 22:44:38
【问题描述】:
在我的程序中,我想绘制许多球体。 首先,我为球体创建顶点、索引,然后将它们绑定到 voa/vbo/ibo。 之后,我创建了 1000 个随机模型矩阵。 现在我有两种方法来绘制网格。
- 只需通过调用
glDrawElements的ModelMatrices 列表循环1000 次。哪里矩阵 MVP 在 CPU 上计算并像统一一样发送到着色器。 - 将所有矩阵绑定到额外的 VBO 并将它们发送到着色器,如“in”
多变的。然后使用
glDrawElementsInstanced调用一次。
在测试程序中,我绘制了 1000 个球体(大约 2000 万个顶点) 当我使用第一种方法时,我得到大约 27FPS,而第二种方法将性能降低到 19FPS。理论上第二种方法应该比第一种方法获得更好的性能。
这里是代码。
- 将矩阵绑定到 VBO http://pastebin.com/iX9tUWfY
- 绘图http://pastebin.com/FsSXcnqKhttp://pastebin.com/8WMrUiu1
- 顶点着色器http://pastebin.com/39m34PZk
我认为瓶颈是顶点着色器(VP * ModelMatrix) 中的这种乘法,因为它需要为每个(网格中的顶点)*1000 完成。
什么可以升级,我做错了什么?
【问题讨论】:
-
每个球体 20.000 个顶点?!
-
正好 19802 个顶点。它是非常圆的球体 :) 这是我用于创建球体顶点所需的顶点数=(slices*2)*(stacks-1)+2;跨度>
-
@user1075940 一个非常圆的球体,你通常通过正确的照明而不是使用大量的顶点来获得。