shader 模板的用法

模板测试在我们工作中用得不太多,一般会在做一些遮罩的时候会用到,比如窗户显示物体的效果,还有mmo经常会做的镜头被建筑遮挡就用另一个颜色代替。

当然其实还会有其他一些应用,先说下模板测试的原理。

模板测试的模式是

https://img-blog.csdn.net/20161230150419028

需要注意的是Comp,Pass,Fail 和ZFail将会应用给背面消隐的几何体(只渲染前面的几何体),除非Cull Front被指定,在这种情况下就是正面消隐的几何体(只渲染背面的几何体)。你也可以精确的指定双面的模板状态通过定义CompFront,PassFront,FailFront,ZFailFront(当模型为front-facing geometry使用)和ComBack,PassBack,FailBack,ZFailBack(当模型为back-facing geometry使用)

 

模板测试最关键的是一个判断,就是根据下面这个判断来确定是要显示谁的颜色的

if(referenceValue&readMask comparisonFunction stencilBufferValue&readMask)

通过像素

else

抛弃像素

 

其中readMask的默认值为255

其他的解释就不说那么多了。

 

窗口用法

一般我们用作遮罩的话就是比较普通的用法

第一个shader:

ColorMask 0

ZWrite Off

Stencil{

     Ref 1

     Comp Always

     Pass Replace

}

 

第二个shader:

Stencil {

      Ref 1

      Comp Equal

}

 

这里要主要的是要第一个shader先执行,首先因为管线每帧会重置模板的值,再者是因为我们需要先把第一个模板的数值写入mask中,然后第二个shader发现mask值和我们的ref相等时才会pass这个颜色。

 

这里有个关键就是第一个shader要先执行,你可以通过RenderQueue让她先执行或调整z轴来让她先执行(透明是从后往前渲染,不透明是从前往后渲染)

 

永远位于前面

第二个应用是让一个物体永远在另一个物体前面,类似我们做ui的时候想让一个物体永远在另一个物体前面就可以用这个方法。

做法是让需要永远在另一个前面的ref设置更大点,然后Comp是GEqual,并且大的ref需要replace。并且我们要保证我们渲染的物体是在transparent下渲染的(因为这样才能让无论z轴前后,后面的颜色都能渲染上来)

"RenderQueue"="Transparent"

需药永远在前面的模板:

Stencil

       {

              Ref 2

              Comp GEqual

              Pass Replace

       }

在后面的模板:

Stencil

       {

              Ref 1

              Comp GEqual

       }

 

原理:

我们首先保证我们在透明渲染下,这样前后都能用渲染颜色。然后我们的shader就无论谁先谁后都能渲染出来了。比如Ref为2的先渲染,则把模板的值已经写成2了,Ref为1的就没办法通过渲染了,自然当前像素就是以ref为2的渲染,

如果ref为1先渲染,则ref为2的时候会覆盖掉这个颜色,一样可以显示ref为2的颜色。

如果有各种层级之间的间隔,而且不想让一方处于另一方前面,可以设置不同的shader,不同的ref,大的ref代替小的

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值