DirecX12 | Lecture 11. Depth Stencil View (인프런)
DirectX12 강의 11. Depth Stencil View를 정리한 글입니다.
DirecX12 | Lecture 11. Depth Stencil View (인프런)
강의 정보 🎓
- 강의명: C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈 - Part2: 게임 수학과 DirectX12
- 플랫폼: 인프런
- 현재 섹션: Lecture 11 – Depth Stencil View
- 주요 내용: DirectX 12 Z-버퍼를 사용해 화면에 그려지는 픽셀의 깊이를 기준으로 겹침 처리(Z-Buffering) 를 수행합니다.
1. VS 쉐이더 위치 보정
VS_Main()내부에서 정점 위치에 오프셋 추가:
1
output.pos += offset0;
2. 삼각형 2개 렌더링
Game::Update()에서 두 개의 삼각형을 렌더링하도록 수정한다.- 서로 다른 Z값을 가지도록 설정하여 Z-Buffer 테스트를 위한 작업이다.
3. DepthStencilBuffer 클래스 생성
DepthStencilBuffer클래스를 작성한다.Engine의 멤버로 보유하고Init()에서 생성한다.- DepthStencil Texture, View 등을 관리한다.
4. CommandQueueLayer 설정
RenderBegin 내부 수정:
1
2
mCommandList->OMSetRenderTargets(..., &cpuDsvDescriptorHandle, ...);
mCommandList->ClearDepthStencilView(...);
- RTV와 DSV를 동시에 바인딩
- 매 프레임마다 DSV를 Clear한다.
5. Shader 설정 수정
- 파이프라인 상태 객체(PSO)에 DSV 관련 설정 추가:
1
2
mPipelineStateDesc.DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT);
mPipelineStateDesc.DSVFormat = dsvFormat;
기본 설정을 사용하여 깊이 테스트 활성화 및 깊이 쓰기 가능
동작 원리 요약
- Z값이 더 작을수록 앞에 그려짐
- GPU는 Z값을 비교해 가장 가까운 픽셀만 화면에 표시
- Z-Buffer 초기화는 매 프레임
ClearDepthStencilView()호출로 수행
Z값이 더 작으면 앞에서 그려진다.
Depth & Stencil 추가 개념 요약 🧱
Depth Buffer (Z-Buffer)
- 깊이 값(Z값) 을 저장하는 버퍼이다.
- 가장 앞에 있는 픽셀만 그리기 위해 사용한다.
- 기본 규칙: Z값이 작을수록 카메라에 가깝다.
- 동작 원리:
- 픽셀을 그릴 때 Z값을 비교
- 이미 그려진 픽셀이 더 가까우면 새 픽셀은 버림
- 반대로 더 가까우면 픽셀을 갱신하고 Z버퍼도 업데이트
🎯 주로 겹쳐진 물체의 렌더링 순서를 자동으로 처리할 때 사용됩니다.
Stencil Buffer
- 픽셀마다 8비트 정수 값(256)을 저장할 수 있는 버퍼
- 복잡한 렌더링 효과에 사용되는 마스크 역할
- 동작 방식:
- 특정 영역을 지정하거나 제외하고 싶을 때 사용
- 예: 미니맵 테두리, 포탈, 그림자 영역 한정 렌더링 등
🎯 조건부 렌더링 제어에 적합 — “이 영역만”, “이 영역 제외하고” 렌더링!
함께 쓰는 이유
- Depth와 Stencil은 같은 리소스에 함께 저장되며,
- DirectX 12에서는 보통 DSV(Depth Stencil View)로 통합하여 관리합니다.
예시: 한눈에 보기
| 버퍼 종류 | 역할 | 주요 사용 예 |
|---|---|---|
| Depth | Z값 비교 | 겹쳐진 오브젝트 처리 (카메라 기준) |
| Stencil | 마스크 값 비교 | UI 클리핑, 그림자 제한, 포스트 프로세싱 영역 제한 등 |
요약 및 느낀점 📝
- Depth Stencil Buffer를 추가하여 깊이 값에 따라 앞뒤가 처리되도록 하였다.
느낀점 💡 뎁스-스텐실 버퍼는 이후 다양한 그래픽 기술, 최적화에 활용될 수 있는 내용이기 때문에 내용은 짧지만 잘 알아 두는 것이 중요하다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
