US2S2L5——Shader的子着色器

回顾:ShaderLab的基本结构

ShaderLab主要由4个部分组成

  1. Shader的名字
  2. Shader的属性
  3. 1~n个子着色器
  4. 备用的Shader

本章代码关键字

1
SubShader { }    //子着色器代码块,包括渲染标签,渲染状态,n个渲染通道,可声明多个,Unity选择第一个能够在当前显卡运行的SubShader

SubShader语句块

每一个Shader中都会包含至少一个 SubShader
当Unity想要显示一个物体的时候,就会在Shader文件中去检测这些 SubShader​ 语句块
然后选择第一个能够在当前显卡运行的 SubShader​ 进行执行

因此在一个Shader当中实现一些高级效果时,为了避免在在某些设备上无法执行
可能会存在多个 SubShader 语句块,用于适配这些低端设备

SubShader当中包含最终的渲染相关代码,决定了最终的渲染效果

SubShader的基本构成

SubShader语句块中主要由3部分构成

1
2
3
4
5
            |--------Tags(渲染标签)
|--------States(渲染状态)
SubShader---|--------Pass(渲染通道1)
|--------Pass(渲染通道2)
|--------....(渲染通道n)
  1. 渲染标签 Tags​:通过标签来确定什么时候以及如何对物体进行渲染

  2. 渲染状态 States​:通过状态来确定渲染时的剔除方式、深度测试方式、混合方式等等内容

  3. 渲染通道 Pass​:具体实现着色器代码的地方(每个 SubShader​ 语句块中至少有一个渲染通道,可以有多个)

    注意:
    SubShader​ 中每定义一个渲染通道 Pass​,就会让物体执行一次渲染
    n个 Pass​ ,就会有n次渲染,在实现一些复杂渲染效果时需要使用多个 Pass​ 进行组合实现
    但是我们要尽量减少 Pass​ 的数量,更多的 Pass​ 会增加性能消耗

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SubShader
{
//1.渲染标签
Tags{ "标签名1" = "标签值1" "标签名2" = "标签值2" .....}

//2.渲染状态
.....

//3.渲染通道
Pass
{
第一个渲染通道
}
Pass
{
第二个渲染通道
}
.............
}