Version: 2017.1
Примеры поверхностных шейдеров
Surface Shader lighting examples

Пользовательские модели освещения в поверхностных шейдерах

При написании поверхностных шейдеров вы описываете свойства поверхности (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. Они могут быть определены в любом месте файла вашего шейдера, или в одном из включенных файлов. Вот эти функции:

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

  2. half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi); This is used in forward rendering path for light models that are view direction dependent.

  3. half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal); This is used in deferred lighting path.

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

Custom GI

Similarly, customize the decoding lightmap data and probes by declaring the function below.

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

Примеры

Surface Shader Lighting Examples

Примеры поверхностных шейдеров
Surface Shader lighting examples