首页 > 代码库 > 【Unity Shader】--- 准确认识SubShader语义块结构、渲染状态设定、Tags标签

【Unity Shader】--- 准确认识SubShader语义块结构、渲染状态设定、Tags标签

一【SubShader】
  每个UnityShader文件可以包含多个SubShader语义块,但至少要有一个。当Unity需要加载这个UnityShader时,
Unity会扫描所有的SubShader语义块,然后选择一个能够在目标平台上运行的SubShader。如果都不支持的话,Unity
就会使用FallBack语义指定的UnityShader。
  Unity提供这种语义的原因在于,不同的显卡具有不同的能力。例如,一些旧的显卡仅能支持一定数目的操作指令,
而一些高级的显卡可以支持更多的指令数,那么我希望在旧的显卡上使用计算复杂度较低的着色器,而在高级的显卡上
执行计算复杂度高的着色器,以便提供更出色的画面效果。

SubShader
{
  //可选的
  [Tags]
  //可选的
  [RenderSetup]


  Pass
  {

  }
  //或更多Pass
}
  SubShader中定义了一系列的Pass以及可选的标签[Tags]、状态[RenderSetup]。每个Pass定义一次完整的渲染流程
但是如果Pass数目过多会造成渲染性能的下降。因此,我们尽量使用数量最小的Pass。
补充说明:[Tags][RenderSetup]也可以在Pass中声明。不同的是,SubShader中的一些标签设置是特定的。也就是说,
这些标签和Pass中设置的标签是不一样的。而对于状态设置来说,其使用的语法是相同。不过在SubShader进行的设置
将会用于所用的Pass。


二【渲染状态】
  ShaderLab提供了一系列渲染状态的设定,这些指令可以设置显卡的各种状态,例如是否开启混合/深度测试等。
状态名称          设置指令                            解释
Cull     Cull Back|Front|Off                      设置剔除模式,剔除背面|正面|关闭剔除
ZTest    ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always    设置深度时使用的函数
ZWrite     ZWrite On|Off                        开启和关闭深度写入
Blend    Blend SrcFactor DstFactor                   开启并设置混合模式

  当在SubShader块中设置了上述状态,将会被应用于所有的Pass。如果不想这样(例如在双面渲染中,我们可以希望第一
个Pass剔除正面来对背面进行渲染,在第二个Pass中选择剔除背面来对正面进行渲染),可以在Pass内部来单独设置状态。

三【Tags标签】
  UnityShader的Tags是一个键值对(Key/Value Pair),他的键和值都是字符串类型。这些键值是对SubShader和渲染引擎
之前沟通的桥梁。他们用于告诉渲染引擎:怎么样和什么时候调用这个SubShader。
标签语法如下:Tags{"TagName1" = "Value1" "TagName2" = "Value2"}

待续...32

 

【Unity Shader】--- 准确认识SubShader语义块结构、渲染状态设定、Tags标签