Unity 6.3
0 онлайн 134 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 312 из 442

Установить модель освещения в 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. Вы можете объявить их в любом месте в файле шейдера или в одном из включенных файлов. Функции:

  1. half4 Lighting<Name> (SurfaceOutput s, UnityGI gi); Используйте это в прямых путях рендеринга для моделей света, которые , а не зависят от направления зрения.

  2. half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi); Используйте это в прямых путях отображения для моделей света, которые являются в зависимости от направления зрения.

  3. half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal); Используйте это в отложенных путях затенения.

Обратите внимание, что вам не нужно декларировать все функции. Модель освещения либо использует направление зрения, либо не использует его. Аналогичным образом, если модель освещения работает только в прямом рендеринге, не декларируйте функцию _Deferred. Это обеспечивает, что использующие ее шейдеры компилируются только в прямом рендеринге.

Изготовленный на заказ GI

Объявите следующую функцию для настройки декодирования данных карт освещения и зондов:

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

Шейдер с использованием диффузной текстуры. Шейдер без диффузной текстуры.