Ejemplos del Surface Shader
Ejemplos de Iluminación del Surface Shader

Modelos de Iluminación Personalizados en Surface Shaders

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 ({unity install path}/Data/CGIncludes/Lighting.cginc en Windows, /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc en Mac).

Declaración de Lighting Model

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:

  1. 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).

  2. 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 ).

  3. 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.

Decodificando Lightmaps

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:

  1. 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).

  2. 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:

  1. 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).

  2. 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:

  1. 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).

  2. 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).

Ejemplos

Surface Shader Lighting Examples

Ejemplos del Surface Shader
Ejemplos de Iluminación del Surface Shader