포스트

DirecX12 | Lecture 11. Depth Stencil View (인프런)

DirectX12 강의 11. Depth Stencil View를 정리한 글입니다.

DirecX12 | Lecture 11. Depth Stencil View (인프런)

강의 정보 🎓


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값이 더 작으면 앞에서 그려진다.

Z값이 더 작으면 앞에서 그려진다.


Depth & Stencil 추가 개념 요약 🧱

Depth Buffer (Z-Buffer)

  • 깊이 값(Z값) 을 저장하는 버퍼이다.
  • 가장 앞에 있는 픽셀만 그리기 위해 사용한다.
  • 기본 규칙: Z값이 작을수록 카메라에 가깝다.
  • 동작 원리:
    1. 픽셀을 그릴 때 Z값을 비교
    2. 이미 그려진 픽셀이 더 가까우면 새 픽셀은 버림
    3. 반대로 더 가까우면 픽셀을 갱신하고 Z버퍼도 업데이트

🎯 주로 겹쳐진 물체의 렌더링 순서를 자동으로 처리할 때 사용됩니다.


Stencil Buffer

  • 픽셀마다 8비트 정수 값(256)을 저장할 수 있는 버퍼
  • 복잡한 렌더링 효과에 사용되는 마스크 역할
  • 동작 방식:
    • 특정 영역을 지정하거나 제외하고 싶을 때 사용
    • 예: 미니맵 테두리, 포탈, 그림자 영역 한정 렌더링 등

🎯 조건부 렌더링 제어에 적합 — “이 영역만”, “이 영역 제외하고” 렌더링!


함께 쓰는 이유

  • Depth와 Stencil은 같은 리소스에 함께 저장되며,
  • DirectX 12에서는 보통 DSV(Depth Stencil View)로 통합하여 관리합니다.

예시: 한눈에 보기

버퍼 종류역할주요 사용 예
DepthZ값 비교겹쳐진 오브젝트 처리 (카메라 기준)
Stencil마스크 값 비교UI 클리핑, 그림자 제한, 포스트 프로세싱 영역 제한 등

요약 및 느낀점 📝

  • Depth Stencil Buffer를 추가하여 깊이 값에 따라 앞뒤가 처리되도록 하였다.

    느낀점 💡 뎁스-스텐실 버퍼는 이후 다양한 그래픽 기술, 최적화에 활용될 수 있는 내용이기 때문에 내용은 짧지만 잘 알아 두는 것이 중요하다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.