【ShaderLab学习】SubShader Tags理解

ShaderLab: SubShader Tags

作用

SubShaders使用标签来告诉引擎如何以及何时将其渲染

语义:

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

指定TagName1具有Value1的值,TagName2具有Value2的值。标签的数目不受限制。

标签基本上是键值对(key-value pairs)。 在SubShader内部,标签用于确定渲染顺序和子渲染器的其他参数。 请注意,Unity识别的以下标记必须在SubShader节内,而不是Pass

除了由Unity识别的内置标签,你也可以使用自己的标签,并使用Material.GetTag函数查询它们。

常见Tag

Rendering Order - Queue tag 控制渲染顺序-队列标签

你可以使用队列标签来确定对象的绘制顺序。 Shader决定其对象属于哪个渲染队列,这样所有透明的Shader能保证在所有不透明的Shader后渲染。

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

  • Background:最先被调用的渲染,通常用来渲染背景。

  • Geometry (default):默认值,大多数物体使用此队列,用来渲染不透明的物体。

  • AlphaTest :alpha tested的物体使用此队列。 它是与几何一个独立的队列,因为在绘制所有实体后,渲染经过alpha-tested的对象更有效率。

  • Transparent:这个渲染队列是在Geometry和AlphaTest之后,以从后往前的顺序渲染的。 任何alpha混合(alpha-blended )(即不写入深度缓冲区depth buffer的Shader)应该在这里。例如玻璃,粒子效果。

  • Overlay: 此渲染队列用于叠加效果。 任何最后呈现的东西都应该在这里(例如镜头光晕)。

对于特殊用途,可以使用中间队列。在内部,每个队列由整数索引表示:
Background=1000,Geometry=2000,AlphaTest=2450,Transparent=3000和Overlay=4000.

如果着色器使用这样的队列:
Tags { “Queue” = “Geometry+1” }
这将使对象在所有不透明物体后,但在透明物体之前渲染,作为渲染队列索引将是2001(Geometry+1)。 这在你希望某些物体始终在其他物体集之间绘制的情况下非常有用。 例如,在大多数情况下,透明的水应该在不透明物体之后但在透明物体之前绘制。

队列的值到2500(“Geometry+ 500”)被认为“不透明”,优化对象的绘制顺序以获得最佳性能。 对于“透明物体”考虑较高的渲染队列,并按距离对物体进行排序,从最远的一个开始渲染,并以最近的一个结束。 天空盒在所有不透明和所有透明对象之间绘制。

更多细节可见我的另一篇文章:【ShaderLab学习】RenderQueue理解

RenderType tag 渲染类型

RenderType标签将shaders分类为多个预定义组,Unity可以运行时替换符合特定RenderType的所有Shader。

Shader更换是从脚本使用 Camera.RenderWithShader 或 Camera.SetReplacementShader 函数来完成的。这两个函数均以一个shader和一个replacementTag作为参数。

工作流程:相机还是像平常一样来渲染场景,物体也还是使用原有的材质,但是真实的shader是在使用时来进行改变:

如果replacementTag是空的,那么场景中的所有物体都用给定的替换着色器来进行渲染。
如果replacementTag不是空的,那么对于每个物体,将进行以下方式进行渲染:

  • 按照标签值来查找物体真正的着色器。
  • 如果没有标签,物体将不进行渲染。
  • 在替换Shader中,我们可以根据一个具有查找值的标签来找到一个子着色器subshader,如果没有这样的子着色器, 该物体将不进行渲染。现在可以应用子着色器来渲染物体。

详细使用可见我的另一篇文章:【ShaderLab学习】RenderType理解

DisableBatching 禁用批处理 有三个可能的值:

  • “True”(始终禁用此着色器的批处理)
  • “False”(不禁用批处理;这是默认值
  • “LODFading”(当LOD衰减活动时禁用批处理;主要用于树)

当shader中需要对顶点进行偏移的时候,一般把该项设置为“True”

ForceNoShadowCasting 强制无阴影投射

  • “True” (不会投射阴影)
  • “False” (默认值)

如果给出了ForceNoShadowCasting标签并且值为“True”,则使用此subshader渲染的对象将永远不会投射阴影。

IgnoreProjector 忽略投影机

  • “True” (表示不接受Projector组件的投影,常用于半透明物体)
  • “False”

CanUseSpriteAtlas 是否可以使用Sprite图集

  • “True”
  • “False”

PreviewType 材质在inspector视图下的预览样式

  • “Spheres?”(材质显示为球体,默认值)
  • “Plane”(显示为2D)
  • “Skybox”(将显示为天空盒)

参考:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值