Version: 1.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); Use this in deferred shading paths.

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 rendering, do not declare the _Deferred function. This ensures that Shaders that use it only compile to forward rendering.

自定义 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__)。

示例

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

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