美文网首页Unity3d 技术笔记
ShaderLab: Tags 的分配以及含义

ShaderLab: Tags 的分配以及含义

作者: 子夜书案 | 来源:发表于2022-05-03 22:42 被阅读0次

概述:

tag 是键-值对数据类型(key-value)。

为了更好的描述如何、何时使用SubShader,Unity 官方已经预定义了相关的 tag。除了官方定义的 tag 之外,用户还可以自定义,并且能在 C# 代码中访问它。

渲染管线的兼容性:

image

Tags 在 SubShader 中的应用

在 SubShader 中,Tags 通常在 SubShader 之前,以 Tags 开头的大括弧内,形式为: Tags{"[name]" = "[value]","[name]" = "[value]"}

需要注意的是,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 的值,一种是直接给定渲染层名;另一种用表达式的方式:

  1. “Queue” = "[queue name]"
  2. "Queue" = "[queue name]" + "[offset]"

常用的有:

渲染层级

C# 中引用渲染层级

默认情况下,几何图形都是在[Queue]中指定的队列里渲染。在 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 等。

相关文章

网友评论

    本文标题:ShaderLab: Tags 的分配以及含义

    本文链接:https://www.haomeiwen.com/subject/obbbyrtx.html