• Braulio Madrid

Blinn Phong óptimo y personalizable a nuestros modelos de iluminación.



Introducción.


En la anterior entrada del blog, habíamos hecho solo un modelo de iluminación, el clásico modelo Lambert pero con la posibilidad de seleccionar otras 2 alternativas. Ahora vamos a agregar el modelo Blinn Phong conocido comúnmente como iluminación especular. Este modelo generalmente se usa para materiales duros y macizos como plástico rígido pulido, porcelana, algunos metales, aquellos materiales que generalmente tiene un punto de luz muy intenso.


Para poder completar el Blog tutorial, debes haber leído el anterior, dejaré entradas relacionadas.


Preparación.


Si ya has venido del Blog anterior, ya tienes la escena preparada, de lo contrario por favor lee el blog anterior y completa el tutorial.

  • Abre el archivo CustomLighting.cginc.

  • Haz una copia del shader del Blog anterior.

CustomLighting.cginc

Vamos a hacer una copia del modelo de iluminación Lambert y a hacer algunos cambios


agrega un parámetro más: fixed3 viewDir y a cambiarle el nombre al modelo



para calcular la luz especular hay que obtener el vector medio entre el vector de luz y el vector de visión de la cámara. Ya tenemos el vector de luz gracias al modelo Lambert que es NdotL, vamos a calcular la vision NdotV y teniendo ambas calculamos el vector medio LdotV



Aquí LdotV es equivalente al vector medio HalfDir, ya lo que queda es hacer el calculo especular, que es cerrar la luz a un punto bien intenso y concentrado.



Usamos la función de potencia para elevar el resultado de LdotV y otro valor como exponente como 48 en la versión simple. En la versión personalizable elevamos a 128 * s.Gloss para controlar la concentración del punto y s.Specular para controlar la intensidad; Ya solo quedaría multiplicar el valor resultante de spec por algún color cualquiera.


Ahora tenga en cuenta que tanto s.Gloss y s.Specular son valores flotantes que van de 0 a 1, lo que sugiero para controlar tanto el color como estos dos valores de intensidad sería usar el canal alpha de la textura _MainTex en el shader; crear otra textura que contendrá el color del reflejo especular en el canal rgb y el canal alpha para controlar la intensidad. Esto es para que forme parte de un texture atlas y que no haya necesidad de crear cientos y cientos de materiales con configuraciones distintas, usando unas cuantas texturas que guarde la información del color especular y la intensidad, ya seria cuestion de manejar unas cartas de color para el cobre, porcelana, acero, madera. etc

ahora como quedaría el modelo de iluminación completo.


​​

Como podrás observar en el retorno el valor especular solo se le suma al Lambert, así como resultado tendremos un modelo que puede escoger el lambert a propio gusto.

vamos a abrir el archivo del Shader duplicado del Lambert anterior y vamos a modificar algunas lineas y guardar el resultado.


Verás un resultado similar al que se vé en la esfera.


Optimizando.


vamos a mejorar este modelo y a optimizarlo un poco más. Primero vamos a modificar unas cuantas líneas.


En el Blog pasado la función Lighting tenia 3 parámetros, SurfaceOutput, lightDir y atten, en el modelo especular se puede agregar a la función Lighting fixed3 viewDir, que es útil si queremos hacer otros modelos más complejos, pero en nuestro caso que vamos directo al calculo especular podemos cambiar viewDir por fixed3 halfDir, asi podremos deshacernos del calculo de NdotV y LdotV y reemplazarlo por NdotH.

Ahora cambie fixed3 viewDir, por fixed3 halfDir en los parámetros. Elimine las variables NdotV y LdotV y reemplazar por fixed NdotH y proceda a guardar para ver el resultado.

Ohhh Ohhh 😯 se quedó iluminado el centro que es la dirección de la vista, ¿que pasó aquí?


No hay de qué preocuparse, solo vamos a agregar la etiqueta halfasview despues de CustomBlinnPhong

#pragma surface surf CustomBlinnPhong halfasview


Cuando nosotros cambiamos el nombre del parámetro "viewDir" por "halfDir", realmente no hicimos nada, esto solo lo hicimos por convención, el producto punto entre la normal y el "halfDir" es como si lo hubiéramos hecho entre la normal y el "viewDir".


Cuando agregamos la etiqueta "halfasview", unity reemplaza el parámetro viewDir y lo trata como halfDir. Unity pasa este parámetro ya calculado por vértice en lugar de hacerlo por pixel, lo que garantiza mejor rendimiento.


Mejorando.


Vamos a hacer una opción que nos permita elegir el tipo de luz especular que queremos. aquí es necesario que repases los últimos 2 Blogs para esto. Lo que haremos es agregar un Drawer al shader para poder elegir.

volvamos al archivo CustomLighting.cginc y vamos a agregar las siguientes lineas donde estaba el calculo especular.

Así queda el modelo completo en la iluminación. ahora vamos a modificar el shader


Conclusión.


Ahora tenemos el casi el mismo shader anterior con las prestaciones que nos ofrecía, pero hemos agregado unos pocos cambios y ha quedado mejor.

Hemos descubierto el poder de la etiqueta half as view, permitiendo hacer más livianos nuestros modelos de iluminación.


Cada vez mejoramos en el uso de drawers y preprocesadores para hacer shaders mas prácticos como complejos.


Cada vez vemos mejora en el uso de la creación de archivos CGINCLUDE para poner dentro fragmentos de código que redundamos continuamente, cosa que nos permite depurarlo con el tiempo e ir mejorando.

© 2023 por Darkcom. Proudly created with Wix.com | Peñol, Antioquia, Colombia| +57 3113389725 | Politica de privacidad

  • GitHub
  • BMadrid
  • DarkcomDev
  • Darkcom.dev
  • Braulio-Madrid
  • YouTube Darkcom Tech
This site was designed with the
.com
website builder. Create your website today.
Start Now