ShaderLab 语法:子着色器标记 (SubShader Tags)

子着色器利用标记表明其希望渲染到渲染引擎的方式与时间。

语法

Tags { "TagName1" = "Value1" "TagName2" = "Value2" }
指定TagName1 的值为 Value1TagName2的值为Value2。你可以使用任意数量的标记。

详细信息

标记从根本上来说是键值对。子着色器内的标记用于决定渲染顺序和子着色器的其他参数。请注意:以下 Unity 识别的标记必须是在子着色器 (SubShader) 部分内,而非通道 (Pass) 内!

渲染顺序 - 队列标记

使用队列 (Queue)标记可确定对象绘制的顺序。着色器决定其对象所归属的渲染队列,这样任何透明 (Transparent) 着色器都能确保它们绘制在所有不透明对象之后等等。

有四种预定义的渲染队列,但在预定义队列之间还可以有更多队列。预定义队列为:

Shader "Transparent Queue Example" {
     SubShader {
        Tags {"Queue" = "Transparent" }
        Pass {
            // 着色器的其他部分...
        }
    }
} 

说明如何在透明队列中渲染对象的示例

为了达到最佳性能,几何结构 (Geometry) 渲染队列会优化对象的绘制顺序。其他所有渲染队列按距离将对象排序,从最远的对象渲染到最近的对象。

中间队列可用于特殊用途。在内部,每个队列都由一个整数索引代表。后台 (Background) 为 1000、几何结构 (Geometry) 为 2000、AlphaTest 为 2450、透明 (Transparent) 为 3000、叠加 (Overlay) 为 4000。如果着色器使用这样的队列:

Tags { "Queue" = "Geometry+1" }

这会使对象在所有不透明对象之后、在透明对象之前渲染,而渲染队列索引将为 2001(几何结构加 1)。这在您想在其他对象组之间始终绘制某些对象时会很有用。例如,在大多数时候,透明的水应在不透明的对象之后、透明对象之前绘制。

RenderType 标记

RenderType 标记将着色器分为若干个预定义组。例如,透明着色器还是采用 alpha 测试的着色器等等。这个由着色器替换使用,有时用于生成相机的深度纹理

ForceNoShadowCasting 标记

当给定ForceNoShadowCasting 标记并且该标记有“真”值时,使用该子着色器渲染的对象将永不投射阴影。当在透明对象上使用着色器替换、但不想从另一个子着色器获得阴影通道时,这会非常有用。

IgnoreProjector 标记

当给定IgnoreProjector 标记并且该标记有“真”值时,使用该着色器的对象将不会受到投影仪的影响。这对半透明对象非常有用,因为投影仪没有影响它们的好办法。

另请参阅

也可为通道指定标记 (Tag),请参阅通道标记

Page last updated: 2013-06-28