ShaderLab: SubShader Tags

来源:互联网 发布:女生黄金比例身材算法 编辑:程序博客网 时间:2024/06/06 01:55

ShaderLab: SubShader Tags

Subshaders 使用 tags 来表示,其期望的在渲染引擎中渲染的方式和时间。

Syntax

Tags { "TagName1" = "Value1" "TagName2" = "Value2" }

声明了 TagName1 的值为 Value1, TagName2 的值为 Value2。 你可以有任意的tag。

Details

Tags 是基本的键值对。在一个 SubShader 内 tags 被用来声明渲染顺序和其他参数。注意,下列由Unity定义的 tags 必须在 SubShader 块内,不能在 Pass 块内。

除了内建的 Unity 定义的 tags 外,你也自定义 tags 并使用 Material.GetTag 函数查询他们。

Rendering Order - Queue tag

你可以使用 Queue tag 定义你的对象的渲染顺序。一个 shader 渲染队列的取决于,要保证透明 shader 在非透明对象之后被绘制。

这里有4个被定义的渲染队列,但是在预定义队列之间可以有更多的队列。预定义队列为:

  • Background - 该队列在任何其他队列之前渲染。你通常使用该队列,在物体真的需要出现在背景中的时候。
  • Geometry (default) - 用作大多数物体。 非透明几何体,使用该队列。
  • AlphaTest - 需要 alpha 测试的几何体使用该队列。它是与 Geometry 分离的队列,因为在所有固定物体渲染完,在渲染 alpha 测试对象,会更加高效。
  • Transparent - 该队列位于 GeometryAlphaTest 之后,在 back-to-front 顺序下。所有的 alpha 混合(例如 不写入深度缓存的 shader)对象应该在该队列(玻璃,例子特效)。
  • Overlay - 该队列意味着覆盖效果。任何最后渲染的对象,应该放在这个队列(e.g. lens flares)。
Shader "Transparent Queue Example"{     SubShader     {        Tags { "Queue" = "Transparent" }        Pass        {            // rest of the shader body...        }    }}

一个例子,来说明如何渲染透明对象

某些特殊情况,可以使用队列之间的值。在内部,每个队列由一个整型索引表示; Background 是 1000, Geometry 是 2000, AlphaTest 是 2450, Transparent 是 3000, Overlay 是 4000。如果一个 shader 的队列如下:

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

这将导致该对象,在所有非透明物体渲染后渲染,但是在透明对象渲染之前。队列的索引为 2001( geometry 加一)。在你希望一些对象永远被绘制在另一些对象之间时,这会很有用。例如,在大多数情况下,透明的水应该在非透明物体渲染完后渲染,但是起渲染应该在透明物体渲染之前。

队列到2500 (“Geometry+500”) 是被考虑作为“非透明”使用的,并且为了更好的渲染表现,请优化渲染顺序。更高的渲染顺序被考虑作为 “透明对象” 的渲染队列,并且将对象按照距离排序,由远及近的渲染。天空盒在所有不透明对象渲染完,和透明对象渲染之前渲染。

RenderType tag

RenderType 该 tag 将 shader 分类为几个预定义的组,例如 是一个 非透明 shader,或者是一个 alpha 测试 shader 等。该 tag 被 Shader Replacement 使用,在某些情况,用来产生 camera’s depth texture。

DisableBatching tag

一些 shader (大多数为做对象空间顶点变形的 shader) 在 Draw Call Batching 被使用时,不会工作 – 这是因为,batching 会将所有的几何体转换到世界空间,因此将丢失“对象空间”。

DisableBatching tag 可以被用来禁止 Batching。其有三个可能的值: “True” (总是对该 shader 禁用 batching), “False” (不禁用 batching;这是默认值) 和 “LODFading” (当 LOD fading 激活时禁用 batching;通常用于树木)。

ForceNoShadowCasting tag

如果 ForceNoShadowCasting tag 被定义,并且值为 “True”,那么使用该 subshader 渲染的对象,将永远不会投射阴影。这通常在你置换透明对象 shader 时不希望对象继承来自其他 subshader 的阴影时,非常有用。

IgnoreProjector tag

如果 IgnoreProjector tag 被定义,并且值为 “True”,那么使用该 shader 的对象,不会被 Projector 影响。这通常在半透明对象上很有用,因为 Projectors 无法影响他们。

CanUseSpriteAtlas tag

设置 CanUseSpriteAtlas tag 为 “False” 如果该 shader 是为精灵写的,并且当他们被包装为图集的时候,该 shader 将不会起作用(请看 Sprite Packer)。

PreviewType tag

PreviewType 指示材质的监控预览该如何显示该材质。默认情况下,材质显示为球体,但是 PreviewType 也可以被设置为 “Plane” (将会以2D屏幕的方式展现) 或 “Skybox” (将会展现为天空盒)。