OpenGL ES,Z-Buffer,2D精灵,丢弃,性能

时间:2016-07-05 02:42:17

标签: performance opengl-es 2d shader alpha

我有一个复古的2D游戏,有很多精灵(让人想起世嘉的Super Scaler拱廊),不使用半透明。我曾考虑使用Z-Buffer进行排序以简化操作。好的,但默认情况下,即使alpha为零,也会对Z缓冲区进行写操作,从而产生如下所示的效果:

http://i.stack.imgur.com/ubLlp.png

现在,由于我在OpenGL ES 2中,我没有进行alpha测试,所以根据我的理解,我唯一可能是丢弃片段着色器中的像素,如果alpha为0,那么它就不会得到写入Z-Buffer。但就性能而言,这是错误的:不仅if很慢,而且discard基本上杀死了目的,因为它禁用了早期的深度测试,结果比在软件中做的更糟糕。

if (val.a < 0.5) {
    discard;
}

我可以使用哪种其他方法不会破坏性能?所有的2D游戏都会自己排序精灵而不是使用深度缓冲吗?

1 个答案:

答案 0 :(得分:0)

这真的是一种权衡。如果让z-buffer进行排序并在着色器中使用discard,那么因为你所说的分支和后期深度测试,它在GPU上的成本更高。

如果您自己进行深度排序,那么您会发现以最佳顺序发出您的绘制调用会更加困难(例如,您将不断更改纹理)。 GLES2上的绘制调用在低端设备上具有非常显着的CPU命中率,并且计数可能会增加。

如果性能是一个很大的问题,那么第二个选项可能更好,如果你在纹理图谱前面加大力度来减少你的绘制调用次数,如果你的精灵分辨率很低,这可能会特别有效复古精灵,因为你可以为每个纹理图集获得很多精灵。它不是一个明显的赢家,我可以想象不同的游戏采取不同的方法。

此外,您应该考虑到绝大多数目标硬件将执行您选择的任何路径,并且您可能只需选择更快实现的路径并使您的代码更简单(可能是让z缓冲区进行排序)。

如果您喜欢技术挑战,我通常认为最好的方法可能是将您的精灵划分为完全不透明的部分和具有透明度的部分,并将这两个部分渲染为单独的网格(他们不会成为继续四边形)。您必须进行大量预处理并绘制更多三角形,但通过使用完全不透明的部分进行渲染,您可以利用所有iOS设备中的隐藏表面移除技术和很多Android设备。当然,通过这样做,您应该能够降低填充率负担,但代价是增加绘制调用,并且代码和工具可能会增加不必要的大量复杂性。

相关问题