一、什么是表面着色器?
表面着色器(Surface Shader)是 Unity 提供的一种特殊类型的着色器。它是对传统的顶点/片元着色器的封装,提供了更简化的语法和更高的抽象层级。表面着色器允许开发者专注于物体的表面特性,如光照和颜色,而不必深入处理底层的顶点和片元操作。
结构学习
对顶点着色器和片元着色器的进一层封装。主要部分为两个结构体(Input、SurfaceOutput)和编译指令(#pragma surface)。
编译指令
#pragma surface 是 Unity 表面着色器中最重要的编译指令,用于告诉 Unity 如何编译和处理表面着色器代码。下面详细解释其参数含义和用法:
#pragma surface surfaceFunction lightModel [optionalparams]
参数详解
1. surfaceFuntion(必需)
含义:指定表面着色器函数的名称,该函数定义表面属性(如颜色、法线、金属度等)。
要求:函数名称由用户的自定义(如surf);必须接受Input结构体作为输入,并输出surfaceOutput或其变体(如SurfaceOutputStandard)。
示例:
void surf (Input IN, inout SurfaceOutputStandard o) {
// 表面属性计算
}
2. lightModel (必需)
含义:指定使用的光照模型,决定如何计算光照效果。
内置光照模型:
Lambert 简单漫反射光照
BlinnPhong 包含高光的Phong光照
Standard 基于物理的标准光照模型(金属 / 粗糙度工作流)
StandardSpecular 基于物理的标准光照模型(高光 / 光泽度工作流)
物理的光照模型 Standard和StandardSpecular (在UnityPBSLighting.cginc中定义)
非物理光照模型 Lambert和BlinnPhong (在Lighting.cginc中定义)
自定义光照模型:
可指定自定义光照函数名称(如LightingCustom)
示例:
#pragma surface surf Standard // 使用标准PBR光照模型
3. [optionalparams](可选参数)
这些参数提供了对表面着色器的行为精细控制,常用的选项有:
光照相关的:
fullforwardshadows:在 Forward 渲染路径中支持所有阴影类型(点光源、聚光灯等)
#pragma surface surf Standard fullforwardshadows
addshadow: 自定义阴影投射通道。
#pragma surface surf Lambert addshadow
渲染相关的:
alpha: 开启透明度混合
#pragma surface surf Standard alpha
vertex:vertexFunction: 指定自定义顶点处理函数
#pragma surface surf Standard verte