表面着色器中的自定义光照模型
编写表面着色器时,您是在描述一个表面的属性(反射率颜色、法线等等),并由光照模型完成光照交互的计算。内置光照模型为 Lambert(漫反射光照)和 BlinnPhong(高光光照)。
有时您可能想使用自定义光照模型,在表面着色器 (Surface Shader) 中这是可以实现的。光照模型不过是与一些惯例匹配的几个 Cg/HLSL 函数。内置 Lambert
和 BlinnPhong
模型在 Unity 的 Lighting.cginc
文件中加以定义(Windows 操作系统: ;MAC 操作系统: )。
光照模型声明
光照模型是几个名称由光照 (Lighting)
开头的正规函数。它们可声明于您的着色器文件或某个被包含的文件的任何位置。函数为:
half4 LightingName (SurfaceOutput s, half3 lightDir, half atten);
其在正向渲染路径中用于非与视线方向相关的光照模型(例如,漫反射)。half4 LightingName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);
其在正向渲染路径中用于与视线方向相关的光照模型。half4 LightingName_PrePass (SurfaceOutput s, half4 light);
其用于延时光照路径中。
请注意,您不必声明所有函数。一种光照模型要么使用视线方向,要么不使用。类似地,如果光照模型在延时光照中无效,您就不必声明 _PrePass
函数,然后所有使用它的着色器都将仅编译成正向渲染。
示例
表面着色器光照示例
,