当你在编写 Surface Shaders 时,是在描述一个表面的属性(反射颜色、法线……),并且光的交互过程是由一个光照模型来计算的。内建的光照模型有Lambert(漫反射光照)和BlinnPhong(镜面光照)。html
有时候,你可能想要使用一个自定义的光照模型,这在Surface Shader中是可能的。光照模型其实就是一些知足某些约定的Cg/HLSL函数。Unity内建的光照模型Lambert和BlinnPhong定义在Lighting.cginc文件中。这个文件在:app
光照模型是一系列名字以Lighting开头的约定函数。它们可以声明在shader文件或者包含的文件中的任何地方。这些函数是:函数
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
用于延迟光照路径中。 注意:你不须要声明全部的函数。光照模型要么使用视线方向,要么不使用。一样的,若是光照模型不工做在延迟光照中,就不要声明 _PrePass函数,并且全部使用它的shader只会编译到正向渲染中。
spa
用于正向渲染和延迟光照的光照贴图数据的解码能够被自定义在相似光照函数的方式中。根据光照模型是否依赖视线方向,选择下面其中一种函数。要解码标准的Unity光照贴图纹理数据(传入到color
, totalColor
,indirectOnlyColor
和scale
参数中),请使用内建的DecodeLightmap函数。3d
自定义解码单张光照贴图的函数是:code
half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir);
用于依赖视线方向的光照模型。自定义解码两张光照贴图的函数是:orm
half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade);
用于不依赖视线方向的光照模型(如漫反射)。half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade, half3 viewDir);
用于依赖视线方向的光照模型。自定义解码方向光照贴图的函数是:htm
half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);
用于依赖视线方向的光照模型。