When writing Surface Shaders, you describe the properties of a surface (such as albedo color and normal), and a Lighting Model computes the lighting interaction.
There are two built-in lighting models: Lambert
for diffuse lighting, and BlinnPhong
for specular lighting. The Lighting.cginc file inside Unity defines these models (Windows: <unity install path>/Data/CGIncludes/Lighting.cginc; macOS: /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc).
Sometimes you might want to use a custom lighting model. You can do this with Surface Shaders. A lighting model is simply a couple of Cg/HLSL functions that match some conventions.
A lighting model consists of regular functions with names that begin Lighting
. You can declare them anywhere in your shader file, or one of the included files. The functions are:
half4 Lighting<Name> (SurfaceOutput s, UnityGI gi);
Use this in forward rendering paths for light models that are not dependent on the view direction.
half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi);
Use this in forward rendering paths for light models that are dependent on the view direction.
half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal);
Use this in deferred lighting paths.
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
Use this in light prepass (legacy deferred) lighting paths.
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 only works in forward rendering, do not declare the _Deferred
or _Prepass
function. This ensures that Shaders that use it only compile to forward rendering.
Declare the following function to customize the decoding lightmap data and probes:
half4 Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);
Note that to decode standard Unity lightmaps and SH probes, you can use the built-in DecodeLightmap
and ShadeSHPerPixel
functions, as seen in UnityGI_Base
in the UnityGlobalIllumination.cginc file inside Unity (Windows: <unity install path>/Data/CGIncludes/UnityGlobalIllumination.cginc; macOS: /Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc_).
See documentation on Surface Shader Lighting Examples for more information.