Shaders en Project DarkHeaz

Programando un motor 3D desde cero - Brakeza3D

Shaders en Project DarkHeaz

Buenas a tod@s, en el último post hablamos de los shaders y presentamos algunas de las posibilidades que estos ofrecían.

En las últimas semanas he estado experimentando con diversos shaders, adquiriendo algo de experiencia que me permitiese mejorar la experiencia gráfica de Brakeza3D y especialmente de Project DarkHeaz.

La realidad, es que el resultado de rasterización de geometría por sí sólo, puede resultar tosco y plagado de imperfecciones que saltan a la vista (dientes de sierra, por ejemplo…). Es en este escenario, donde los shaders pueden aportarnos soluciones tan originales como seamos capaces de implementar.

La buena noticia es que disponemos de con una comunidad notable, que está desarrollando increibles efectos en código abierto constantemente. En última instancia, ChatGPT es bastante efectivo implementando e interpretando código de shaders.  

En este artículo os presentaré los avances en materia de shaders aplicados a Project DarkHeaz. Os recuerdo que todo el código lo podréis encontrar en el repositorio de GitHub.

Shader para imágenes de fondo

Puede parecer matar moscas a cañonazos, pero pintar una imagen de fondo mediante un shader, nos da ciertas ventajas. En Project DarkHeaZ las imágenes de fondo se mueven en conjunción con la nave de nuestro personaje, generando una sensación de movimiento.

Estas imágenes son por tanto mayores que nuestra resolución de juego. El shader se encargará de dibujar en pantalla la porción de la imagen que corresponda basándose en un “offset” que proporcionaremos al shader y dependerá de la velocidad de nuestro personaje.

También aplico un leve efecto “onda sinusoidal” para generar sensación de movimiento y una variación en la paleta de colores RGB a lo largo del tiempo.

Shader para las barras laser (stamina, energía, disparos)

En el gameplay existen multitud de “lasers”. Algunos corresponden al HUD, otros son elementos de juego como los disparos en pantalla. 

El laser puede ser configurable en potencia, color dirección y velocidad. Además el laser se mezcla con una textura de fondo que permite entender la velocidad del laser, es decir, sus partículas en movimiento.

Shader de parpadeo de personajes

Gracias al buffer stencil generado en la renderización de la geometría, podemos delegar en un shader, la tarea de parpadeo muy habitual en este tipo de juegos para representar daño, o algún tipo de efecto de inmunidad sobre el personaje.

Shader de imágen con máscara alpha

En el juego Project DarkHeaZ existen elementos como “monitores”, donde queremos aplicar un efecto sin que el resto del render se vea afectado en absoluto. Conseguiremos estos efectos, enviando y procesando a nuestro antojo estas máscaras en el shader.

De este modo, se puede ver que las pantallas del juego muestran un grid, con efecto scroll. Dicho grid sólo es visible en la porción de la imagen de “máscara” le permite. Una imagen vale más que mil palabras:

Shader de filtro bilinear

El suavizado de pixels es recomendable para evitar los mencionados efectos de dientes de sierra y para generar una mejor sensación de mezclado entre objetos al renderizarse. La técnica básica es que el color del pixel procesado es la media de sus pixeles vecinos

Shader para las ondas gravitacionales

Project DarkHeaz pretende ser un juego de naves espaciales, qué mejor sitio para utilizar el efecto de desplazamiento de onda, tanto para movimientos especiales como para explosiones, dando la sensación de perturbación en el espacio.tiempo.

Shader para el desenfoque de profundidad

Este shader es uno de los más interesantes, dedicaremos un post específicamente a él. En realidad se explica fácilmente: Enfoca el render a una profundidad de plano específica, desenfocando el resto en proporción a la distancia del plano focal. Resulta un efecto muy interesante para restar importancia a elementos del background, que de otra forma capturarían la atención del juegador innecesariamente.

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *