批量和对象的转换

我试图在我的游戏(Sprite批处理和3D网格批处理)中实现批处理,我已经阅读了很多文档,但我不明白:

  • 当每个对象都有自己的转换(旋转,位置,缩放)时,我怎样才能将它与其他几何体合并?
  • 当每个对象使用混合时,我怎样才能达到配料的深度?

谢谢!

批量转换

当你的配料的几何结构很简单 – 比如使用只有4个顶点的精灵时 – 通常在将顶点放入一个批处理之前,通常转换为共享坐标系。 通常这是相机空间或屏幕空间。

几何结构的简单性意味着执行此操作的CPU端仍然是一个可以忽略的过程,并且很容易并行化。 随着几何形状变得越来越复杂,成本/收益率下降,突然分开的绘制调用看起来更具吸引力。

我还没有尝试过的一个解决scheme是为每个网格提供顶点着色器的世界视图matrix,并为每个顶点添加一个ID,以便知道每个顶点使用哪一个顶点。

阿尔法混合

我不太清楚“达到深度”是什么意思。 在这个例子中,你仍然可以保持深度testing和写入到深度缓冲区,但这会导致透明几何体遮挡其他几何体,除非其他几何体先被绘制。 换句话说,一个窗口可能会阻止一些东西被绘制到屏幕上。 欲了解更多信息查看本文由肖恩哈格里夫斯。

因此,在绘制透明几何graphics时,通常禁止写入深度缓冲区,但保持深度testing处于活动状态。 这意味着透明几何graphics仍然可以被不透明几何体遮挡,但是本身不会遮挡任何东西。 你必须小心,如果你绘制透明的几何graphics,而不写入z缓冲区,然后绘制不透明的几何graphics,你可能会结束绘制顶部。

想象一下,绘制一个天空盒,然后是一个窗口。 如果稍后在窗口后面画一棵没有alpha混合的树,它将被绘制在窗口的顶部。

正如肖恩所言:

The most common approach: 1. Set DepthBufferEnable and DepthBufferWriteEnable to true 2. Draw all opaque geometry 3. Leave DepthBufferEnable set to true, but change DepthBufferWriteEnable to false 4. Sort alpha blended objects by distance from the camera, then draw them in order from back to front