在我的程序中,我想绘制许多球体。首先,我为球体创建顶点、索引,然后将它们绑定到 voa/vbo/ibo。之后,我创建了 1000 个随机模型矩阵。现在我有两种方法来绘制网格。
- 只需通过 ModelMatrices 调用列表循环 1000 次
glDrawElements
。在 CPU 上计算矩阵 MVP 并像统一一样发送到着色器。 - 将所有矩阵绑定到额外的 VBO 并将它们像“in”变量一样发送到着色器。然后用 调用一次
glDrawElementsInstanced
。
在测试程序中,我绘制了 1000 个球体(大约 2000 万个顶点)当我使用第一种方法时,我得到大约 27FPS,而第二种方法将性能降低到 19FPS。理论上第二种方法应该比第一种方法实现更好的性能。
这是代码。
- 将矩阵绑定到 VBO http://pastebin.com/iX9tUWfY
- 绘图http://pastebin.com/FsSXcnqK http://pastebin.com/8WMrUiu1
- 顶点着色器http://pastebin.com/39m34PZk
我认为瓶颈是顶点着色器中的这种乘法(VP * ModelMatrix)
,因为它需要为每个(网格中的顶点)* 1000 完成。
什么可以升级,我做错了什么?