参考
https://gwb.tencent.com/community/detail/127404
Stencil Test:
stencil test,模板测试,它发生在透明度测试(alpha test)之后,深度测试(depth test)之前。
模板缓冲区为帧缓冲区中的每个像素存储一个 8 位整数值。为给定像素执行片元着色器之前,GPU 可以将模板缓冲区中的当前值与给定参考值进行比较。这称为模板测试。如果模板测试通过,则 GPU 会执行深度测试。如果模板测试失败,则 GPU 会跳过对该像素的其余处理。这意味着可以使用模板缓冲区作为遮罩来告知 GPU 要绘制的像素以及要丢弃的像素。ShaderLab 命令:模板 - Unity 手册
一般来说,使用模板测试,可以让我们配置哪一部分的像素可以进行绘制,哪一部分不用进行绘制,在此之前,我们引入一块mask(在unity中创建一个plane),给它指定一个模板缓冲的值(0~255),默认情况下,这个值是0。
Stencil
{
Ref 1
Comp Always
Pass Replace
}
场景里,我放置了一个bunny模型,把它的shader代码添加模板测试:
Stencil
{
Ref 1
Comp Equal
Pass Keep
}
这样就可以初步得到我们想要的效果了,我们都做了哪些事呢?首先,我们在mask的shader上让它的模板缓冲区的值为1,然后,在bunny的shader上,把它的Ref改为1,后面的对比操作是Equal,也就是如果bunny在模板缓冲区的值为1的部门,那就Keep(Keep the current contents of the stencil buffer),也就是正常渲染。
如果我们想要的得到一个下图的效果:
想一下,大概的思路就是创建一个立方体,然后复制一个mask,设置特定的值a,我们先在unity里做到这一步。后面的步骤,大概是:创建一个其他的游戏模型,把它的shader值改为a,这样做似乎可以实现,但如果模型多了,或者场景复杂的话,实现起来就比较麻烦而且不好配置。所以,我们使用URP的Render Feature功能。
Render Feature:
Renderer Feature可让我们向URP Renderer添加额外的渲染通道,支持我们进行Asset资产配置来重写从而可以自定义渲染的顺序、渲染的对象、材质等等。URP系列教程 | 手把手教你如何用Renderer Feature - 知乎 (zhihu.com)
首先我们创建两个新的Layer:
然后分别将场景中的bunny和wizard指定这两个新创建的layer:
然后找到我们URP项目中正在使用的rednerer asset,并添加Render Feature->Render Object:
通过这种方式,我们就可以不用去更改方盒子中每个物体的shader的代码、写Stencil这部分,也能实现想要的效果: