在Open GL顶点数组中旋转单个多边形?

时间:2010-09-27 06:19:12

标签: android performance opengl-es vertex-buffer

我正在使用OpenGL ES开发Android游戏,但我遇到了性能问题。

我想要做什么:我在屏幕上有一堆对象,它们共享相同的网格,但都有单独的旋转和翻译。您可以将它与小行星进行比较,其中有一堆小行星在屏幕上移动。

实际问题:由于我单独旋转和翻译每个对象,我的性能受到影响,与顶点数量相比,发送顶点数组的开销太大了(数十个每个对象)。

我该怎么办?我想到的一个解决方案是在将它们放入顶点缓冲区之前自己更新软件中的顶点。这可能会给我一些开销,但这似乎违反直觉。

请分享您的任何想法或建议!谢谢!

1 个答案:

答案 0 :(得分:1)

“发送顶点数组的开销”似乎意味着你没有为顶点/索引使用服务器端缓冲区。如果是这种情况,请查看GLES 1.1规范的第2.9节“缓冲对象”。

当然,即使你使用服务器端缓冲区,足够多的小glDrawElements次呼叫也很容易成为性能瓶颈。

如果您的所有对象都是静态的,您可以将它们全部预转换,并将Nx支付给服务器上的内存。

如果您的对象是动态的,那么事情就更棘手了。 “Instanced”绘图(例如参见Direct-X的DrawInstanced)可能有所帮助,但我不相信GLES有这样的东西(“实例化”绘图也会在静态情况下节省内存)。

使用GLES 2.0,您可以尝试类似:

  • 将网格的M个副本放入顶点缓冲区,为每个顶点提供一个附加属性,该属性是副本的索引
  • 在顶点着色器中,从一个统一数组加载变换矩阵(或其中一部分是固定的),由附加属性索引

然后你可以进行N / M glDrawElements次调用,每次都在统一数组中设置M矩阵。目前尚不清楚这实际上会更快,因为(对于一个)硬件必须更加努力(索引制服不是超便宜)。另外,我认为在GLES 1.1中不可能有类似的东西。