在3D世界中使用Alpha混合的Z顺序

时间:2014-02-04 11:16:45

标签: c++ opengl alphablending batching

我正在开发一个只有2D精灵的3D世界游戏(比如Do not Starve游戏)。 (OpenGL ES2 with C ++)

目前,我在没有批量绘制元素之前将元素重新排序到前面(因此1个元素= 1个drawcall)。我想在我的框架中实现批处理以减少绘制调用。

这就是我现在所拥有的:

  • 将我场景的所有元素都排在前面。
  • 将元素的订单列表发送给渲染器。
  • 如果给定元素的材料存在批次,则渲染器会查看其批处理管理器。

    • 批次不存在:创建一个新的。
    • 具有此材料的元素存在批处理:将精灵添加到批处理中。
  • 使用每个批次的所有精灵计算大网格(1种材料类型= 1批次)。

  • 当所有批次都没问题时,批处理管理器会为渲染器计算绘图命令。

  • 渲染器处理绘制命令(绑定着色器,绑定纹理,绑定缓冲区,绘制元素)

图片显示我的问题:Image Image

但是我遇到了一些问题,因为对象可能在另一批中的另一个对象后面。

我该怎样做?

1 个答案:

答案 0 :(得分:1)

听起来你正试图优化两个互斥目标的渲染。

  • 按排序的Z顺序渲染以产生正确的透明度结果
  • 按材质类型分组的渲染,可能是为了减少切换材料产生的GL状态变化次数。

其中一个必须优先于另一个。由于Z排序对于透明度的正确显现至关重要,因此您可能必须优先考虑。完成后,您仍然可以在Z顺序中批量处理相同材料的项目。