Skip to content

Latest commit

ย 

History

History
158 lines (127 loc) ยท 4 KB

File metadata and controls

158 lines (127 loc) ยท 4 KB

Abstract

์Šคํ…์‹ค ํ…Œ์ŠคํŠธ๋ฅผ ์ ์šฉํ•ด ๋ณด์ž

Shader

Shader "UnityShaderTutorial/basic_stencil_test1" {
    SubShader {
        Tags { "RenderType"="Opaque" "Queue"="Geometry"}
        Pass {
            Stencil {
                Ref 2
                Comp always
                Pass replace
            }
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            struct appdata {
                float4 vertex : POSITION;
            };
            struct v2f {
                float4 pos : SV_POSITION;
            };
            v2f vert(appdata v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;
            }
            half4 frag(v2f i) : SV_Target {
                return half4(1, 0, 0, 1); // red
            }
            ENDCG
        }
    } 
}

Shader "UnityShaderTutorial/basic_stencil_test2" {
    Stencil {
        Ref 2
	    Comp equal
	    Pass keep
	    ZFail decrWrap
    }

    ...

    half4 frag(v2f i) : SV_Target {
        return half4(0, 1, 0, 1); // green
    }
}

Shader "UnityShaderTutorial/basic_stencil_test3" {
    Stencil {
        Ref 1
	    Comp equal
    }

    ...

    half4 frag(v2f i) : SV_Target {
        return half4(0, 0, 1, 1); // blue
    }
}

Description

์Šคํ…์‹ค ๋ฒ„ํผ๋Š” ํ”ฝ์…€์„ ์ €์žฅ ๋˜๋Š” ํ๊ธฐํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„์˜ ํ”ฝ์…€ ๋งˆ์Šคํฌ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ณดํ†ต ํ•œ ํ”ฝ์…€๋‹น 8๋น„ํŠธ ์ •์ˆ˜๊ฐ’์ด๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ •ํ•œ ๊ฐ’(์ฐธ์กฐ๊ฐ’)๊ณผ ๋ฒ„ํผ์˜ ํฌ๋‹ค, ์ž‘๋‹ค, ๊ฐ™๋‹ค ๋“ฑ๋“ฑ ์˜ต์…˜์„ ํ†ตํ•ด ๋งค์น˜ํ•˜์—ฌ ํ•ด๋‹น ํ”ฝ์…€์„ ์‚ฌ์šฉํ• ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

์Šคํ…์‹ค ์ž‘์—…์˜ ๋ฌธ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Stencil {
	[Ref 0 ~ 255]
	[Comp always]
        [ReadMask 0 ~ 255]
        [WriteMask 0 ~ 255]
	[Pass keep]
	[Fail keep]
	[ZFail keep]
}

Unity ShaderLab Stencil

Ref

Ref (0 ~ 255)
- Comp๊ฐ€ always๊ฐ€ ์•„๋‹ˆ๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์ผ ๋•Œ ๋น„๊ตํ•˜๋Š” ๊ฐ’์ด๋ฉฐ, 
  Pass, Fail์ด๋‚˜ ZFail์ด replace๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ ๋ฒ„ํผ์— ์จ๋„ฃ์„ ๊ฐ’. 0-255 ์ •์ˆ˜

ReadMask

ReadMask (0 ~ 255)
- Ref ๊ฐ’์„ ๋ฒ„ํผ์˜ ๋‚ด์šฉ๊ณผ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉ
  (referenceValue & readMask) ๋น„๊ต ํ•จ์ˆ˜ (stencilBufferValue & readMask)

Comp

Comp (๋น„๊ต ํ•จ์ˆ˜)
- ๋ฒ„ํผ ์•ˆ์˜ ํ˜„์žฌ ๊ฐ’๊ณผ ์ฐธ์กฐ ๊ฐ’์„ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜. ๊ธฐ๋ณธ always.

Pass

Pass (์Šคํ…์‹ค ์ž‘์—…)
- ์Šคํ…์‹ค ๊ฒ€์‚ฌ(์™€ ๊นŠ์ด ๊ฒ€์‚ฌ)๊ฐ€ ํ†ต๊ณผํ•œ ๊ฒฝ์šฐ ๋ฒ„ํผ ์•ˆ์˜ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ keep.

Fail

Fail (์Šคํ…์‹ค ์ž‘์—…)
- ์Šคํ…์‹ค ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•œ ๊ฒฝ์šฐ ๋ฒ„ํผ ์•ˆ์˜ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ keep.

ZFail

ZFail (์Šคํ…์‹ค ์ž‘์—…)
- ์Šคํ…์‹ค ๊ฒ€์‚ฌ๋Š” ํ†ต๊ณผํ–ˆ์ง€๋งŒ ๊นŠ์ด ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•œ ๊ฒฝ์šฐ ๋ฒ„ํผ ์•ˆ์˜ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ keep.

๋น„๊ต ํ•จ์ˆ˜

Greater ๋ฒ„ํผ์˜ ๊ฐ’๋ณด๋‹ค ์ฐธ์กฐ ๊ฐ’์ด ํฐ ํ”ฝ์…€๋งŒ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
GEqual ๋ฒ„ํผ์˜ ๊ฐ’๋ณด๋‹ค ์ฐธ์กฐ ๊ฐ’์ด ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ํ”ฝ์…€๋งŒ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
Less ๋ฒ„ํผ์˜ ๊ฐ’๋ณด๋‹ค ์ฐธ์กฐ ๊ฐ’์ด ์ž‘์€ ํ”ฝ์…€๋งŒ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
LEqual ๋ฒ„ํผ์˜ ๊ฐ’๋ณด๋‹ค ์ฐธ์กฐ ๊ฐ’์ด ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ํ”ฝ์…€๋งŒ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
Equal ๋ฒ„ํผ์˜ ๊ฐ’๊ณผ ์ฐธ์กฐ ๊ฐ’์ด ๊ฐ™์€ ํ”ฝ์…€๋งŒ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
NotEqual ๋ฒ„ํผ์˜ ๊ฐ’๊ณผ ์ฐธ์กฐ ๊ฐ’์ด ๋‹ค๋ฅธ ํ”ฝ์…€๋งŒ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
Always ์Šคํ…์‹ค ๊ฒ€์‚ฌ๊ฐ€ ๋ฌด์กฐ๊ฑด ํ†ต๊ณผ๋ฉ๋‹ˆ๋‹ค.
Never ์Šคํ…์‹ค ๊ฒ€์‚ฌ๊ฐ€ ๋ฌด์กฐ๊ฑด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์Šคํ…์‹ค ์ž‘์—…

Keep ๋ฒ„ํผ์˜ ํ˜„์žฌ ๊ฐ’์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
Zero ๋ฒ„ํผ์— 0์„ ์จ๋„ฃ์Šต๋‹ˆ๋‹ค.
Replace ๋ฒ„ํผ์— ์ฐธ์กฐ ๊ฐ’์„ ์จ๋„ฃ์Šต๋‹ˆ๋‹ค.
IncrSat ๋ฒ„ํผ์˜ ํ˜„์žฌ ๊ฐ’์„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ’์ด ์ด๋ฏธ 255์ด๋ฉด 255๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
DecrSat ๋ฒ„ํผ์˜ ํ˜„์žฌ ๊ฐ’์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ’์ด ์ด๋ฏธ 0์ด๋ฉด 0์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
Invert ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ๋ฐ˜์ „ํ•ฉ๋‹ˆ๋‹ค.
IncrWarp ๋ฒ„ํผ์˜ ํ˜„์žฌ ๊ฐ’์„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ’์ด ์ด๋ฏธ 255์ด๋ฉด 0์œผ๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค.
DecrWarp ๋ฒ„ํผ์˜ ํ˜„์žฌ ๊ฐ’์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ’์ด ์ด๋ฏธ 0์ด๋ฉด 255๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค.