Stencil

  • vert > Depth Test > Stencil Test > Render
  • frag > AlphaTest > Blending
ZTest깊이 버퍼 비교 후 색상 입히기기본값 LEqual이기에 카메라 가까운걸 나중에 그림
ZWrite깊이 버퍼에 쓰기 시도ZTest 성공해야 깊이 버퍼에 쓸 수 있음
ZWrite OnZWrite Off
ZTest 성공깊이 O / 색상 O깊이 X / 색상 O
ZTest 실패깊이 X / 색상 X깊이 X / 색상 X
ZTest 예
ZTest LEqual물체가 앞에 있다
ZTest Greater물체가 가려져 있다

템플릿

// 기본값
Pass
{
    Stencil
    { 
        Ref         0      // [0 ... 255]
        ReadMask    255    // [0 ... 255]
        WriteMask   255    // [0 ... 255]
        Comp        Always
        Pass        Keep
        Fail        Keep
        ZFail       Keep
    }
    ZWrite On              // On | Off
    ZTest LEqual           // Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
}
Properties
{
    [IntRange]
    _StencilRef("Stencil ID [0-255]",      Range(0, 255)) = 0
    
    [IntRange]
    _StencilReadMask("ReadMask [0-255]",   Range(0, 255)) = 255
    
    [IntRange]
    _StencilWriteMask("WriteMask [0-255]", Range(0, 255)) = 255

    [Enum(UnityEngine.Rendering.CompareFunction)]
    _StencilComp("Stencil Comparison",     Float) = 8 // Always

    [Enum(UnityEngine.Rendering.StencilOp)]
    _StencilPass("Stencil Pass",           Float) = 0 // Keep

    [Enum(UnityEngine.Rendering.StencilOp)]
    _StencilFail("Stencil Fail",           Float) = 0 // Keep

    [Enum(UnityEngine.Rendering.StencilOp)]
    _StencilZFail("Stencil ZFail",         Float) = 0 // Keep
}

Pass
{
    Stencil
    { 
        Ref         [_StencilRef]
        ReadMask    [_StencilReadMask]
        WriteMask   [_StencilWriteMask]
        Comp        [_StencilComp]
        Pass        [_StencilPass]
        Fail        [_StencilFail]
        ZFail       [_StencilZFail]
    }
}

table

구분기본값
Ref-버퍼에 기록
ReadMask255
WriteMask255
CompAlways
PassKeep스텐실 테스트 성공시
FailKeep스텐실 테스트 실패시
ZFailKeep스텐실 테스트 성공시 && ZTest 실패시
Comp
Neverfalse1
Less버퍼 > 참조2
Equal버퍼 == 참조3
LEqual버퍼 >= 참조4
Greater버퍼 < 참조5
NotEqual버퍼 != 참조6
GEqual버퍼 <= 참조7
Alwaystrue8
스텐실
Keep변화 없음0
Zero01
Replace참조 값2
IncrSat증가. 최대 2553
DecrSat감소. 최소 04
Invert반전5
IncrWarp증가. 255면 0으로6
DecrWarp감소. 0이면 255로7

Ex

마스킹

  • ZTest 실패: 깊이 X / 색상 X
// 마스크.
// 일부러 비교(Comp)하지 않아서 실패상태로 만들고(Fail) Ref값을 덮어씌운다(Replace).
// 마스킹 작업이 오브젝트 보다 먼저 렌더링 되어야 함으로, 렌더큐 확인.
Stencil
{
    Ref     1
    Comp    Never
    Fail    Replace
}
// 오브젝트.
// 앞서 마스크가 1로 덮어씌운 부분과 같은지 비교(Equal).
// 마스킹 작업이 오브젝트 보다 먼저 렌더링 되어야 함으로, 렌더큐 확인.
Stencil
{ 
    Ref     1
    Comp    Equal
}

실루엣

  • 가려져 있는 물체 그리기
      1. 일반
      • 스텐실 버퍼 Write
      1. 가려지면
      • 가려져있는가 : ZTest Greater
      • 스텐실 버퍼 비교
Pass
{
    Tags
    {
        "LightMode" = "SRPDefaultUnlit"
    }
    
    ZTest Greater
    ZWrite Off

    Stencil
    {
        Ref 2
        Comp NotEqual
    }
}

Pass
{
    Tags
    {
        "LightMode" = "UniversalForward"
    }

    Stencil
    {
        Ref 2
        Pass Replace
    }
}

Ref