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

写作表面着色时,你描述的表面特性(反射颜色,正常,…)和照明作用的照明模型计算。内置照明模型是Lambert(漫射照明)和BlinnPhong(镜面光)。

有时你可能想要使用一个定制的照明模式,并有可能在表面着色器。照明模型只不过是几个Cg / HLSL函数相匹配的一些约定。内置的兰伯特和BlinnPhong模型中定义照明。cginc文件内部Unity({Unity安装路径} /数据/ CGIncludes /照明。cginc在Windows上,/应用程序/团结/ Unity.app /内容/ CGIncludes /照明。cginc Mac)。

Lighting Model declaration

照明模型声明

照明模型是一对常规函数,名字以Lighting开始。可以在着色器文件或包含的文件中声明任何地方。功能是:

1    half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten); 
    这是用于前向渲染路径的光模型,不看方向依赖(如扩散)。
2    half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten); 
    这是用于正向渲染路径的光模型,视图方向依赖。
3    half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light); 
    这是用于延迟照明路径。

请注意,您不需要声明所有函数.。照明模型要么使用视图方向,要么不使用。同样,如果照明模式不会递延照明工作,你只是不申报_prepass功能,所有的着色器使用它将只编译正向渲染。

Decoding Lightmaps

解码光照贴图

解码光照贴图数据可以以类似的方式定制的照明功能的前进和递延照明。使用以下函数之一取决于您的光模型是否与视图方向相关。Unity解码标准光照贴图纹理数据(颜色,totalcolor,indirectonlycolor和尺度参数传递)使用内置的decodelightmap功能。

自定义的光照贴图解码功能处理和延迟光照渲染路径自动。然而你必须清楚在递延照明<名称> _prepass函数将被调用后的光照贴图解码和光参数将包含和实时照明和光照贴图。如果有必要,你可以区分向前递延路径通过使用内置的UNITY_PASS_PREPASSFINAL宏。

功能定制Single光照贴图解码:

1    half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color); 
    这是用于光模型不依赖视图方向(如扩散)。
2    half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir); 
    这是用于光模型视图方向相关的。

功能定制Dual光照贴图解码:

1    half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade); 
    这是用于光模型不依赖视图方向(如扩散)。
2    half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade, half3 viewDir); 
    这是用于光模型视图方向相关的。

功能定制Directional光照贴图的解码:

1    half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal); 
    这是用于光模型不依赖视图方向(如扩散)。
2    half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor); 
    这是用于光模型视图方向相关的。

🔚