基本结构

  1. Shader "Hibari/SurfaceShader"
  2. {
  3. SubShader
  4. {
  5. Tags { "RenderType"="Opaque" }
  6. CGPROGRAM
  7. #pragma surface surf [光照模型] //表面着色器编译指令 声明表面着色器函数
  8. struct SurfaceInput //表面着色器输出结构体
  9. {};
  10. void surf () //定义表面着色器函数
  11. {}
  12. ENDCG
  13. }
  14. Fallback "Diffuse"
  15. }

编译指令

  1. //示例
  2. #pragma surface 表面着色器函数名 Standard [可选参数]

输入结构体

输入结构 Input 通常具有着色器所需的所有纹理坐标。 纹理坐标必须命名为“uv”后跟纹理名称的形式(如果要使用第二个纹理坐标集,则以“uv2”开头)。

  1. float3 viewDir; //包含视图方向,用于计算视差效果、边缘光照等等。
  2. float4 uv_vertColor : COLOR; //具有 COLOR 语义的 float4 - 包含插值的每顶点颜色。
  3. float4 uv_screenPos; //包含反射或屏幕空间效果的屏幕空间位置。请注意,这不适合 GrabPass;您需要使用 ComputeGrabScreenPos 函数自己计算自定义 UV。
  4. float3 uv_worldPos; //包含世界空间位置。
  5. float3 uv_worldRefl; //在_表面着色器不写入 o.Normal_ 的情况下,包含世界反射矢量。有关示例,请参阅反光漫射 (Reflect-Diffuse) 着色器。
  6. float3 uv_worldNormal; //在_表面着色器不写入 o.Normal_ 的情况下,包含世界法线矢量。
  7. float3 uv_worldRefl; INTERNAL_DATA; //在_表面着色器写入 o.Normal_ 的情况下,包含世界反射矢量。要获得基于每像素法线贴图的反射矢量,请使用 WorldReflectionVector (IN, o.Normal)。有关示例,请参阅反光凹凸 (Reflect-Bumped) 着色器。
  8. float3 uv_worldNormal; INTERNAL_DATA; //在_表面着色器写入 o.Normal_ 的情况下,包含世界法线矢量。要获得基于每像素法线贴图的法线矢量,请使用 WorldNormalVector (IN, o.Normal)。

输出结构体

不同光照模型的输出结构体是有所不同的

标准表面着色器

  1. struct SurfaceOutput
  2. {
  3. fixed3 Albedo; // 漫射颜色
  4. fixed3 Normal; // 切线空间法线(如果已写入)
  5. fixed3 Emission;
  6. half Specular; // 0..1 范围内的镜面反射能力
  7. fixed Gloss; // 镜面反射强度
  8. fixed Alpha; // 透明度 Alpha
  9. };

PBR-Metallic 金属度物理光照模型

  1. struct SurfaceOutputStandard
  2. {
  3. fixed3 Albedo; // 基础(漫射或镜面反射)颜色
  4. fixed3 Normal; // 切线空间法线(如果已写入)
  5. half3 Emission;
  6. half Metallic; // 0=非金属,1=金属
  7. half Smoothness; // 0=粗糙,1=平滑
  8. half Occlusion; // 遮挡(默认为 1)
  9. fixed Alpha; // 透明度 Alpha
  10. };

PBR-Specular 镜面反射物理光照模型

  1. struct SurfaceOutputStandardSpecular
  2. {
  3. fixed3 Albedo; // 漫射颜色
  4. fixed3 Specular; // 镜面反射颜色
  5. fixed3 Normal; // 切线空间法线(如果已写入)
  6. half3 Emission;
  7. half Smoothness; // 0=粗糙,1=平滑
  8. half Occlusion; // 遮挡(默认为 1)
  9. fixed Alpha; // 透明度 Alpha
  10. };