Unity Shader Tag

最近在学unity shader,学到SubShader的Tag的时候尤其是对于RenderType很模糊,网上文章看了半天也没有一个具体的解释,于是自己仔细阅读官方文档后,算是明白了些,所以写出来为一些还不明白的shader初学者作为参考


Subshaders使用标签来告诉unity何时去渲染,tag有好几种,最常见的有俩种”Queue”和”RenderType”;


“Queue”:渲染顺序队列

物体的渲染是有顺序的,如果没有顺序,那结果可想而知,而Queue可以让我们去控制你想渲染的物体的渲染顺序而与物体距离相机的远近无关,unity有一组默认的渲染顺序队列

  • Background(1000)
  • Geometry(2000)
  • AlphaTest(2450)
  • Transparent(3000)
  • Overlay(4000)

括号里的是对应的int索引,值越大越靠后被渲染,因为是int值,所以我们可以这样去使用

 SubShader
    {
        Tags { "Queue"="Background+10"  }
        //...
    }

它的意义就是在背景被渲染完后,Geometry前被渲染,这样的方式是会经常用到的,关于“Queue”网上的一些文章其实说的很详细了,而我想重点说的是”RenderType”

“RenderType”:RenderType标签将着色器分类为几个预定义的组,可以动态去替换相同RenderType值的着色器

看到这句话肯定会懵,没关系,我们往下看

有些时候,我们为了达到某种效果需要使用不同的着色器,unity为我们提供了两个接口:

 Camera.RenderWithShader(Shader shader,string replacementTag );
 Camera.SetReplacementShader((Shader shader,string replacementTag );
void Start() {
    camera.SetReplacementShader (EffectShader, "RenderType");
}

我这里直接把官方文档当中的代码拿过来方便说明,我们可以在代码中去使用这两个接口,第一个参数指明了被用于替换的shader,第二个参数就是我们的RenderType,下面我们再把官方的shader拿上来

Shader "EffectShader" {
     SubShader {
         Tags { "RenderType"="Opaque" }
         Pass {
             ...
         }
     }
     SubShader {
         Tags { "RenderType"="SomethingElse" }
         Pass {
             ...
         }
     }
 ...
 }

这个流程就是,函数先判断如果第二个参数为空,则拿EffectShader去替换所有场景中的物体的着色器,如果不为空,EffectShader找不到则不渲染,EffectShader存在但是RenderType的值找不到也不渲染。所以,如果场景中的物体的着色器的SubShader 的tag的RenderType值为”Opaque”就会被EffectShader的第一个SubShader 替换掉,以此类推。


到这里大致就了解了RenderType,当然,如有其它见解欢迎提出!

你可能感兴趣的:(UnityShade)