OpenGL ES 2D - z-ordering,深度缓冲区 vs 按顺序绘制

10

我对OpenGL完全不了解,所以如果这是一个愚蠢的问题请见谅。另外不知道是否有影响,我使用的是OpenGL ES 1.1。

目前我按纹理顺序绘制精灵,因为我读过这样做可以提高性能(有道理)。但是现在我在思考是否这种方式正确,因为我需要某些精灵无论纹理如何始终处于其他精灵之前。

就我所知,我的z-ordering选项要么启用深度缓冲区并使用它,要么更改绘制顺序,使精灵按z值的顺序绘制。

我读过深度缓冲区可能会影响性能,但更改顺序也会有影响。我应该怎么做?

Translated:

我完全不了解OpenGL,如果这是个愚蠢的问题请见谅。另外我使用的是OpenGL ES 1.1,不确定是否有差别。

目前我按照纹理的顺序来绘制精灵,因为我读过这样做可以提高性能(很有道理)。但是现在我开始思考是否这种方式正确,因为我需要某些精灵始终位于其他精灵的前面,而不管它们的纹理如何。

据我所知,实现z-ordering的方式要么是启用深度缓冲区并利用它,要么就是更改绘制顺序,让精灵按照z值的顺序来绘制。

我读到过深度缓冲区可能会影响性能,但更改顺序也会有影响。那我应该怎么做呢?


1
由于每个合理的OpenGL应用程序都使用深度缓冲区(除了可能是一个简单的“绘制单个2D纹理”的示例),我猜你应该真正地将这个“性能损失”语句降低一点(即使是真的)。 - Christian Rau
一个选择是绕过整个问题,使用像Cocos2D这样的框架。它会帮你处理OpenGL的负担。它支持精灵的z-ordering,并且可以通过使用CCSpriteBatchNode来重复使用精灵的纹理。(虽然没有办法交错批处理纹理绑定和z-order更改。) - Graham Perks
我做这个游戏更多是为了学习而不是其他任何目的,所以我决定从零开始。 - Dan2552
1个回答

9
简单来说,就是对精灵进行排序。
听起来你正在创建一个非常基于2D的东西,虽然z缓冲可以是一个非常有用的工具,但如果硬件不支持它,并且如果你实际上没有使用可能相交的3D对象,那么它对性能的影响会很大,对我来说这并不太合理。
此外,如果你有任何部分透明的精灵,即具有alpha值不为0或255(或使用浮点数时不为0.0或1.0)的像素,则必须进行排序。
另外,我认为更改“sprites”时损失的性能仅在切换表面时发生,并且只有很少的情况。一种帮助减轻这个问题的方法是尽可能多地将不同的精灵放在一个图像中,放在网格上,并使用你的表面的小块作为精灵。

由于OpenGL主要用于3D(即使是ES),我猜如果硬件不支持硬件深度缓冲区,那么它就不支持硬件加速的OpenGL ES,对吗? - Christian Rau
我认为任何iOS设备都支持它(我可能错了)。不过你提出了一个很好的观点,因为这是一个基于瓦片的游戏,所有的瓦片都将在单个图像瓦片地图中 - 因此,渲染顺序问题不应该影响它? - Dan2552
不错,当你在内存中更改所使用的图像时,切换表面涉及到的速度问题只会出现在这种情况下。实际上,只有在视频内存耗尽的情况下才会出现这个问题。真正的问题是当OpenGL空间不足并且需要从视频内存中卸载图像,然后加载新的图像时。 - Mike Buland
1
我对这个论点并不完全信服。我以前曾因纹理交换而遭受“巨大的性能损失”。实际上进行一些调查会很好。如果可以检测到硬件z缓冲区支持,那么可能需要实现两种解决方案,并切换到最合适的方案。 - Matt Esch

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