Cuando escriba Surface Shaders, usted está describiendo las propiedades de una superficie (albedo color, normal, …) y la interacción de iluminación es computada por un Lighting Model. Los modelos de iluminación(lighting modelos) integrados son Lambert (diffuse lighting) y BlinnPhong (specular lighting).
Algunas veces usted puede querer utilizar un modelo de iluminación personalizado(custom lighting model) , 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 ( en Windows, 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, half3 lightDir, half atten);
Esto es utilizado en forward rendering path para modelos de luz(light models) que no son dependientes de la dirección de la vista(view direction) (e.g. diffuse).
half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);
Esto es utilizado en forward rendering path para modelos luz(light models) que son dependientes de la dirección de la vista(view direction ).
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
Esto es utilizado en 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 no va a funcionar en deferred lighting, usted simplemente no declara la función _PrePass
, y todos los sombreadores que lo utilizan van a compilar a forward rendering only.
Decodificar información lightmap puede ser personalizada de una manera similar a la función de iluminación para la iluminación forward y deferred. Utilice una de las funciones debajo dependiendo si su modelo luz es dependiente de la dirección de la vista(view direction) o no lo es. Para decodificar información estándar de textura del lightmap de Unity ( pasado en argumentos de color
, totalColor
, indirectOnlyColor
y scale
) utilice funciones DecodeLightmap integradas.
Las Funciones de decodificación lightmap personalizadas manejan forward y defererred lighting rendering paths automáticamente. No obstante, usted debe estar consciente que en el caso de deferred la función Lighting<Name>_PrePass
va a ser llamada después de la decodificación del lightmap y el argumento light
va a contener la suma de la iluminación en tiempo real y los lightmaps. Si es necesario usted puede distinguir forward y deferred paths utilizando la macro UNITY_PASS_PREPASSFINAL integrada.
Las Funciones para personalizar la decodificación de Single lightmaps son:
half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color);
Esto es utilizado para modelos luz(light models) que no son dependientes de la dirección de la vista(view direction) (e.g. diffuse).
half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir);
Esto es utilizado para modelos luz que son dependientes de la dirección de la vista(view direction).
Las Funciones para personalizar la decodificación de Dual lightmaps son:
half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade);
Esto es utilizado para modelos luz(light models) que no son dependientes de la dirección de la vista(view direction) (e.g. diffuse).
half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade, half3 viewDir);
Esto es utilizado para modelos luz que son dependientes de la dirección de la vista(view direction).
Las Funciones para personalizar la decodificación de Directional lightmaps son:
half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal);
Esto es utilizado para modelos luz(light models) que no son dependientes de la dirección de la vista(view direction) (e.g. diffuse).
half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);
Esto es utilizado para modelos luz que son dependientes de la dirección de la vista(view direction).