使用OpenGL的2D引擎:使用Z缓冲区还是自己实现精灵排序?

7
如果我要制作一个3D引擎,那么这个问题的答案就很清楚了:我会选择使用深度缓冲区而不是自己思考如何对所有多边形进行排序。
然而,在2D中情况就不同了,因为在这里可以很容易地实现层,而无需使用OpenGL - 你甚至可以在层内对精灵进行排序和移动(据我所知,这在OpenGL中是不可能的)。
以下是需要翻译的内容:
  • 我应该使用OpenGL深度缓冲区而不是运行在CPU上的C++层系统吗?
  • 深度缓冲区版本会慢多少?
对我来说,很明显在C++中制作一个层系统几乎没有性能影响,因为无论如何我都必须迭代渲染精灵。

完全由你决定,我认为...在使用DirectX制作2D瓷砖滚动引擎时,我选择用纯C++渲染自己的图层。然而,我的精灵也只包含了一个纹理(换句话说,阴影已经内置到帧中,我只有两个图层:瓷砖和精灵)。 - AJG85
3个回答

7

我建议您在软件中完成此操作,因为您可能想在精灵上使用透明度,这意味着您需要从后向前渲染它们。此外,对几个精灵进行排序不应该太耗费CPU。


5

如果可以的话,两种都使用。

深度信息对于后期处理和3D眼镜等效果非常好,因此不应该将其丢弃。这些效果对于2D游戏来说非常好。 此外,如果您按前到后绘制(不透明)图层,则可以节省填充率,因为Z缓冲区可以为您进行剪辑(深度测试比实际绘制更快)。 深度测试通常几乎是免费的,特别是当您拥有分层Z信息时。由于这个原因和填充率的节省,使用深度测试可能会更快。

另一方面,软件排序对于不透明精灵的前到后渲染非常好,而且必须正确执行alpha-blending(当然,您需要从后往前绘制这些精灵)。


4

直接的答案:

  • 允许GPU使用深度缓冲区,可以动态调整物体的绘制顺序,而无需进行任何CPU洗牌,并且在需要将物体分配到不同层中时,可以使您摆脱虚构的情况 - 例如,您可以拥有从背景发射并朝向玩家前方的效果(如弹道),而无需一直找出要将它们分配到哪个层
  • 在GPU上,即使您在使用嵌入式芯片、十多年前的插件卡或集成部件,使用深度也不会产生任何可测量的影响。它们对于现代GPU来说是如此基础,以至于它们已经被优化到实际意义上的零成本。

但是,我想您实际上希望在CPU上执行此操作,原因很简单,即正确处理透明度。深度缓冲区每个像素存储一个深度值,因此,如果您绘制一个近乎透明的对象,然后尝试在其后面绘制某些内容,则其后面的内容将不会被绘制,即使它应该是可见的。在2D游戏中,抗锯齿会给您的精灵带来部分透明的边缘;如果您按绘制顺序将绘图提交给GPU,则您的部分透明度始终会被正确合成。如果您让z缓冲区来处理,则可能会出现奇怪的边缘效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接