Установить модель освещения в Surface Shader в встроенном Render Pipeline
В Built-in Render Pipeline, при написании Shaders поверхности, вы описываете свойства поверхности (например, цвет альбедо и нормаль), и Lighting Model вычисляет взаимодействие освещения.
Существует две встроенные модели освещения: Lambert для диффузного освещения и BlinnPhong для зеркального освещения. Файл Lighting.cginc внутри Unity определяет эти модели (Windows: <путь установки unity>/Data/Resources/CGIncludes/Lighting.cginc; macOS: /Applications/Unity/Unity.app/Contents/Resources/CGIncludes/Lighting.cginc).
Иногда вы можете пожелать использовать собственную модель освещения. Вы можете сделать это с помощью Surface Shaders. Модель освещения — это просто пара функций Cg/HLSL, которые соответствуют некоторым правилам.
Совместимость конвейера отображения
| Название особенности | Universal Render Pipeline (URP) | High Definition Render Pipeline (HDRP) | Изготовленный на заказ SRP | Built-in Render Pipeline |
|---|---|---|---|---|
| Шейдеры поверхностей | Нет Упрощенный способ создания объектов Shader в URP см. в Shader Graph. |
Нет Упрощенный способ создания объектов Shader в HDRP см. в Shader Graph. |
Нет | Да |
Заявление моделей освещения
Модель освещения состоит из регулярных функций с именами, начинающимися с Lighting. Вы можете объявить их в любом месте в файле шейдера или в одном из включенных файлов. Функции:
half4 Lighting<Name> (SurfaceOutput s, UnityGI gi);Используйте это в прямых путях рендеринга для моделей света, которые , а не зависят от направления зрения.half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi);Используйте это в прямых путях отображения для моделей света, которые являются в зависимости от направления зрения.half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal);Используйте это в отложенных путях затенения.
Обратите внимание, что вам не нужно декларировать все функции. Модель освещения либо использует направление зрения, либо не использует его. Аналогичным образом, если модель освещения работает только в прямом рендеринге, не декларируйте функцию _Deferred. Это обеспечивает, что использующие ее шейдеры компилируются только в прямом рендеринге.
Изготовленный на заказ GI
Объявите следующую функцию для настройки декодирования данных карт освещения и зондов:
void Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);
Обратите внимание, что для декодирования стандартных Unity lightmaps и SH probes, вы можете использовать встроенные функции DecodeLightmap и ShadeSHPerPixel, как видно в UnityGI_Base в файле UnityGlobalIllumination.cginc внутри Unity (Windows: <unity install path>/Data/Resources/CGIncludes/UnityGlobalIllumination.cginc; macOS: /Applications/Unity/Unity.app/Contents/Resources/CGIncludes/UnityGlobalIllumination.cginc_).
Пример
Ниже приведен пример шейдера, который использует встроенную модель освещения Ламберта:
Shader "Example/Diffuse Texture" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
};
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
}
ENDCG
}
Fallback "Diffuse"
}
Вот как это выглядит с текстурой и без текстуры, с одним направленным светом в Scene:
