Shader 学习文档 [二]

引子

Surface Shader 和 Fragment Shader 差异性

常用的Shader分下面三类

  • Fixed function shader —— 属于固定渲染管线Shader, 基本用于高级Shader在老显卡无法显示时的Fallback。
  • Vertex and Fragment Shader —— 属于Unity常见Shder之一,可编程渲染管线.。
  • Surface Shade —— 属于Unity常见Shader之一,使用Unity预制的光照模型来进行光照运算。

主要说明一下Vertex and Fragment Shader与Surface Shade的一些常见性质,对总搞不清这两种常见可编程Shader的童鞋们科普一下。

共性

1. 必须从唯一一个根Shader开始

2. 可以设置Properties参数部分,作用及语法完全相同

3. 具体功能都在SubShader里(Subshader: 子Shader,Shader会自上而下运行第一个硬件能支持的Subshader,主要作用是对不用硬件的支持。)

4. 都可以打标签,例如Tags { “RenderType” = “Opaque” } LOD100 等

5. 都可以设置Fallback,如“Fallback “Legacy Shaders/Transparent/VertexLit””

6. 都可以处理基本的功能,例如光照漫反射(Diffuse)以及镜面反射(Specular)。

差异性

1. Pass{} 代码段

Surface Shader,由于已经将具体内容打包在光照模型了,不能加pass{},加了会报错。
Vertex and Fragment Shader在Subshader下面还有Pass{}

2. 核心写法不一样

Vertex and Fragment Shader的核心是:

1
2
3
4
5
CGPROGRAM  
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
ENDCG

Surface Shader的核心:
Surface Shader是Unity3d自带光照模型,也不做顶点处理,那么只需要一个表面处理函数surf即可

1
2
3
CGPROGRAM  
#pragma surface surf Lambert
ENDCG

输出结构不一样

Surface Shader 标准的几个输出结构

1. SurfaceOutput

1
2
3
4
5
6
7
8
9
struct SurfaceOutput  
{
fixed3 Albedo; // 漫反射颜色
fixed3 Normal; // 切线空间法线,如果赋值的话
fixed3 Emission;
half Specular; // 高光强度,范围是0-1
fixed Gloss; // specular intensity
fixed Alpha; // 透明度
};

2. SurfaceOutputStandard

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

3. SurfaceOutputStandardSpecular

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

Surface Shader 可用的光照模型

更多

要学习光照模型,一定要有比较深的数学基础