3

我正在开发一款只有 2D 精灵的 3D 世界游戏(比如饥荒游戏)。(带有 C++ 的 OpenGL ES2)

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

这是我目前所拥有的:

  • 将我场景的所有元素重新排列到前面。
  • 将元素的顺序列表发送到渲染器。
  • 渲染器在他的批处理管理器中查看给定元素是否存在带有其材质的批处理。

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

  • 当所有批次都正常时,批次管理器为渲染器计算绘制命令。

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

图片在这里显示我的问题:图片图片

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

我怎么能做这样的事情?

4

1 回答 1

1

听起来您正在尝试针对两个相互排斥的目标优化渲染。

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

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

于 2014-02-05T11:10:42.867 回答