Unity ShaderLab: Stencil 관련 커맨드 해설
이 문서는 Unity ShaderLab에서 스텐실(buffer) 설정을 다루는 방법에 대한 내용을 쉽게 이해할 수 있도록 해설합니다. 스텐실 버퍼는 그래픽스에서 특정 픽셀의 렌더링을 제어하는 데 사용됩니다. 특히, 포털이나 미러 같은 특수 효과를 구현할 때 유용합니다.
스텐실 버퍼란?
스텐실 버퍼는 각 픽셀에 대해 8비트 정수 값을 저장하는 메모리입니다. GPU는 이 값을 사용하여 특정 픽셀의 렌더링 여부를 결정합니다. 스텐실 테스트에 통과하면 GPU는 추가적인 깊이 테스트를 진행합니다만, 실패한 경우 해당 픽셀은 건너뜁니다.
사용 예시
- 포털 효과
- 미러 반사
- 하드 쉐도우 렌더링
스텐실 커맨드 사용법
여기서는 ShaderLab의 스텐실 관련 커맨드인 Stencil의 사용법을 설명합니다.
커맨드 구조
Stencil {
Ref <ref>
ReadMask <readMask>
WriteMask <writeMask>
Comp <comparisonOperation>
Pass <passOperation>
Fail <failOperation>
ZFail <zFailOperation>
}
주요 파라미터 설명
| 파라미터 | 설명 | 기본값 | 값 범위 |
|---|---|---|---|
| Ref | 스텐실 테스트 시 비교할 레퍼런스 값 | 0 | 0 - 255 |
| ReadMask | 스텐실 테스트를 수행할 때 마스크로 사용할 값 | 255 | 0 - 255 |
| WriteMask | 스텐실 버퍼에 기록할 때 마스크로 사용할 값 | 255 | 0 - 255 |
| Comp | 스텐실 테스트를 위한 비교 작업 | Always | 다양한 비교 작업 |
| Pass | 스텐실 테스트와 깊이 테스트를 통과했을 때 수행할 작업 | Keep | 다양한 스텐실 작업 |
| Fail | 스텐실 테스트에 실패했을 때 수행할 작업 | Keep | 다양한 스텐실 작업 |
| ZFail | 깊이 테스트에 실패했을 때 수행할 작업 | Keep | 다양한 스텐실 작업 |
사용 예제
- 스텐실 버퍼에 값 쓰기
Shader "Examples/CommandExample"
{
SubShader
{
Pass
{
Stencil
{
Ref 2
Comp Always
Pass Replace
}
}
}
}
- 스텐실 테스트 조건 부여
Shader "Examples/ConditionalStencil"
{
SubShader
{
Stencil
{
Ref 2
Comp Less
}
Pass
{
// ... 나머지 코드
}
}
}
스텐실 테스트 결과 예제
| 비교 작업 | 설명 |
|---|---|
| Never | 픽셀을 절대 렌더링하지 않습니다. |
| Less | 레퍼런스 값이 스텐실 버퍼의 현재 값보다 작을 경우 렌더링합니다. |
| Equal | 레퍼런스 값이 스텐실 버퍼의 현재 값과 같을 경우 렌더링합니다. |
| Always | 픽셀을 항상 렌더링합니다. |
결론
스텐실 버퍼는 그래픽스에서 복잡한 효과를 처리하기 위한 강력한 도구입니다. 스텐실 테스트를 통해 매우 세밀하게 픽셀 단위의 제어가 가능합니다. 위의 기본 예제를 바탕으로, 여러분의 프로젝트에 다양한 효과를 추가해 보세요.