ShaderLab: Tags 的分配以及含义
概述:tag 是键-值对数据类型(key-value)。
为了更好的描述如何、何时使用SubShader,Unity 官方已经预定义了相关的 tag。除了官方定义的 tag 之外,用户还可以自定义,并且能在 C# 代码中访问它。
渲染管线的兼容性:
image
Tags 在 SubShader 中的应用
在 SubShader 中,Tags 通常在 SubShader 之前,以 Tags 开头的大括弧内,形式为: Tags{"" = "","" = ""}
需要注意的是,SubShaders 和 Passes 中虽然都可以应用 Tags ,但它们的工作方式有差异,因此不能混用。除此之外它们定义的地方也有差别:
Pass 的 tag 被定义在 Pass 代码块内部
SubShader 的 tag 被定义在SubShader 之内在 Pass 代码块之外
C# 中调用 SubShader Tag 实例:
void Start() { Debug.Log(material.GetTag("test",true,"not find tag")); }SubShader { Tags { "RenderType"="Opaque" "test"="test001" }}
log 输出
Tag 之 RenderPipeline:
RenderPipeline :告诉 Unity 此 SubShader 所使用的渲染管线类型:
UniversalRenderPipeline:此 SubShader 仅与 URP 兼容。HighDefinitionRenderPipeline: 此SubShader 仅兼容 HDRP。其它 :此 SubShader 不兼容 URP 和 HDRP 。
Tag 之 Queue:
Queue 用来告诉 Unity 几何图形的渲染顺序。当然,Queue 只是决定渲染层级的因素之一。
语法与有效值
有两种方式设定 Queue 的值,一种是直接给定渲染层名;另一种用表达式的方式:
“Queue” = """Queue" = "" + ""
常用的有:
渲染层级
C# 中引用渲染层级
默认情况下,几何图形都是在中指定的队列里渲染。在 Unity Editor 中,你可以通过修改Render Queue 属性,执行修改顺序的操作。
Tag 之 RenderType
渲染标识,可以在运行时查找到,并替换符合条件的 Shader
C# 接口为:
[*]Camera.RenderWithShader
public void RenderWithShader(Shader shader, string replacementTag)
[*]Camera.SetReplacementShader
public void SetReplacementShader(Shader shader, string replacementTag)
两个接口的区别
RenderWithShader与SetReplacementShader的区别是RenderWithShader是 当前帧 用指定的Shader渲染,SetReplacementShader是替换后的 每一帧 用指定的Shader渲染。
Unity 内置的标签有:
[*]Opaque: most of the shaders (Normal, Self Illuminated, Reflective, terrain shaders).
用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
[*]Transparent: most semitransparent shaders(Transparent,Particle,Font,Terrain additive pass shaders).
用于半透明着色器(透明,粒子,字体,地形额外通道)
[*]TransparentCutout:masked transparent shaders(Transparent Cutout,tow pass vegetation shaders).
蒙皮透明着色器(Transparent Cutout,双通道的植皮作色器)
[*]Background: Skybox shaders.
天空盒子
[*]Overlay: GUITexture,Halo,Flare shaders.
UI,光环,光晕着色器
[*]TreeOpaque: terrain engine tree bark.
地形引擎中的树皮
[*]TreeTransparentCutout:terrain engine tree leaves.
地形引擎中的树叶
[*]TreeBillboard:terrain engine billboarded trees.
地形引擎中的广告牌树
[*]Grass: terrain engine grass .
地形引擎中的草
[*]GrassBillboard:terrain engine billboarded grass .
地形引擎中的广告牌草
具体RenderType 的应用,会另开一篇讲解
参考链接:https://blog.csdn.net/liyaxin2010/article/details/83449410
Tag 之 ForceNoShadowCasting
此标签用来阻止几何体投射(有时是接受)阴影
Tags { "ForceNoShadowCasing" = "true"}
"ForceNoShadowCasing" = "true" 不投射或者接受阴影“ForceNoShadowCasing” = "false" 接受
Tag 之 DisableBatching
DisableBatching 子着色器标签阻止 Unity 将动态批处理应用于使用此子着色器的几何体。
这对于执行对象空间操作的着色器程序十分有用。动态批处理会将所有几何体都变换为世界空间,这意味着着色器程序无法再访问对象空间。因此,依赖于对象空间的着色器程序不会正确渲染。为避免此问题,请使用此子着色器标签阻止 Unity 应用动态批处理。
Tag 之 IgnoreProjector
如果 IgnoreProjector tag 被定义,并且值为 “True”,那么使用该 shader 的对象,不会被 Projector 影响。这通常在半透明对象上很有用,因为 Projectors 无法影响他们。
Tag 之 CanUseSpriteAtlas
设置 CanUseSpriteAtlas tag 为 “False” 如果该 shader 是为精灵写的,并且当他们被包装为图集的时候,该 shader 将不会起作用(请看 Sprite Packer)。
PreviewType
PreviewType 指示材质的监控预览该如何显示该材质。默认情况下,材质显示为球体,但是 PreviewType 也可以被设置为 “Plane” (将会以2D屏幕的方式展现) 或 “Skybox” (将会展现为天空盒)。
总结:
在ShaderLab 中,tags 非常有用,无论是用来规定渲染顺序还是用来标识类型以便动态替换,都少不了它。在实践中,经常用到的基本只有 RenderPipeline,Queue,RenderType 等。
页:
[1]