排序子网/ VBO

Pla*_*oks 0 c++ opengl sorting vbo

我有一个我需要渲染的关卡.它分为数百个子网,其中包含哪些子网格可以查看哪个子网格的信息.每个级别都有一个纹理池,所有这些子网都可以引用.所有子网格都有按纹理排序的顶点.这是一个例子.

子网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中该子网格和纹理的起始索引,然后是计数,即具有该纹理的数字.

这就是为什么我做了如此多的交换,这实际上是在放慢速度.

Nic*_*las 5

具有所有顶点的VBO按顺序从子网格1纹理1,子网格1纹理2,一直到子网格n,纹理n运行.

这是你的问题."submesh"应该是单个渲染调用,而不是多个渲染调用.每个"子网格"应该相当于你的"子网格X,纹理Y"对.特定的子网格使用一组特定的glVertexAttribPointer调用,glBindTexture调用和一次glDrawElements调用来进行渲染.

此方案中的每个子网格都使用特定纹理.因此,您可以按照它们使用的纹理对绘制顺序进行排序.所以使用纹理1的所有子网格都可以同时渲染,只glBindTexture需要在它们之间进行一次调用.

为了获得最佳性能,因为所有"submeshes"都使用相同的缓冲区(因此,它们都使用相同的顶点格式是一个很好的改变),您还应该尝试使用glDrawElementsBaseVertex渲染特定的"子网格",而不是制作单独glVertexAttribPointer调用每个子网格.

这个想法是让你的VBO有效地成为一个长数组,所有子网格的顶点都在同一个数组中.每个子网格存储其索引数据的基本偏移量,要渲染的顶点数量,以及基本顶点偏移量,它表示子网格数据在大数组中的起始位置.

在渲染所有子网格的开始,您进行glVertexAttribPointer调用.然后,它只是glBindTextureglDrawElementsBaseVertex从那时起.你不会glVertexAttribPointer为每个子网格都打电话.您可以使用BaseVertex定义每个子网格数据来自VBO的位置.