美文网首页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