Tags & Blending

Tags

        Tags是SubShader的一部分,我们可以通过在Tags中添加不同的标签,来告诉引擎物体的渲染顺序和渲染方式. Tags可以写在Subshader或者Pass中,具体格式为Tags { "TagName1" = "Value1" "TagName2" = "Value2" },在一个Tags中可以使用多个不同的标签,标签之间以空格区分开,不能使用,进行分隔.
        标签基本上都是以键值对的方式存在的.根据Tags出现的位置的不同(使用方式不同),区分为 SubShader Tags 和 Pass Tags.在这两种不同的Tags中,使用的标签也会存在差异.

SubShader Tags

         SubShader Tags 就是直接写在SbuShader中的Tags.这种Tags中的标签确定了改SubShader的渲染顺序和其他一些参数.在SubShader Tags中不仅可以使用unity预设的标签,和可以使用自定义的标签,可以使用Material.GetTag函数来查询这些标签.

    SubShader Tags 常用标签

    ◆ Queue
        可以使用该标签来确定对象的绘制顺序,unity预置了5个值.
         ● Background
         ● Geometry (默认值)
         ● AlphaTest
         ● Transparent
         ● Overlay

    ◆ RenderType
         可以使用该标签将shader区分到几个预定义的组中,一般用来标记物体,区分物体的渲染顺序

    ◆ DisableBatching
        该标签在某些(对象空间顶点变形)shader中不起作用,原因在于使用批处理会将所有的几何体转换到世界空间中,会丢失物体空间.存在3个值.
         ● True
         ● False (默认值)
         ● LODFading

    ◆ ForceNoShadowCasting
        控制对象是否投射阴影,一般使用在透明物体且不需要阴影的物体上.存在2个值
         ● True
         ● False(默认值)

    ◆ IgnoreProjector
        控制对象是否接受阴影,一般用在半透明物体上.存在2个值
         ● True
         ● False(默认值)

    ◆ CanUseSpriteAtlas
        表示没看懂是干什么的

    ◆ PreviewType
        设置预览模型

Pass Tags

         Pass Tags 就是写在Pass中的Tags.这种Tags中的标签控制了Pass在渲染管线中的作用.常用标签

    Pass Tags 常用标签

    ◆ LightMode
        定义了Pass使用的照明方式.主要存在11种不同的方式
         ● Always
         ● ForwardBase
         ● ForwardAdd
         ● Deferred
         ● ShadowCaster
         ● MotionVectors
         ● PrepassBase
         ● PrepassFinal
         ● Vertex
         ● VertexLMRGBM
         ● VertexLM

    ◆ PassFlags
  使用此标签可以让Pass更改渲染管线中数据传递的方式.存在的值
  ● OnlyDirectional 在ForwardBase中使用时,该标签可以让其仅将主管员和光照探针数据传递到着色器中.

 ◆ RequireOptions
  使用此标签可以让Pass仅在满足特定的外部条件是才会使用该Pass.存在的值
   ● SoftVegetation

Alpha Test

  在片元着色器工作完成之后,渲染管线会进行这一步操作(Alpha Test).
  在这一步的操作中,主要是根据两个物体的是否是透明物体,来决定最终的颜色混合,简单的说,如果有两个物体A,B参与到这一步中,假定A距离摄像机更近,并对B物体有遮挡,进行到此的时候,如果A是不透明物体,那么就会在对应的像素中,A所在的像素将会完全被A占用,如果A为半透明物体,则保留下A,B的信息,进入到下一步的融合操作中.
        感觉渲染管线在历经磨难,到这里的时候,才终于知道哪些需要被绘制到屏幕上,哪些不能被看见,就果断舍弃了.

Blend

  经过了Alpha Test 的所有信息,还无法直接进入到像素的绘制层面,还需要经过这最后一步的操作--融合.
  这一步的操作主要是针对带有透明信息的物体的操作,假设有A,B两个物体.假定A距离摄像机更近,并对B物体有遮挡.此时A为半透明物体,那么就需要根据设定的融合方式,对A,B两个物体遮挡部分的像素颜色进行最终的融合处理.
  Blend接受两个输入,一般称呼为SrcFactor与DstFactor,SrcFactor表示的是我们当前正在处理片元着色器刚刚处理完成,而DstFactor则来自于Color Buffer中.粗俗的说,这个Color Buffer就是存储这像素颜色的一个数组.存储这对应每一个像素的颜色.于此类似的还有Depth Buffer.
  Unity已经封装好了一些关于Blend常用的操作.我们可以通过一些简单的语句,来开启或者关闭Blend的操作(为了渲染的实效性,默认是关闭Blend操作的,毕竟现实中大部分物体都是不透明的,uniyt基于Tag中关于RenderType的描述,会对这一步进行一些优化处理).
 ◆ 语句
  ● Blend Off   关闭Blend(默认)
  ● Blend SrcFactor DstFactor   配置并开启Blend, 融合方式为 SrcColor * SrcFactor (常见的颜色融合方式,前景色 * 透明值 + 背景色 * (1 - 透明值))
  ● Blend SrcFactor DstFactor, SrcFactorA DstFactorA   与上诉方式一样,只是采用不同的混合因子来进行融合.
  BlendOp Op   以其他的方式代替两种混合颜色相加的操作.
  ● BlendOp OpColor, OpAlpha   与上述一样,只是替代的操作不限于颜色,还包括透明度.

你可能感兴趣的:(Tags & Blending)