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,当然,如有其它见解欢迎提出!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值