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:
- El código fuente de Android no funciona, el búfer de marco de lectura a través de glReadPixels
- Android texturas blancas opengl en la variante de Samsung Galaxy
- Cómo acelerar la carga / compilación de shader en Android
- ¿Cómo puedo extraer las normales, las texturas, los vértices, los índices del archivo .obj de la licuadora al archivo .h?
- Cómo crear una textura OpenGL de matriz de bytes en Android
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.
- 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?
- 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.
- 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.
- 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.
- 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!
- ¿Cómo acceder al contexto de renderizado de OpenGL en Android con Delphi XE5?
- Dibuja animaciones de alta resolución con alta velocidad de fotogramas en Android
- Cómo crear un mapa interactivo en Android
- Android OpenGL Renderizar a un frameBuffer en la resolución original (pequeña) y luego escalarla (viewPort) al tamaño de la pantalla
- Cómo hacer una cámara personalizada con Live Stickers
- Voltear eje Y en OpenGL ES?
- Portar el juego opengl de c ++ a android e IOS de la manera más fácil
- Recibe la entrada completa de unicode android en C / C ++
Esas son algunas opciones bien pensadas, aquí están mis pensamientos sobre cada uno
- 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.
- 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.
- 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.
- A menos que realmente necesita sombras de alta calidad (y el método anterior no es suficiente) no recomendaría esto.
- 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!
- Proporcionar icono a selector de sistema a través de ChooserTargetService, FileProvider y grantUriPermission
- Android: URL especial para abrir Marketplace a una aplicación específica?