Kjoe's blog

笔记#01 | 表面着色器的组织结构

笔记#01 | 表面着色器的组织结构
2022-01-25 · 2 min read
笔记 Unity Shader

表面着色器编译指令语法结构

#pragma surface surfaceFunction lightModel [optionalparams]
  1. surface :声明所使用的shader是表面着色器
  2. surfaceFunction : 声明表面着色器的函数名称,被称为表面函数,一般使用surf作为表面函数的名称
  3. lightModel :声明所使用的光照模型
  4. [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;          //透明通道
};
>————————这是底线————————<