【问题标题】:2D engine with OpenGL: Use Z buffer or own implementation for sprite sorting?带有 OpenGL 的 2D 引擎:使用 Z 缓冲区或自己的实现进行精灵排序?
【发布时间】:2011-04-07 15:26:04
【问题描述】:

如果我正在制作 3D 引擎,那么这个问题的答案就很清楚了:我会选择使用深度缓冲区,而不是考虑自己对所有多边形进行排序。

然而,这是 2D 的不同情况,因为这里的层可以在没有 OpenGL 的帮助下轻松实现 - 然后您甚至可以在层内对精灵进行排序和移动。 (这在 OpenGL afaik 中是不可能的)

  • (为什么)我应该使用 OpenGL 深度缓冲区而不是 CPU 上运行的 C++ 层系统?
  • 深度缓冲区版本会慢多少?

我很清楚,在 C++ 中创建一个层系统会产生几乎没有性能影响的效果,因为在任何情况下我都必须迭代 sprite 以进行渲染。

【问题讨论】:

  • 我想这完全取决于你……在 DirectX 中制作 2D 平铺滚动引擎时,我选择用纯 C++ 渲染我自己的图层。然而,我的精灵也由一个纹理组成(换句话说,阴影内置在框架中,我只有 2 层瓷砖和精灵)

标签: c++ opengl 2d layer


【解决方案1】:

我建议您在软件中执行此操作,因为您可能希望在精灵上使用透明度,这意味着您从后到前渲染它们。对几个精灵进行排序也不应该对 CPU 要求很高。

【讨论】:

    【解决方案2】:

    如果可以的话,两者都用。

    深度信息非常适合后期处理和 3D 眼镜之类的东西,所以你不应该把它扔掉。这些效果对于 2D 游戏来说非常好。 此外,如果您从前到后绘制(不透明)图层,则可以节省填充率,因为 Z-Buffer 可以为您进行裁剪(深度测试比实际绘图更快)。 深度测试通常几乎是免费的,尤其是当您获得分层 Z 信息时。由于这一点以及填充率的节省,使用深度测试可能会更快。

    另一方面,软件排序很好,因此您实际上可以对不透明的精灵进行从前到后的渲染,并且必须正确地进行 Alpha 混合(当然,您将这些精灵从前向后绘制)。

    【讨论】:

      【解决方案3】:

      直接回答:

      • 允许 GPU 使用深度缓冲区将允许您动态调整事物的绘制顺序,而无需任何 CPU 上的洗牌,并且在这样做有点麻烦的情况下,您不必将事物分配给不同的层虚构——例如,您可以制作诸如从背景射向玩家前方的投射物之类的效果,而无需始终弄清楚将它们分配给哪一层
      • 在 GPU 上,使用深度不会产生可测量的效果,即使您使用的是嵌入式芯片、十多年前的插卡或集成部件;它们对于现代 GPU 来说是如此的基础,以至于它们已经被优化到实际上不花费任何成本

      但是,我想您实际上想在 CPU 上执行此操作,原因很简单,即正确处理透明度。深度缓冲区为每个像素存储一个深度,因此如果您绘制一个近乎透明的对象,然后尝试在它后面绘制一些东西,即使它应该是可见的,后面的东西也不会被绘制。在 2d 游戏中,抗锯齿可能会使您的精灵边缘部分透明;如果您按绘制顺序将绘图提交给 GPU,那么您的部分透明度将始终正确合成。如果你让 z-buffer 去做,那么你可能会看起来很奇怪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-27
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-06
        相关资源
        最近更新 更多