我应该如何排序对象?通过着色器或网格?

时间:2012-08-22 08:15:15

标签: sorting opengl-es drawing

为了最小化状态变化的数量,我应该对网格的绘制顺序进行排序。无论如何如果我有多个网格使用多个着色器,我需要选择顶点属性绑定或着色器统一参数之一进行排序。

我应该选择什么?我认为由于GPU缓存命中率,我必须选择最小化顶点属性更改,但我不知道着色器更改成本。决定绘图顺序时一般关注的是什么?我可以选择一些基础吗?

PS。我的目标是iOS / PowerVR SGX芯片。

修改

我决定按材质排序,因为许多网格物体只会使用一些材质,但是要绘制一堆网格物体。这意味着我将有更多机会共享材料而不是共享网格。因此,它将有更多机会减少状态变化计数。无论如何我不确定,所以如果你有更好的意见,请告诉我。

2 个答案:

答案 0 :(得分:3)

您不需要对PowerVR SGX上的不透明对象进行深度排序,因为它使用与顺序无关的像素完美隐藏表面移除。 深度排序只是为了实现适当的透明度/半透明度渲染。

SGX的最佳做法是按州按顺序排序:

  • 视口
  • 帧缓冲
  • 着色
  • 纹理
  • 剪裁,混合等

使用纹理图集可以显着减少纹理状态的变化。 可以通过批处理来减少绘制调用的数量。

这就是黄金法则,请记住,您应首先进行分析,然后进行优化:)

请参阅: http://www.imgtec.com/powervr/insider/docs/PowerVR.Performance%20Recommendations.1.0.28.External.pdf

答案 1 :(得分:1)

使用类似http://realtimecollisiondetection.net/blog/?p=86之类的内容,然后您可以在运行时更改代码中首先排序的部分,以实现每台设备的最佳速度