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

编写表面着色器时,您是在描述一个表面的属性(反射率颜色、法线等等),并由光照模型完成光照交互的计算。内置光照模型为 Lambert(漫反射光照)和 BlinnPhong(高光光照)。

有时您可能想使用自定义光照模型,在表面着色器 (Surface Shader) 中这是可以实现的。光照模型不过是与一些惯例匹配的几个 Cg/HLSL 函数。内置 LambertBlinnPhong 模型在 Unity 的 Lighting.cginc 文件中加以定义(Windows 操作系统:{unity install path}/Data/CGIncludes/Lighting.cginc;MAC 操作系统:/Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc)。

光照模型声明

光照模型是几个名称由光照 (Lighting) 开头的正规函数。它们可声明于您的着色器文件或某个被包含的文件的任何位置。函数为:

  1. half4 LightingName (SurfaceOutput s, half3 lightDir, half atten); 其在正向渲染路径中用于与视线方向相关的光照模型(例如,漫反射)。
  2. half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten); 其在正向渲染路径中用于与视线方向相关的光照模型。
  3. half4 LightingName_PrePass (SurfaceOutput s, half4 light); 其用于延时光照路径中。

请注意,您不必声明所有函数。一种光照模型要么使用视线方向,要么不使用。类似地,如果光照模型在延时光照中无效,您就不必声明 _PrePass 函数,然后所有使用它的着色器都将仅编译成正向渲染。

示例

表面着色器光照示例

Page last updated: 2013-06-26