Version: 2021.3
表面着色器示例
表面着色器光照示例

表面着色器中的自定义光照模型

在内置渲染管线中,当编写表面着色器时,将描述表面的属性(如反照率颜色和法线),而由__光照模型__计算光照交互。

渲染管线兼容性

功能名称 内置渲染管线 通用渲染管线 (URP) 高清渲染管线 (HDRP) 自定义 SRP
表面着色器

有关在 URP 中创建 Shader 对象的简化方法,请参阅 Shader Graph


有关在 HDRP 中创建 Shader 对象的简化方法,请参阅 Shader Graph

概述

有两个内置光照模型,分别是 LambertBlinnPhong,前者用于漫射光照,后者用于镜面反射光照。Unity 中的 Lighting.cginc 文件用于定义这些模型(Windows:<unity 安装路径>/Data/CGIncludes/Lighting.cginc_;macOS:/Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc_)。

有些时候,您可能希望使用自定义光照模型。为此,可使用表面着色器。光照模型实际上就是若干符合某些惯例的 Cg/HLSL 函数。

声明光照模型

一个光照模型中包含多个名称以 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); 在延迟光照路径中使用此函数。

  4. half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light); 在光照预通道(旧版延迟)光照路径中使用此函数。

请注意,您无需声明所有函数。光照模型不一定会使用视图方向。同样,如果仅在前向渲染中使用光照模型,请勿声明 _Deferred_Prepass 函数。这确保了使用视图方向的着色器仅编译到前向渲染。

自定义 GI

声明以下函数可自定义光照贴图数据和探针的解码:

  1. half4 Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);

请注意,要对 Unity 标准光照贴图和 SH 探针进行解码,您可以使用内置函数 DecodeLightmapShadeSHPerPixel;这些函数位于 Unity 内部 UnityGlobalIllumination.cginc 文件中的 UnityGI_Base 内(Windows:<unity 安装路径>/Data/CGIncludes/UnityGlobalIllumination.cginc_;macOS:/Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc__)。

示例

请参阅有关表面着色器光照示例的文档以了解更多信息。

表面着色器示例
表面着色器光照示例