官方文档:http://docs.unity3d.com/Manual/SL-SurfaceShaders.html
0.
a.表面着色器跟顶点片段着色器相比,其优势在于可以比较方便地去书写跟灯光交互的shader(跟灯光交互的shader一般都是比较复杂的)。
b.你可以定义一个表面函数,根据需要将一些数据当作输入,然后填充输出结构体"SurfaceOutput"。
1.输入结构
Input 这个输入结构通常拥有着色器需要的所有纹理坐标(texture coordinates)。纹理坐标(Texturecoordinates)必须被命名为“uv”后接纹理(texture)名字。(或者uv2开始,使用第二纹理坐标集)。
可以在输入结构中根据自己的需要,可选附加这样的一些候选值:
2.输出结构
struct SurfaceOutput { fixed3 Albedo; // diffuse color fixed3 Normal; // tangent space normal, if written fixed3 Emission;// 该像素的自发光颜色,使得即便没有光照也可以物体本身也可以发出光 half Specular; // specular power in 0..1 range fixed Gloss; // specular intensity fixed Alpha; // alpha for transparencies };
3.编译指令(要放在SubShader中,而不是在Pass块中)
#pragma surface surfaceFunction lightModel[optionalparams]a.#pragma surface:表明这是一个表面shader
b. surfaceFunction:表示指定名称的Cg函数中有表面着色器(surface shader)代码。这个函数的格式应该是这样:void surf (Input IN,inout SurfaceOutput o), 其中Input是我们自己定义的结构。Input结构中应该包含所需的纹理坐标(texture coordinates)和表面函数(surfaceFunction)所需要的额外的必需变量。
c.lightModel:使用的光照模式。内置的是Lambert (diffuse)和 BlinnPhong (specular)两种。
d.optionalparams:略,参考官方文档:http://docs.unity3d.com/Manual/SL-SurfaceShaders.html
4.自定义光照模型
a.unity内置光照模型: Lambert (diffuse lighting) andBlinnPhong (specular lighting),其代码在Lighting.cginc中。
b.光照模型声明:函数开头是Lighting,可以在shader中的任意地方声明。
c.解密光照贴图:略