#pragma surface surfaceFunction lightModel [optionalparams]
void surf ( Input IN , inout surfaceOutput o )
{
//表面函数代码
}
表面函数是一个无返回值的函数,输入参数是预先定义好的 Input 结构体,关键词 in 可以省略。inout 是 in 和 out 的连写,表示既是输入又是输出参数,因此表面结构体 SurfaceOutput 既是表面函数的输入结构体,又是表面函数的输出结构体
struct SurfaceOutput
{
fixed3 Albedo; //漫反射
fixed3 Normal; //切线空间法线
fixed3 Emission; //自发光
half Specular; //镜面反射指数,范围0-1
fixed Gloss; //镜面反射强度
fixed Alpha; //透明通道
};
在Unity5以及之后的版本中新增了基于物理属性的光照模型,物理模型分为两种类型:
Standard 光照模型:适用于金属工作流,使用 SurfaceOutputStandard 表面结构体
StandardSpecular 光照模型:适用于高光工作流,使用 SurfaceOutputStandardSpecular 表面结构体
这两种结构体在 UnityPBSLighting.cginc 包含文件中被定义,结构体中包含的表面属性如下:
//金属工作流输出结构体
struct SurfaceOutputStandard
{
fixed3 Albedo; //基础颜色
fixed3 Normal; //切线空间法线
fixed3 Emission; //自发光
half Metallic; //0表示非金属,1表示金属
half Smoothness; //0表示非常粗糙,1表示非常光滑
half Occlusion; //环境光遮蔽,默认为1
fixed Alpha; //透明通道
};
//高光工作流输出结构体
struct SurfaceOutputSurfaceOutputStandard
{
fixed3 Albedo; //基础颜色
half Specular; //镜面反射颜色
fixed3 Normal; //切线空间法线
fixed3 Emission; //自发光
half Smoothness; //0表示非常粗糙,1表示非常光滑
half Occlusion; //环境光遮蔽,默认为1
fixed Alpha; //透明通道
};