์คํ ์ค ํ ์คํธ๋ฅผ ์ ์ฉํด ๋ณด์
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
}
}์คํ ์ค ๋ฒํผ๋ ํฝ์ ์ ์ ์ฅ ๋๋ ํ๊ธฐํ๊ธฐ ์ํ ์ฉ๋์ ํฝ์ ๋ง์คํฌ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ณดํต ํ ํฝ์ ๋น 8๋นํธ ์ ์๊ฐ์ด๋ฉฐ ์ฌ์ฉ์๊ฐ ์ ํ ๊ฐ(์ฐธ์กฐ๊ฐ)๊ณผ ๋ฒํผ์ ํฌ๋ค, ์๋ค, ๊ฐ๋ค ๋ฑ๋ฑ ์ต์ ์ ํตํด ๋งค์นํ์ฌ ํด๋น ํฝ์ ์ ์ฌ์ฉํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
์คํ ์ค ์์ ์ ๋ฌธ๋ฒ์ ์๋์ ๊ฐ๋ค.
Stencil {
[Ref 0 ~ 255]
[Comp always]
[ReadMask 0 ~ 255]
[WriteMask 0 ~ 255]
[Pass keep]
[Fail keep]
[ZFail keep]
}
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๋ก ๋ณํฉ๋๋ค. |