Unity Shader 中SubShader相关介绍
每个Shader都会包含至少一个SubShader。Unity显示物体时候,它会去检测这些SubShader,然后选择一个能够在当前显卡运行的SubShader。
通常,SubShader的大致结构如下:
Shader "Unlit/NewUnlitShader" { Properties {***} SubShader { //Tages=标签:可以设置一个或多个Tages Tags { "RenderType" = "Opaque" } //标签语法: Tags { "TagsName1" = "Value1" "TagsName2" = "Value2" "TagsName3" = "Value3" ...//没有数量的限制 } //渲染状态和标签放在Subshader之下Pass之外的意思是对下面所有的Pass做影响,放在Pass内的意思是只对这一个Pass做影响。 Cull Back {***//子着色器} Pass//Pass可以设置多个,但是会消耗性能,也就是尽可能的用在一个Pass里面进行效果实现。 {***//第一个Pass} Pass {***//第二个Pass} ENDCG } } }
SubShader的分支结构。
在SubShader中用Queue(队列)标签确认物体的渲染顺序,Unity定义了五种渲染队列,如下
渲染队列名称 | 描述 | 队列号 |
Background | 最先执行谊染,一般用来谊染天空盒(Skybox)或者背景 | 1000 |
Geometry | 非透明的几何体通常使用这个队列,当没有声明渲染队列的时候,Unity 会默认使用这个队列 | 2000 |
AlphaTest | Alpha 测试的几何体会使用这个队列,之所以从 Geometry 队列单独拆分出来,是因为当所有实体都绘制完之后再绘制 Alpha 测试会更高效 | 2450 |
Transparent | 在这个队列的几何体按由远及近的顺序进行绘制,所有进行 Alpha 混合的几何体都应该使用这个队列,例如玻璃材质、粒子特效等 | 3000 |
Overlay | 用来叠加渲染的效果,例如镜头光晕等,放在最后渲染 | 4000 |
除了使用 Unity 预定义的渲染队列,也可以自己指定一个队列,例如:Tags { “Queue” = “Geometry + 1” }
这个队列的队列号其实是 2001,表示在所有的非透明几何体绘制完成之后再进行绘制。使用自定义的渲染队列在某些情况下非常有用,例如:透明的水应该在所有不透明几何体之后,透明几何体之前被绘制,所以透明水的渲染队列一般会使用{ “Queue” = “Transparent-1” }。
除了在SubShader中指定渲染队列,也可以在材质面板中进行设置,也可以选择一个Unity预设的队列。还可以自已在输入框输入一个队列号。
如图:
渲染类型
RenderType(渲染类型)标签可以将Shader划分为不同的类别,用于后期进行Shader替换或者产生相机的深度纹理,归纳整理后如下:
类型名称 | 描述 |
Opaque | 用于普通Shader,例如:不透明、自发光、反射、地形Shader |
Transparent | 用于半透明 Shader 例如:透明、粒子 |
TransparentCutout | 用于透明测试Shader,例如:植物叶子 |
Background | 用于Skybox Shader |
Overlay | 用于UGI纹理、Halo、Flare Shader |
TreeOpaque | 用于地形系统中的树干 |
TreeTransparentCutout | 用于地形系统中的树叶 |
TreeBillboard | 用于地形系统中的Billboarded树 |
Grass | 用于地形系统中的草 |
GrassBillboard | 用于地形系统中的Billboarded草 |