스텐실 버퍼(stencil buffer)는 최신 그래픽 하드웨어에서 컬러 버퍼(color buffer) 및 Z-버퍼(Z-buffer, 깊이 버퍼)에 추가로 존재하는 데이터 버퍼이다. 각 픽셀 단위로 동작하며, 일반적으로 픽셀당 1바이트(8비트)의 정수 값을 저장한다. Z-버퍼와 스텐실 버퍼는 그래픽 하드웨어의 RAM에서 동일한 메모리 영역을 공유하는 경우가 많으며, 일반적으로 24비트 Z-버퍼 + 8비트 스텐실 버퍼의 조합으로 구성된다.
스텐실 버퍼의 가장 기본적인 용도는 렌더링(rendering) 영역을 제한하는 스텐실링(stenciling)이다. GPU는 프래그먼트 셰이더(fragment shader)를 실행하기 전에 스텐실 버퍼의 현재 값을 미리 설정된 참조 값(reference value)과 비교하는 스텐실 테스트(stencil test)를 수행한다. 이 테스트를 통과한 픽셀에만 렌더링이 이루어지며, 테스트 결과에 따라 스텐실 값을 증가시키거나 감소시키는 등의 연산을 수행할 수 있다.
Z-버퍼(깊이 테스트)와 스텐실 수정자의 결합을 통해 다양한 그래픽 효과가 가능하다. 주요 응용 분야는 다음과 같다.
- 그림자 볼륨(shadow volume): 3D 장면에 실시간 그림자를 추가하는 기법으로, Frank Crow가 1977년에 처음 제안하였다. 게임 《둠 3(Doom 3)》에서 대중화되었으며, 이 게임에서 사용된 변형 기법은 카맥 리버스(Carmack's Reverse)로 알려져 있다.
- 평면 반사(planar reflection): 거울과 같은 반사 표면을 구현할 때, 반사된 장면을 해당 영역에만 렌더링하는 데 사용된다.
- 포털 렌더링(portal rendering): 화면에서 포털(portal)에 의해 가려진 영역을 식별하고 해당 픽셀을 올바르게 다시 렌더링하는 데 사용된다.
- 데퍼드 셰이딩(deferred shading): 특정 조명이 영향을 줄 수 없는 픽셀을 마킹하거나 거절하는 데 사용되어 조명 계산을 조명 볼륨 내부로 제한한다.
- 구성적 입체 기하학(CSG): 불리언 연산을 통한 솔리드 모델링 기법에서 스텐실 버퍼와 Z-버퍼를 함께 사용하여 문제를 해결한다.
- 실루엣 추출, 교차점 강조, 디졸브, 페이드, 아웃라인 드로잉 등.
최초로 1비트 스텐실 버퍼를 지원한 상용 칩은 3Dlabs의 Permedia II이다. 스텐실 버퍼의 기능은 OpenGL, Direct3D, Vulkan, Metal 등의 그래픽스 API를 통해 접근 및 제어할 수 있다.