SubShader的Tag
Shader "ShaderLab Tutorials/TestShader" {
SubShader
{
Tags { "Queue"="Geometry+10" "RenderType"="Opaque" }
//...
}
}
SubShader内部可以有标签(Tags)的定义。Tag指定了这个SubShader的渲染顺序(时机),以及其他的一些设置。
"RenderType"
标签。Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader
或Camera.SetReplacementShader
配合使用。Unity内置的RenderType包括:"Opaque"
:绝大部分不透明的物体都使用这个;"Transparent"
:绝大部分透明的物体、包括粒子特效都使用这个;"Background"
:天空盒都使用这个;"Overlay"
:GUI、镜头光晕都使用这个;- 用户也可以定义任意自己的
RenderType
这个标签所取的值。 - 应注意,
Camera.RenderWithShader
或Camera.SetReplacementShader
不要求标签只能是RenderType
,RenderType
只是Unity内部用于Replace的一个标签而已,你也可以自定义自己全新的标签用于Replace。
比如,你为自己的ShaderA.SubShaderA1(会被Unity选取到的SubShader,常为Shader文件中的第一个SubShader)增加Tag为"Distort"="On"
,然后将"Distort"
作为参数replacementTag
传给函数。此时,作为replacementShader
实参的ShaderB.SubShaderB1中若有也有一模一样的"Distort"="On"
、且这A的材质参数包含B所需材质参数,则此SubShaderB1将代替SubShaderA1用于本次渲染。 - 具体可参考Rendering with Replaced Shaders
"Queue"
标签。定义渲染顺序。预制的值为"Background"
。值为1000。比如用于天空盒。"Geometry"
。值为2000。大部分物体在这个队列。不透明的物体也在这里。这个队列内部的物体的渲染顺序会有进一步的优化(应该是从近到远,early-z test可以剔除不需经过FS处理的片元)。其他队列的物体都是按空间位置的从远到近进行渲染。"AlphaTest"
。值为2450。已进行AlphaTest的物体在这个队列。"Transparent"
。值为3000。透明物体。"Overlay"
。值为4000。比如镜头光晕。- 用户可以定义任意值,比如
"Queue"="Geometry+10"
"ForceNoShadowCasting"
,值为"true"
时,表示不接受阴影。"IgnoreProjector"
,值为"true"
时,表示不接受Projector组件的投影。
另,关于渲染队列和Batch的非官方经验总结是,一帧的渲染队列的生成,依次决定于每个渲染物体的:
- Shader的RenderType tag,
- Renderer.SortingLayerID,
- Renderer.SortingOrder,
- Material.renderQueue(默认值为Shader里的"Queue"),
- Transform.z(ViewSpace)(默认为按z值从前到后,但当Queue是“Transparent”的时候,按z值从后到前)。
这个渲染队列决定了之后渲染器再依次遍历这个渲染队列,“同一种”材质的渲染物体合到一个Batch里。