使用z-index排序渲染不透明和透明2D精灵

时间:2017-07-17 08:47:56

标签: opengl 2d z-index

作为我的2D游戏引擎的一部分,我希望能够通过操纵他们的z-index来设置我的精灵在屏幕上呈现的顺序(从后到前)。这个z-index精灵属性是一个浮点值,可以在我的正投影的远和近平面之间(范围为(-1.0, 1.0])。

目前,为了尽量减少不必要的纹理切换,我将精灵存储在一个无序字典中,其中键是纹理,值是使用该特定纹理的精灵四边形的相应有序列表。然后,每帧对该字典进行解析,以使用所有适当的每顶点属性(positiontexcoordsmat4 modelview matrix)填充巨型VBO。这很好,因为我只需要为每个纹理制作一个纹理绑定,我对它的性能非常满意。

虽然这个z排序问题一直存在于我的代码中,但当我使用半透明纹理并启用alpha混合时,它变得非常明显,因为渲染精灵的顺序错误导致一些精灵出现不透明!经过一些测试,我得出以下结论:

  1. 我的纹理键的顺序很重要,因为这决定了首先将哪些相应的精灵列表写入我的巨型VBO。这基本上意味着第一个纹理的所有精灵都出现在第二个纹理的所有精灵下面。
  2. 如果两个精灵具有相同的纹理,那么与该纹理关联的精灵列表中两个精灵的相对顺序很重要(第一个精灵再次出现在底部)。
  3. 如果我拨打glEnable(GL_DEPTH_TEST),那么我需要按递增顺序设置z-index以匹配精灵列表的顺序;否则我得到错误的不透明的精灵。
  4. 如果我拨打glDisable(GL_DEPTH_TEST),那么我为精灵设置的z-index值(显然)会被忽略,因此只有规则1和2适用。
  5. 我的问题是,给定一组各种纹理的半透明和不透明的精灵,我怎样才能最好地在每个帧中在我的巨型VBO中命令我的精灵以最小化纹理变化?规则是否不同处理不透明和半透明的精灵(并且它们应该在单独的通道中处理)?我还读到OpenGL中的alpha混合函数是依赖于顺序的,并且有一些与顺序无关的技术可以用来解决这个问题,但这已经超出了我的想象,所以任何可以在这些类型上流下的光技术也将受到赞赏。

0 个答案:

没有答案