Custom Lighting models in Surface Shaders
When writing Surface Shaders, you're describing properties of a surface (albedo color, normal, ...) and the lighting interaction is computed by a Lighting Model. Built-in lighting models are Lambert (diffuse lighting) and BlinnPhong (specular lighting).
Sometimes you might want to use a custom lighting model, and it is possible to do that in Surface Shaders. Lighting model is nothing more than a couple of Cg/HLSL functions that match some conventions. The built-in Lambert
and BlinnPhong
models are defined in Lighting.cginc
file inside Unity ( on Windows, on Mac).
Lighting Model declaration
Lighting model is a couple of regular functions with names starting with Lighting
. They can be declared anywhere in your shader file or one of included files. The functions are:
half4 LightingName (SurfaceOutput s, half3 lightDir, half atten);
This is used in forward rendering path for light models that are not view direction dependent (e.g. diffuse).half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);
This is used in forward rendering path for light models that are view direction dependent.half4 LightingName_PrePass (SurfaceOutput s, half4 light);
This is used in deferred lighting path.
Note that you don't need to declare all functions. A lighting model either uses view direction or it does not. Similarly, if the lighting model will not work in deferred lighting, you just do not declare _PrePass
function, and all shaders that use it will compile to forward rendering only.