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 ({unity install path}/Data/CGIncludes/Lighting.cginc on Windows, /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc on Mac).
Модель освещения - это ряд обычных функций, имена которых начинаются с Lighting
. Они могут быть определены в любом месте файла вашего шейдера, или в одном из включенных файлов. Вот эти функции:
half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten);
Используется при упреждающем методе рендеринга (forward rendering path) для моделей освещения, которые не зависят от направления взгляда (напр., diffuse).
half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);
Используется при упреждающем метода рендеринга для моделей освещения, которые зависят от направления взгляда.
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
Используется в методе отложенного освещения (deferred lighting path).
Заметьте, что не обязательно объявлять все функции. Модель освещения либо использует направление взгляда, либо нет. Аналогично, если модель освещения не будет работать в отложенном освещении, вы просто не объявляете функцию _PrePass
и все шейдеры, которые используют эту модель, будут компилироваться только в упреждающий рендеринг.
Decoding lightmap data can be customized in a similar fashion as the lighting function for forward and deferred lighting. Use one of the functions below depending on whether your light model is view direction dependent or not. To decode standard Unity lightmap texture data (passed in color
, totalColor
, indirectOnlyColor
and scale
arguments) use built-in DecodeLightmap function.
Custom lightmap decoding functions handle forward and deferred lighting rendering paths automatically. However you must be aware that in deferred case Lighting<Name>_PrePass
function will be called after lightmap decoding and light
argument will contain sum of realtime lighting and lightmaps. If necessary you can distinguish forward and deferred paths by using built-in UNITY_PASS_PREPASSFINAL macro.
Functions to customize decoding of Single lightmaps are:
half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color);
Используется для моделей освещения, которые не зависят от направления взгляда (напр., diffuse).
half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir);
Используется для моделей освещения, зависящих от направления взгляда.
Functions to customize decoding of Dual lightmaps are:
half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade);
Используется для моделей освещения, которые не зависят от направления взгляда (напр., diffuse).
half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade, half3 viewDir);
Используется для моделей освещения, зависящих от направления взгляда.
Functions to customize decoding of Directional lightmaps are:
half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal);
Используется для моделей освещения, которые не зависят от направления взгляда (напр., diffuse).
half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);
Используется для моделей освещения, зависящих от направления взгляда.