Unity中,Unity Shader 都是ShaderLab 来编写的。ShaderLab 是Unity提供的编写Unity Shader 的一种说明性语言。
1)Properties :定义了着色器所需要的各种属性。这些属性讲会出现在Inspector。
2) SubShader:每一个Unity Shader文件可以包含多个SubShader语义块,但最少要有一个。
SubShader{
//可选的
[Tags]
//[RenderSetUp]
Pass{
}
//Other Passes
}
Pass:每个pass定义了一次完整的渲染流程,但是pass数目过多,往往会造成渲染性能的下降。因此尽量使用最小数目的Pass。
3)渲染状态设置指令:设置显卡的各种状态。
状态名称 设置指令 解释
Cull Cull Back | Front | Off 设置剔除模式;剔除证明/背面/关闭剔除
ZTest ZTest Less Greater | LEqual | GEqual |Equal |NotEqual |Always 设置深度测试时使用的函数
ZWrite ZWrite On/Off 开启/关闭 深度写入
Blend Blend SrcFactor DstFactor 开启并设置混合模式
当在SubShader快中设置了上述渲染状态,将会应用到所有的pass;如果我们不想,可以再pass中单独进行上面的操作。
4)SubShader 的标签
键值对(Key/Value Pair),它的健和值都是字符串类型。这些键值对是SubShader和渲染引擎之间的沟通桥梁。
告诉Unity的渲染引擎:SubShader希望咋样以及何时渲染这个对象。
Tags {"TagName1" = "Value1" "TagName2" = "Value2"}
标签类型 说明 例子
Queue 控制渲染顺序,指定该物体属于哪一个渲染队列,通过这种方式可以保证所有的透明物体可以在所有不透明的物体后面被渲染 Tags {"Queue" = "Transparent"}
RenderType 对着色器进行分类。 Tags {"RenderType" = "Opaque"}
DisableBatching 一些SubShader在使用Unity的批处理功能会出现问题。这时可以通过该标签直接指明是否对该SubShader使用批处理 Tags{"DisableBatching"= "True"}
ForecNoShadowCasting 控制使用该SubShader的物体是否会投射阴影。 Tags {"ForceNoShadowCasting" = "True"}
IgnoreProjector 如果该标签值为“true”,那么使用该SubShader的物体将不会受Projector的影响。通常用于半透明物体。 Tags {"IgnoreProjector" = "True"}
CanUseSpriteAtlas 当该SubShader用于精灵(Sprites),将该标签设为“false”
PreviewType 指明材质面板将如何预览该材质。默认情况下,材质将显示为一个球形,我们通过把标签的值设为“Plane” “SkyBox”来改变预览类型 Tags {"PreviewType" = "Plane"}
上述标签仅可以在SubShader中声明,而不可以在Pass块中声明。Pass块虽然也可以定义标签,但这些标签不同于SubShader的标签类型。
Pass 块