Batching y Z-order con Alpha blending en un mundo 3D

Estoy trabajando en un juego en un mundo 3D con sprites 2D solamente (como el juego Do not Starve). (OpenGL ES2 con C ++)

Actualmente, ordero elementos de atrás hacia delante antes de dibujarlos sin lote (por lo tanto, 1 elemento = 1 drawcall). Me gustaría implementar el procesamiento por lotes en mi marco para disminuir las llamadas al sorteo.

Esto es lo que tengo por el momento:

  • Ordene todos los elementos de mi escena al frente.
  • Enviar list de order de elementos al Renderer.
  • Renderer busca en su administrador de lotes si existe un lote para el elemento dado con su Material.

    • El lote no existía: crea uno nuevo.
    • Lote existe para elemento con este Material: Agregue sprite al lote.
  • Calcule la malla grande con todos los sprites para cada lote (1 tipo de material = 1 lote).

  • Cuando todos los lotes están correctos, el gestor de lotes calcula los commands de extracción para el procesador.

  • Renderizar processs dibujar commands (vincular sombreado, unir texturas, unir búferes, dibujar elemento)

Imagen con mi problema aquí:

enter image description here

Pero tengo algunos problemas porque los objects pueden estar detrás de otros objects dentro de otro lote.

¿Cómo puedo hacer algo así?

Un lote de sprites significa que todos los sprites del lote existen en la misma distancia Z. Eso significa que no es posible que un sprite del lote A esté entre dos sprites del lote B. Cuando eso sucede, los dos sprites del lote B no pertenecen realmente al mismo lote y deben dibujarse por separado.

Podrías hacer algo como esto:

  1. Revisa la list de sprites de atrás hacia adelante

    1.1 sprite ya renderizado -> siguiente

    1.2 verificar si el 2d sprite se extiende colisionando con cualquier sprite en el lote actual o con cualquier sprite que llegue antes de este que aún no está marcado como renderizado (parcialmente superpuesto)

    VERDADERO : continúa con el siguiente sprite; renderizar el sprite actual con el lote actual puede ocasionar problemas de sorting

    FALSO : agregue sprite a lote y marque como renderizado (p. Ej .: indicador)

  2. renderizar y borrar lotes actuales

  3. aún cualquier sprite no marcado como renderizado? Reanudar a 1.

Esto conducirá a un resultado libre de errores con llamadas de sorteo muy networkingucidas. Nota: para materiales múltiples necesita mantener múltiples lotes de sprites durante este ciclo, pero el algorithm básicamente permanece igual.