SubShader Tags
SubShader中的Tags必须放置于SubShader中的Tags内,具体参数有以下这些:
-
Queue
渲染队列,指定对象什么时候渲染,每个队列其实都是利用一个整数进行索引的。
有以下取值:
-
Background
值为1000,此队列的对象最先进行渲染。
-
Geometry
Queue的默认值,值为2000,通常用于不透明对象,比如场景中的物件与角色等。
-
AlphaTest
值为2450,要么完全透明要么完全不透明,多用于利用贴图来实现边缘透明的效果,也就是美术常说的透贴。
-
Transparent
值为3000,常用于半透明对象,渲染时从后往前进行渲染,建议需要混合的对象放入此队列。
-
Overlay
值为4000,此渲染队列用于叠加效果。最后渲染的东西应该放在这里(例如镜头光晕等)。
写法示例:
Tags{ "Queue" = "Geometry" }
那是不是只有以上这些固定化的渲染队列了呢?
当然不是,我们还有一种方式可以自定义渲染队列:
Tags{ "Queue" = "Geometry+1" }
如上所示,可以通过在值后加数字的形式来进行重新指定渲染队列。
渲染队列直接影响性能中的重复绘制,合理的队列可极大的提升渲染效率。在Unity中,渲染队列小于2500的对象都被认为是不透明的物体,(如“Background”,“Geometry”,“AlphaTest”),这些物体是从前往后绘制的,而使用其他的队列(如“Transparent”,“Overlay”)的物体则是从后往前绘制的。这意味着,我们需要尽可能地把物体的队列设置为不透明物体的渲染队列,而尽量避免重复绘制。
RenderType
自带的值有以下这些:
-
Opaque
-
Transparent
-
TransparentCutout
-
Background
-
Overlay
-
TreeOpaque
-
TreeTransparentCutout
-
TreeBillboard
-
Grass
-
GrassBillboard
这些名称实际上只是一种内部的约定,用来区别这个Shader要渲染的对象是属于什么类别的,你可以想像成是我们把各种不同的物体进行分类一样。当然你也可以改成自定义的名称,这样并不会影响到Shader的效果。
那既然没有什么效果影响,那RenderType又有什么作用呢?
它的作用是可以利用Camera.SetReplacementShader来更改最终的渲染效果。先说下这条语句的语法:
camera.SetReplacementShader (EffectShader, Tag);
这是Unity的脚本API,需要在C#脚本中进行调用。
其中EffectShader是我们需要渲染的Shader,Tag是用来筛选渲染对象用的。
具体按以下规则执行:
-
使用SetReplacementShader("shaderA",""),这里Tag为空,表示全部物体Shader都替换成shaderA进行渲染。
-
SetReplacementShader("shaderA","RenderType"),由于这里Tag为"RenderType",所以先查看场景中的shader中是否有RenderType参数,如果有,再看RenderType中的值是否与shaderA中的RenderType值相等,相等则使用shaderA渲染,否则就不渲染(Game视图什么也没有)。
-
关于Tag参数并不局限于RenderType,我们同样可以使用SetReplacementShader("shaderA","IgnoreProjector")或是其他任何参数如:SetReplacementShader("shaderA","ABC")等。