在Unity中新建一个默认shader,都会看到一句这样的代码。
Tags { “RenderType”=“Opaque” }
对于shaderlab中的tags官方给出的解释是:Subshader使用tag来告诉他们期望如何以及何时将其渲染到渲染引擎。
Tags语法格式如下:
Tags { “TagName1” = “Value1” “TagName2” = “Value2” }
通过Tags{}来表示我们添加了一系列的参数标识,大括号内可以添加多组Tag.
这种Tag有两种,一种是SubShader Tags,一种是Pass Tags.
一、SubShader Tags
在SubShader中,标签用于确定子着色器的渲染顺序和其他参数,且标签必须位于 SubShader 部分中
具体参数有以下这些:
1.1 渲染顺序 - Queue 标签
Queue:渲染队列,指定对象什么时候渲染,每个队列其实都是利用一个整数进行索引的。
用来确定对象的绘制顺序。着色器决定其对象属于哪个渲染队列。有四个预定义的渲染队列,但预定义的渲染队列之间可以有更多的队列。预定义队列包括:
1.1.1 Background - 在其他渲染队列之前渲染。通常会对需要处于背景中的对象使用此渲染队列。
1.1.2 Geometry(默认值)-通常用于不透明对象,比如场景中的物件与角色等。
1.1.3 AlphaTest - 进行 Alpha 测试的几何体将使用此队列,要么完全透明要么完全不透明,多用于利用贴图来实现边缘透明的效果,也就是 美术常说的透贴。在绘制完所有实体对象之后再渲染经过 Alpha 测试的对象会更有效。
1.1.4 Transparent - 此渲染队列在 Geometry 和 AlphaTest 之后渲染,按照从后到前的顺序。任何经过 Alpha 混合者(即不写入深度缓冲区的着色器)都应该放在这里(玻璃、粒子效果)。常用于半透明对象,建议需要混合的对象放入此队列。
1.1.5 Overlay -此渲染队列用于叠加效果。最后渲染的东西应该放在这里(例如镜头光晕等)
在内部,每个队列由整数索引表示;Background是 1000,Geometry是 2000,AlphaTest是 2450,Transparent是 3000,Overlay是 4000。
预定渲染序列之外的其他序列,例:
Tags { “Queue” = “Geometry+1” } //注意:“Geometry+1” 不可以有空格。
以通过在值后加数字的形式来进行重新指定渲染队列
索引值为2001 的队列这将使对象在所有不透明对象之后渲染,但在透明对象之前渲染。例如透明的水应该在不透明对象之后绘制,但又要在透明对象之前绘制。
索引值高达 2500 的队列(“Geometry+500”)视为“不透明”,并且会优化对象的绘制顺序以获得最佳性能。 较高索引的渲染队列被认为是“透明对象”并按距离将对象进行排序,从距离最远的对象开始渲染,最后渲染距离最近的对象。天空盒在所有不透明对象和所有透明对象之间绘制。
Queue渲染队列小结: 渲染队列直接影响性能中的重复绘制,合理的队列可极大的提升渲染效率。在Unity中,渲染队列小于2500的对象都被认为是不透明的物体,(如“Background”,“Geometry”,“AlphaTest”),这些物体是从前往后绘制的,而使用其他的队列(如“Transparent”,“Overlay”)的物体则是从后往前绘制的。这意味着,我们需要尽可能地把物体的队列设置为不透明物体的渲染队列,而尽量避免重复绘制。
1.2、DisableBatching 标签
有的时候,我们会利用Shader在模型的顶点本地坐标下做一些位移动画,当此模型有批处理时会出现效果不正确的情况,这是因为批处理会将所有几何转换为世界坐标空间,因此“本地坐标空间”将丢失。
“DisableBatching” = “True”
这时我们就可以利用此Tag在Shader中指定是否受批处理影响,有以下3个值可选:
“True”(始终对此着色器禁用批处理)。
“False”(不禁用批处理;这是默认值)。
“LODFading”(当 LOD 淡化处于激活状态时禁用批处理;主要用于树)
1.3、ForceNoShadowCasting 标签
如果写了ForceNoShadowCasting标签并且值为“True”,则使用该子着色器渲染的对象绝不会投射阴影。应用场景:对透明对象使用着色器替换并且不希望从其他子着色器继承阴影通道时。
1.4、IgnoreProjector 标签
如果写了IgnoreProjector标签并且值为“True”,则使用此着色器的对象不会受到Projector(投影器组件)的影响。
Projector是Unity中内置的组件,可用于实现贴花等功能
1.5、PreviewType 标签
PreviewType指示材质检视面板预览应如何显示材质。默认情况下,材质显示为球体,但也可以将 PreviewType 设置为“Plane”(将显示为 2D)或“Skybox”(将显示为天空盒)。
1.6、CanUseSpriteAtlas 标签
是否可用于精灵打包图集,意思就是如果某个图片精灵被设置为打包进图集中,那么当此精灵所指定Shader中设置为
“CanUseSpriteAtlas”=“False”
时就会使其无法工作,相应的UI上也会有警告提示。
1.7、RenderType 标签
此标签只是将着色器分为几个预定义的组。
Opaque:大部分着色器(法线、自发光、反射和地形着色器)。
Transparent:大部分半透明着色器(透明、粒子、字体和地形附加通道着色器)。
TransparentCutout:遮罩透明度着色器(透明镂空、两个通道植被着色器)。
Background:天空盒着色器。
Overlay:GUI 纹理、光环、光晕着色器。
TreeOpaque:地形引擎树皮。
TreeTransparentCutout:地形引擎树叶。
TreeBillboard:地形引擎公告牌树。
Grass:地形引擎草。
GrassBillboard:地形引擎公告牌草。
这些名称实际上只是一种内部的约定,用来区别这个Shader要渲染的对象是属于什么类别的。
那RenderType又有什么作用呢?
它的作用是可以利用Camera.SetReplacementShader来更改最终的渲染效果。
1.7.1、使用SetReplacementShader(“shaderA”,"")
这里Tag为空,表示全部物体Shader都替换成shaderA进行渲染
1.7.2、SetReplacementShader(“shaderA”,“RenderType”)
由于这里Tag为"RenderType",所以先查看场景中的所有对象的shader中是否有RenderType参数,如果有,再看RenderType中的值是否与shaderA中的RenderType值相等,相等则使用shaderA渲染,否则就不渲染(Game视图什么也没有)。
举例: