作为我的2D游戏引擎的一部分,我希望能够通过操纵他们的z-index
来设置我的精灵在屏幕上呈现的顺序(从后到前)。这个z-index
精灵属性是一个浮点值,可以在我的正投影的远和近平面之间(范围为(-1.0, 1.0]
)。
目前,为了尽量减少不必要的纹理切换,我将精灵存储在一个无序字典中,其中键是纹理,值是使用该特定纹理的精灵四边形的相应有序列表。然后,每帧对该字典进行解析,以使用所有适当的每顶点属性(position
,texcoords
和mat4 modelview matrix
)填充巨型VBO。这很好,因为我只需要为每个纹理制作一个纹理绑定,我对它的性能非常满意。
虽然这个z排序问题一直存在于我的代码中,但当我使用半透明纹理并启用alpha混合时,它变得非常明显,因为渲染精灵的顺序错误导致一些精灵出现不透明!经过一些测试,我得出以下结论:
glEnable(GL_DEPTH_TEST)
,那么我需要按递增顺序设置z-index
以匹配精灵列表的顺序;否则我得到错误的不透明的精灵。glDisable(GL_DEPTH_TEST)
,那么我为精灵设置的z-index
值(显然)会被忽略,因此只有规则1和2适用。我的问题是,给定一组各种纹理的半透明和不透明的精灵,我怎样才能最好地在每个帧中在我的巨型VBO中命令我的精灵以最小化纹理变化?规则是否不同处理不透明和半透明的精灵(并且它们应该在单独的通道中处理)?我还读到OpenGL中的alpha混合函数是依赖于顺序的,并且有一些与顺序无关的技术可以用来解决这个问题,但这已经超出了我的想象,所以任何可以在这些类型上流下的光技术也将受到赞赏。