Shader的结构
一个UnityShader的结构如下所示:
Shader "ShaderName"{
Properties{
_value("valueName",valueType) = DefaultValue
}
SubShader{
//SubShader1
}
SubShader{
//SubShader2
}
Fallback "FallbackType"
}
1.Properties
Properties中定义了使用的属性,一般以下划线开始,常见的有以下几种:
_Float("FloatName",Float) = 1.5
_Range("RangeName",Range(0.0, 1.0) ) = 0.5
_Color("ColorName", Color) = (1,1,1,1)
_2D("TextureName", 2D) = ""{}
_Cube("CubeName", Cube) = "white"{}
_3D("3DName", 3D) = "black"{}
Float是一个浮点数,Range表示一个可选的范围,Color是一个四维数,注意2D,Cube,3D的初始化形式。
2.SubShader
在SubShader中定义了可选的状态,标签和一系列的Pass,但是Pass数目过多会引起渲染性能的下降
SubShader中常见的状态设置有:
剔除设置Cull:分为剔除正面Front,剔除背面Back,关闭剔除Off三个状态
深度测试ZTest:可以设置为不同的深度测试函数
深度写入ZWrite:开启On,关闭Off
混合Blend:设置是否开启混合及混合形式
SubShader中的标签是一个键值对,键值均为字符串类型,常见的标签有:
渲染队列控制Queue
着色器类型RenderType
批处理控制DisableBatching
阴影投射控制ForceNoShadowCasting
3.Pass
Pass定义在SubShader中,其结构为:
Pass{
[Name]
[Tags]
[RenderSetup]
//code
}
首先我们可以定义这个Pass块的名字,如:
Name "MyPass"
但是要注意,在unity的内部,会把所有Pass的名字设置为大写形式,所以当我们要使用UsePass命令来使用其他的Pass时,要写为大写的名字,如:
UsePass "MyShader/MYPASS"
在Pass中,也有属于Pass块的标签设置,如:LightMode用于设置光照模型。RequireOptions指定满足某些条件时才渲染该Pass
4.Fallback
如果所有的SubShader都不可用,将使用Fallback中指定的Shader
Shader的分类
1.顶点/片元着色器 Vertex/Fragment Shader
在UnityShader基础中已经大致介绍了这两个处理步骤进行的工作,在后续的学习中我们主要研究这两种Shader。它们相对于表面着色器更加的复杂,但是其灵活性也更高,代码写在Pass块中。
2.表面着色器Surface Shader
表面着色器其实是对顶点/片元着色器更高一层的抽象,它的代码量相对较少,但渲染的代价比较大。在我们使用表面着色器的时候,Unity实际上仍会把它转换成相应的顶点/片元着色器。其代码中无Pass块。