xiangtingsl 发表于 2022-2-16 13:58

Unity URP Stencil Test



最终效果

给需要进行 Stencil Test 的地方设置好 Stencil pref 的材质,材质面板及 Shader 如下



Stencil ID 是作为测试的基准的 int 型,范围是 0 ~ 255

Shader "Custom/Stencil"
{
    Properties
    {
      _StencilID("Stencil ID", Range(0, 255)) = 0
    }
    SubShader
    {
      Tags
      {
            "RenderType" = "Opaque"
            "RenderPipeline" = "UniversalPipeline"
            "Queue" = "Geometry"   
      }
      
      Pass
      {
            Blend Zero One
            Zwrite Off
            
            Stencil
            {
                Ref
                Comp Always
                Pass Replace
                Fail Keep
            }
      }
    }
}然后给需要在该 Stencil ID 时显示的物体设置好单独的 Layer



如图,场景中的 Suzanne 被设置为了名称 StencilLayer 4 的 Layer

最后在项目使用的 Renderer asset 中添加 Render feature - Render Objects,并做如下设置



Renderer asset 的 inspector 面板


[*]Renderer 的 Filtering - Opaque Layer Mask: 只勾选正常显示的 Layer;(下面的 Transparent Layer Mask 同理,只是本文用例中没有涉及到透明物体)
[*]新添加的 Render Feature - Render Objects 的 Filters - Layer Mask: 只勾选需要进行 Stencil Testing 的物体所属的 Layer;
[*]勾选新添加的 Render Feature - Render Objects 的 Overrides - Stencil,并修改其参数:
[*]Value 对应的是 Stencil Test 材质的 Stencil ID;
[*]Compare Function 为 Stencil Test 的判断条件,本文中使用 Equal 意为在 Stencil Testing 中,如果 Render Feature 中 Stencil 的 Value 值等于 Stencil Test 材质的 Stencil ID,则在 Stencil Test 材质的范围中显示 Render Feature 中 Layer Mask 的 Layer 所登记的物体。

本文最终效果使用以上方式做了四个 Stencil Test 材质并分别给了四个 Stencil ID,以达成立方体的四个面在 Stencil Test 后分别显示四个不同的物体。
彩蛋



照妖镜效果
页: [1]
查看完整版本: Unity URP Stencil Test