在Unity中,所有的Unity Shader都是使用ShaderLab来编写的,它可以帮助我们轻松地控制渲染。
1. ShaderLab基本结构
一个Unity Shader的基本结构如下:
Shader "位置和名称"
{
Properties // 属性 (可选)
SubShader // 子着色器
SubShader // 子着色器
...
Fallback "低级Shader" // (可选)
}
2. Shader的位置和名称
每个Unity Shader文件的第一行都要指定Unity Shader的位置和名称:
Shader "Test/MyShader"{ }
如果要为材质添加我们所编写的Shader,以上述代码为例,单击材质面板中的Shader下拉菜单,然后依次选择Test >> MyShader即可。
3. Properties:材质与Shader的桥梁
Properties语义块中可定义一系列属性,这些属性会出现在材质面板中,我们可以直接在代码里设置这些属性的默认值,也可以在Unity中对这些属性重新进行设置。可以将这些属性理解为C#中的变量,它们会在SubShader语义块中被使用。它的语法结构如下:
Properties {
变量名 ("面板展示名称", 属性类型) = 默认值
变量名 ("面板展示名称", 属性类型) = 默认值
...
}
Properties语义块里支持的属性类型如下表所示:
4. SubShader:定义渲染的部分
Shader文件可包含多个SubShader语义块,但最少要有一个。在运行Shader文件时Unity会扫描该文件下所有SubShader语义块,然后选择第一个能够在目标平台上运行的SubShader,如果都不支持,则会使用Fallback语义指定的Unity Shader。
SubShader语义块的基本结构如下:
SubShader {
// 标签 (可选)
Tags {
"[标签名]" = "[值]"
...
}
// 状态 (可选)
[状态名称] [指令]
// 渲染管线
Pass {
}
}
如下是一个最简单的Properties与SubShader结合使用的实例代码:
Shader "Test/MyShader"
{
Properties
{
_MyColor("My Color", Color) = (1, 1, 1, 1)
}
SubShader
{
Pass
{
Color[_MyColor]
}
}
}
5. FallBack:为Shader留一条后路
紧跟在SubShader语义块后面的可以是一个FallBack指令,它用于告诉Unity在所有SubShader都无法在目标平台上运行时,就使用这个最低级的Shader。它的语义如下:
Fallback "[最低级的Shader]"
// 或者
Fallback off
通常情况下使用初始的Fallback指令即可。