【发布时间】:2013-05-14 06:06:01
【问题描述】:
我有一个需要渲染的关卡。它被分成数百个子网格,其中包含有关哪个子网格可以看到哪个子网格的信息。每个级别都有一个纹理池,所有这些子网格都可以引用。所有子网格都有按纹理排序的顶点。这是一个例子。
子网 1
索引[1, 3, 4, 5, 6, 2, 7, 8, 10...] 纹理 1
索引[12, 15, 16, 12, 13, 19] 纹理 2
当可能有 1000 个子网格和 20 个纹理时,即使考虑到可见性,纹理交换的数量也会变得荒谬。
我在 VBO 中按顺序排列了所有子网格。我一直在尝试找出优化渲染和消除所有不必要的纹理交换的最佳方法。如果我只是对 VBO 进行排序,我会丢失子网格连接,并且可见性数据变得无用。或者有更好的方法吗?
或者我应该根据可见性每帧创建一个索引列表还是太慢了?
编辑:这是我当前设置的细分。
所有顶点的 VBO 按顺序从子网格 1 纹理 1,子网格 1 纹理 2,一直到子网格 n,纹理 n。
我有一个 IBO,它只是所有网格的所有索引,以相同的相对顺序。
当我渲染时,我会参考子网格并有一个起始索引和计数,它们是该子网格和纹理的 IBO 中的起始索引,然后是具有该纹理的数字的计数。
这本质上就是为什么我要进行如此多的交换,这确实会减慢速度。
【问题讨论】:
-
是否有可能将这些纹理中的一些合并到一个更大的纹理中?
-
@Aleks 有可能。不过,我宁愿不使用纹理图集。
-
“纹理交换”是什么意思?您至少应该有 32 个纹理单元可供使用。
-
@Grimmy 每次在子网格中获得新纹理时,我都会使用 glBindTexture 绑定下一个纹理。
-
我会遍历可见性数据,生成要渲染的内容列表,然后通过渲染状态缩短该列表。最后,整个 vbo 只是一个按顺序访问的大数组(关于子网格),您不会在这里造成很多缓存未命中。