Cuando escriba Surface Shaders, usted está describiendo las propiedades de una superficie (albedo color, normal, …) y la interacción de iluminación es calculada por un Lighting Model. Los lighting models (modelos de iluminación) integrados son Lambert (iluminación difusa) y BlinnPhong (iluminación especular).
Algunas veces usted puede querer utilizar un lighting model (modelo de iluminación) personalizado, y es posible hacer esto en Surface Shaders. El Lighting model no es más que un par de funciones Cg/HLSL que coinciden en algunas convenciones. Los modelos integrados Lambert
y BlinnPhong
están definidos en el archivo Lighting.cginc
dentro de Unity ({unity install path}/Data/CGIncludes/Lighting.cginc en Windows, /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc en Mac).
El Lighting Model es un par de funciones regulares con nombres comenzando con Lighting
. Ellas pueden ser declaradas en cualquier parte de su archivo del sombreador o en uno de los archivos incluidos. Las funciones son:
half4 Lighting<Name> (SurfaceOutput s, UnityGI gi);
This is used in forward rendering path for light models that are not view direction dependent (e.g. diffuse).
half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi);
This is used in forward rendering path for light models that are view direction dependent.
half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal);
This is used in deferred lighting path.
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
This is used in light prepass (legacy deferred) lighting path.
Tenga en cuenta que usted no necesita declarar todas las funciones. Un lighting model o bien utiliza view direction o no. Similarmente, si el lighting model va a funcionar solamente en forward, no declare la función _Deferred
o _Prepass
. De esta manera, todos los Shaders que lo utilizan se compilan a forward rendering solamente.
Del mismo modo, personalice los datos de decodificación del lightmap y probes declarando la función a continuación.
half4 Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);
Tenga en cuenta que para decodificar los lightmaps y probes SH de Unity, puede utilizar las funciones DecodeLightmap y ShadeSHPerPixel integradas, como se ve en UnityGI_Base en el archivo UnityGlobalIllumination.cginc
dentro de Unity ({unity install path}/Data/CGIncludes/UnityGlobalIllumination.cginc on Windows, /Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc en Mac).