找回密码
 立即注册
查看: 262|回复: 0

ShaderLab: Tags 的分配以及含义

[复制链接]
发表于 2022-5-4 08:46 | 显示全部楼层 |阅读模式
概述:

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 的值,一种是直接给定渲染层名;另一种用表达式的方式:
    “Queue” = "[queue name]""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 等。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 15:55 , Processed in 0.095066 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表