El motor de unity por sí misma ya dispone de una niebla mucho más completa que la que haremos a continuación, la idea de este blog es demostrar cómo funciona la niebla en los videojuegos, será muy básica usaremos lo aprendido en el capítulo anterior y tendrá un uso muy similar a como funciona la niebla de los juegos de playstation antiguos.
Preparando la Script de cámara
Si has seguido el blog anterior, solo reutiliza la script de TestRendering.cs, sino visita el Blog anterior donde hacíamos uso de la textura de profundidad.
Creando el shader
Como propiedades lo único que cambia es el color de la niebla
Agregamos las propiedades dentro de las variables del shader
Ahora será agregar la función fragment , en esta función vemos como es prácticamente el mismo shader, la diferencia es que reemplazamos la imagen compuesta que construimos para hacer el blur, solo por un color sólido y constante.
Bien eso seria todo, si bien es un shader super simple hay que tener en cuenta algunas cosas, la niebla de unity tiene la particularidad que afecta a todos los objetos sólidos sacando de la lista los skyboxes, este shader no hace eso.
Este sería el shader completo.
Si bien había advertido en el blog anterior que el uso del Depth Texture puede afectar el rendimiento en móviles o en plataformas poco potentes, esto se podía mitigar aprovechando el uso de la misma textura para derivar varios efectos a partir de esta, esto no quiere decir que mejore el rendimiento, pero al menos no cometes el error que comete unity de mandar la misma textura a shaders distintos, haciendo que cada una cree un espacio en memoria comiéndose la VRAM poco a poco, milisegundo a milisegundo, lo que digo es que si vas a penalizar tu dispositivo usando esta textura, al menos aprovecha lo mejor que puedas, sacarle todo el jugo y aprovecha de usar más efectos usando el mismo shader.
A continuación les dejo otro shader de niebla que es más rápido que se puede usar en dispositivos poco potentes, pero este no es un efecto de cámara, este shader lo aplicas directamente al material del objeto, lo que implica tener que agregar el mismo shader una y otra vez a cada uno de los objetos de tu escena.
float fogz = mul(UNITY_MATRIX_MV, v.vertex).z;
Lo que hace básicamente este shader es multiplicar la matriz del mundo por la matriz del vértice para obtener una posición en el mundo, pero solo tomando el eje z
o.fog = saturate((fogz + _FogStart) / (_FogStart - _FogEnd));
Luego usa fogz y valores de inicio y fin, para normalizar la futura niebla entre un valor de 0 a 1 , esta sería otra de las fórmulas que aplica niebla de unity, aplicando un inicio y un fin a la niebla, pero hay algo que diferencia esta fórmula de la que usa unity. La de unity está limitado por los planos far y near de la cámara y usa una textura que basa su gradiente en entre estos 2 valores, este shader en cambio tiene toda la libertad de irse tan lejos como quiera porque no está limitado al área de dibujado y respeta el skybox sin penalizar el rendimiento.
Este shader es una alternativa, el anterior es una alternativa que puede mejorarse mucho, un ejemplo seria que usar dispersión rayleigh para hacer que la intensidad y el color de las luces afectara el color de la niebla o que la niebla tenga ruido simulando estar particulado.
Hasta otra, nos vemos en el siguiente blog
Comentarios