基本结构
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};
