基本结构
Shader "Hibari/SurfaceShader"
{
SubShader
{
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf [光照模型] //表面着色器编译指令 声明表面着色器函数
struct SurfaceInput //表面着色器输出结构体
{};
void surf () //定义表面着色器函数
{}
ENDCG
}
Fallback "Diffuse"
}
编译指令
//示例
#pragma surface 表面着色器函数名 Standard [可选参数]
输入结构体
输入结构 Input 通常具有着色器所需的所有纹理坐标。 纹理坐标必须命名为“uv”后跟纹理名称的形式(如果要使用第二个纹理坐标集,则以“uv2”开头)。
float3 viewDir; //包含视图方向,用于计算视差效果、边缘光照等等。
float4 uv_vertColor : COLOR; //具有 COLOR 语义的 float4 - 包含插值的每顶点颜色。
float4 uv_screenPos; //包含反射或屏幕空间效果的屏幕空间位置。请注意,这不适合 GrabPass;您需要使用 ComputeGrabScreenPos 函数自己计算自定义 UV。
float3 uv_worldPos; //包含世界空间位置。
float3 uv_worldRefl; //在_表面着色器不写入 o.Normal_ 的情况下,包含世界反射矢量。有关示例,请参阅反光漫射 (Reflect-Diffuse) 着色器。
float3 uv_worldNormal; //在_表面着色器不写入 o.Normal_ 的情况下,包含世界法线矢量。
float3 uv_worldRefl; INTERNAL_DATA; //在_表面着色器写入 o.Normal_ 的情况下,包含世界反射矢量。要获得基于每像素法线贴图的反射矢量,请使用 WorldReflectionVector (IN, o.Normal)。有关示例,请参阅反光凹凸 (Reflect-Bumped) 着色器。
float3 uv_worldNormal; INTERNAL_DATA; //在_表面着色器写入 o.Normal_ 的情况下,包含世界法线矢量。要获得基于每像素法线贴图的法线矢量,请使用 WorldNormalVector (IN, o.Normal)。
输出结构体
不同光照模型的输出结构体是有所不同的
标准表面着色器
struct SurfaceOutput
{
fixed3 Albedo; // 漫射颜色
fixed3 Normal; // 切线空间法线(如果已写入)
fixed3 Emission;
half Specular; // 0..1 范围内的镜面反射能力
fixed Gloss; // 镜面反射强度
fixed Alpha; // 透明度 Alpha
};
PBR-Metallic 金属度物理光照模型
struct SurfaceOutputStandard
{
fixed3 Albedo; // 基础(漫射或镜面反射)颜色
fixed3 Normal; // 切线空间法线(如果已写入)
half3 Emission;
half Metallic; // 0=非金属,1=金属
half Smoothness; // 0=粗糙,1=平滑
half Occlusion; // 遮挡(默认为 1)
fixed Alpha; // 透明度 Alpha
};
PBR-Specular 镜面反射物理光照模型
struct SurfaceOutputStandardSpecular
{
fixed3 Albedo; // 漫射颜色
fixed3 Specular; // 镜面反射颜色
fixed3 Normal; // 切线空间法线(如果已写入)
half3 Emission;
half Smoothness; // 0=粗糙,1=平滑
half Occlusion; // 遮挡(默认为 1)
fixed Alpha; // 透明度 Alpha
};