top of page
Foto del escritorBraulio Madrid

Qué hay detrás del shader de superficie Standard


Modelo de iluminación Estándar de unity
Esfera de material Standard

Este no es en sí un tutorial, la intención de este Blog es mostrar un poco que pasa detrás del modelo de iluminación Standard que representa, valga la redundancia el standard de la industria, modelos de iluminación basados en física o PBR(Physically Based Rendering)


En anteriores Blogs hemos hecho modelos de iluminación que no son físicos, otros que tal vez agregan algún aspecto realista, pero teniendo como base el modelo clásico Blinn Phong que era el standard en la época del PS3 y el XBox 360, pero a pesar de todo esto, nunca pudimos aprovechar las ventajas que nos ofrecían los modelos PBR Standard de unity, como usar la iluminación global, los reflejos del entorno etc.


Esta vez vamos a mirar un poco las tripas de este modelo de iluminación para entender cómo se comporta y cómo podemos aprovecharlo un poco para nuestro beneficio, antes de continuar es necesario que veas de nuevo el Blog de como hacer nuestros Shaders Modulares usando archivos .cginc, y tambien es necesario repasar cómo hacer modelos de iluminacion. Miremos el siguiente shader a continuación:

Este shader es el que por defecto unity crea como plantilla como un shader de superficie, pero sí vemos es casi mágico, no ves ningún tipo de struct, ninguna función vertex o fragment, solo una función surf, la única pista que tenemos es que invoca un modelo de iluminación #pragma surface surf Standard, donde Standard es uno de los tres modelos de iluminación que viene por defecto aparte de Lambert y de BlinnPhong. En la documentación de modelos de iluminación de unity, nos enseña variantes de Lambert y Blinn Phong, pero nunca nos muestra como hacer variantes del modelo Standard.


Otra pista que tenemos son los parámetros de entrada de la función surf, inout SurfaceOutputStandard, que es un struct que viene por defecto junto con SurfaceOutput y SurfaceOutputStandardSpecular, que vienen incluidos con #include Unity.cginc que no ves porque siempre viene incluido aunque no lo llames.


Modificando CustomLighting.cginc

Vamos a abrir nuestro archivo CustomLightning.cginc que hemos hecho en tutoriales anteriores y vamos a agregar un nuevo modelo de iluminación.

Podemos ver un struct SurfaceOutputOverride qué es exactamente igual al SurfaceOutputStandard, pude haberla llamado Chorizo y nada hubiera pasado.


Como habíamos visto en el Blog de modelos de iluminación el nombre de la función debe ser igual al que se invoca en el #pragma surface surf, precedido de la palabra Lighting o de lo contrario no será detectado.


Como parámetros le inyectamos el struct que hemos hecho y lo demás puede pasar igual, cabe subrayar el parámetro UnityGI, que en vez de darnos las direcciones de la luz del sol, nos da las direcciones de los rebotes de luz (Aun estoy por comprobar su funcionamiento)


Lo importante es que aquí invocamos el struct SurfaceOutputStandard y a cada valor le asignamos los valores de nuestro struct y retornamos como resultado la función LightingStandard, la función en sí es un modelo de iluminación como el que estamos haciendo pero oculto quien sabe donde, esta función nos facilita no tener que hacer un PBR bien difícil a través de funciones vertex fragment.


Tanto LightingStandard como el struct SurfaceOutputStandard provienen del #include

#include "UnityPBSLighting.cginc"

que debemos agregar a nuestro archivo CustomLighting.cginc


Creando el shader


Aquí no hay mucho que comentar, solo observar que la entrada inout de la función surf, ya no es el struct standard, sino nuestro propio struct, de resto es todo igual.


Conclusión

Quizás este Blog no representa nada util, porque realmente no se está haciendo nada práctico con el, por ahora tome estos scripts como una plantilla para algunas mejoras que vendrán en el futuro.


Algo que puede ser una conclusión parcial es que la función surf, no es mas que algo que convierte el resultado de funciones vertex fragment en instrucciones que nosotros invocamos cuando usamos palabras como o.Albedo, o.Normal, o.Metallic, terminando estas palabras como palabras reservadas que son interpretadas por la función surf y busca dentro de algún fragmento la respuesta.


Aunque modifiquemos el color, esto no hará que cambie el comportamiento de la luz en el shader, esto nos limita mucho a la hora de hacer una modificación, solo permitiéndonos sumar algo al resultado o hacer algún tipo de retoque minusculo.


No siendo mas nos vemos en un próximo Blog. Hasta otra

22 visualizaciones0 comentarios

Entradas recientes

Ver todo

Comments


bottom of page