При написании поверхностных шейдеров вы описываете свойства поверхности (albedo color, normal, …) и взаимодействие освещения вычисляется по модели освещения (Lighting Model). Встроенными моделями освещения являются Lambert (рассеянное освещение) и BlinnPhong (зеркальное освещение).
Иногда вы можете пожелать использовать пользовательскую модель освещения, и это можно осуществить в поверхностных шейдерах. Модель освещения - это ничто иное, как ряд Cg/HLSL функций, следующих некоторым соглашениям. Встроенные модели Lambert
и BlinnPhong
определены внутри Unity в файле Lighting.cginc
({путь установки unity}/Data/CGIncludes/Lighting.cginc на Windows, /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc на Mac).
Модель освещения - это ряд обычных функций, имена которых начинаются с Lighting
. Они могут быть определены в любом месте файла вашего шейдера, или в одном из включенных файлов. Вот эти функции:
half4 Lighting<Name> (SurfaceOutput s, UnityGI gi);
This is used in forward rendering path for light models that are not view direction dependent (e.g. diffuse).
half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi);
This is used in forward rendering path for light models that are view direction dependent.
half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal);
This is used in deferred lighting path.
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
This is used in light prepass (legacy 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 only works in forward, do not declare the _Deferred
or _Prepass
function. This way, all Shaders that use it compile to forward rendering only.
Similarly, customize the decoding lightmap data and probes by declaring the function below.
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 ({unity install path}/Data/CGIncludes/UnityGlobalIllumination.cginc on Windows, /Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc on Mac).