Sombras de OpenGL ES para los sprites 2D

Tengo una escena de OpenGL renderizada con un montón de sprites, y me gustaría añadir automágicamente sombras a todos ellos. Aquí hay una foto que muestra lo que quiero decir:

Introduzca aquí la descripción de la imagen

La escena utiliza la proyección ortográfica, los sprites son cuadrantes texturizados, y estoy usando el buffer de profundidad para dibujarlos de adelante hacia atrás. Estoy trabajando con OpenGL ES 2.0, pero los pensamientos de los mundos iOS o no-ES sería apreciado también. He arrojado algunas ideas alrededor en mi cabeza de cómo puedo ir sobre esto, y me gustaría descubrir cuál tiene la mayoría de la promesa.

  1. Dibuja cada sprite dos veces, el primero normalmente, el segundo con algún tipo de sombreado sombra un poco más profundo en la escena. ¿No está seguro si esto es posible?
  2. Dibujar un sprite, luego dibujar de nuevo, oscurecido y con algunos alfa, varias veces con un poco de jitter al azar aplicado a las verticies. Esto puede parecer tonto y no como una sombra.
  3. Dibuja la escena base sin fondo a una textura, luego desenfoca y oscurece para crear una gran sombra. A continuación, dibuje la escena base sobre la textura de la sombra, luego finalmente sobre el fondo. Esto perdería las sombras entre los sprites, sin embargo.
  4. SSAO en un pase de post-procesamiento. Podría ser el más dinámico y automático, pero podría ver borrosa / granulado y muy lento las cosas.
  5. En el momento de la creación, genere una textura de sombra para cada sprite. Para renderizar, dibuje un sprite y luego su sombra texuture un poco más profundo en la escena. Creo que me gustaría evitar esto debido al tiempo de carga y requisitos adicionales de memoria, pero esto puede ser el más rápido y mejor mirando?

No quiero hacer ningún trabajo de sombra con texturas externas, ya que uso las mismas texturas de sprite a diferentes escalas, y las sombras precocinadas escalarían naturalmente.

¿Así que cualquiera de ellos es mejor que los demás? ¿Hay otras opciones en las que no estoy pensando? ¡Gracias!

Esas son algunas opciones bien pensadas, aquí están mis pensamientos sobre cada uno

  1. Definitivamente es posible usar un shader pero puede que no sea la opción más eficaz, ya que el borrado tendrá que ser hecho dentro del shader y podría implicar múltiples búsquedas de texturas.
  2. Dibujar la textura varias veces funcionaría y se vería como una sombra, porque cada imagen "jittered" tendría valores alfa ligeramente modificados. Pero de nuevo, la mezcla y múltiples rendimientos de cada sprite se sumarían y podrían afectar el rendimiento.
  3. Me gusta y recomiendo esta opción, ya que se puede configurar un sombreado que coloque píxeles negros en vez de píxeles de color (considerando alfa) en un destino de renderizado más pequeño que la pantalla (1 / 4th?) Y luego use esto como textura de sombra. Puesto que la textura ahora se está estirando, usted conseguiría el "borroso" para libre, también. El sombreado de píxeles que hace el "ennegrecimiento" sería muy simple y no afectará el rendimiento demasiado.
  4. A menos que realmente necesita sombras de alta calidad (y el método anterior no es suficiente) no recomendaría esto.
  5. Esta es, por supuesto, la opción más flexible y tiene una complejidad de renderizado x2. Desafortunadamente, consumirá más memoria que todas las otras opciones anteriores.

¡Espero que esto ayude!

  • Conversión YUV a RGB y visualización utilizando opengl es 2.0 de android ndk usando shaders
  • ¿Cómo incrustar texto durante la grabación de vídeo en Android?
  • Simulación de swaps de paletas con Shaders OpenGL (en LibGDX)
  • OpenGL y 9 trazos desmontables
  • OpenGLES en Android - IllegalStateException: setRenderer ya ha sido llamado para esta instancia
  • Error: glBufferData usando Cordova
  • Android - OpenGL ES 2.0: Emulador (Works) - Dispositivo (no)
  • OpenGL ES 2 no funciona en Android API23
  • Pinch-Zoom con GLSurfaceView
  • Cómo hacer la detección de objetos en opengl Android?
  • Dibuja Pixel con OpenGLEs para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.