Direct3D 12 graphics Pipeline

이번 포스팅에는 마지막 단계인 Output Merger를 다룰 예정이다. 여러 요소들을 고려해서 최종 렌더링될 pixel의 섹상을 만들어주는 역할을 한다. 해당 픽셀이 실제 화면에 그려질지, 뒤에 가려지는지, 색을 섞여야하는지 등을 판단하게 된다.

 

 

 

 

Output-Merger(OM) Stage

◇  Pixel Shader의 output인 pixel은 Depth-Stencil Test, Color Blending의 과정을 거친다.

  • Depth-Stencil Test : Z-buffer를 활용하여 픽셀이 가려질 경우에 버린다.
  • Color Blending : 반투명한 물체나 파티클에서 기존 색과 Blending하는 과정이 필요하다

 

 

 

Pipeline State

◇   GPU가 '이 데이터를 어떻게 그릴지' 결정하는 하드웨어 설정들의 집합

  • Rasterizer State : Cull Mode(Black-face culling), Fill Mode(Wireframe/Solid), Viewport 설정
  • Blend State : Alpha Blending, Additive Blending(파티클) 등
  • Depth-Stencil State : 그릴지 말지 판단 - Depth Test, Stencil Test
  • Primitive Topology : 어떤 형태로 그릴 지 - Triangle, Line 등
  • Shader State : 어떤 셰이더를 쓸 지 - Vertex Shader, Pixel Shader

◇  Pipeline State Object (PSO) : Pipeline State를 하나로 묶어서 미리 생성한 객체

  • Direct3D 12에서 대부분의 그래픽 파이프라인 상태는 PSO를 사용하여 설정된다.
  • 초기화 시 일반적으로 여러 개의 PSO가 미리 생성되고, 이후 렌더링 시에는 상황에 맞는 PSO로 교체한다.
  • ex) PSO 1 : 기본 오브젝트(Depth Test On, Blending Off), PSO 2 : 투명 오브젝트(Depth Test ON, Blending ON)

 

 

 

 

 

Render Target

◇   GPU가 “그릴 대상”으로 사용하는 버퍼(텍스처)

  • 렌더링할 때 back buffer에 렌더링하여 바로 화면에 표시하는 대신, temporary intermediate buffer에 렌더링하여 추가적인 작업이나 후처리 효과를 적용할 수 있다. 

◇   Frame Buffer

  • 색(Color) 정보를 저장하는 메모리 영역 = RAM에 저장됨 

◇  Double Buffering

  • Front Buffer : 현재 화면에 보여지고 있는 버퍼
  • Back Buffer : 지금 그리고 있는 버퍼
  • Back Buffer에 미리 렌더링 → 작업 끝나면 → Front Buffer와 교체(Swap)
  • 이 과정을 통해서 화면 깜빡임 문제를 방지할 수 있다. back buffer 없이 바로 화면에 그린다면 중간 상태가 보여지면서 깜빡이는 문제가 발생한다.

 

 

Depth-Stencil Testing

 

◇  Depth-Stencil Buffer를 활용해서 픽셀을 그릴지 말지 결정한다.

  • depth data : 어떤 픽셀들이 camera에 가장 가까운지
  • stencil data : 어느 pixel을 update할 것인지

 

 

 

 

Depth Test

◇  Depth Buffer를 이용해 어떤 픽셀이 보일지 결정 = Z-buffering

  • 1) Depth 값 계산 후 Clamp  ( z = min(MaxDepth, max(MinDepth, z)) 활용 )  = Viewport 범위 [0~1] 또는 설정 범위로 제한하는 것
  • 2) Depth Buffer와 비교
    • pixel depth < stored depth : 픽셀이 업데이트 되어야 하는 군 → Color Buffer, Depth Buffer 업뎃
    • pixel depth > stored depth : 안보이는 픽셀 이므로 버림

 

◇  Z-buffering은 처리되는 순서와 상관없이 동일한 결과가 나온다.

 

 

 

 

 

Stencil Test

◇   Stencil Buffer 값이 1인 pixel만 Back Buffer로 채운다.

◇   Tansition effect 적용

 

◇  UI에 가려지는 부분 버리기 = fragment 수를 줄여서 성능을 최적화할 수 있다.

 

 

 

 

Color Blending

◇  새로 그려질 픽셀(c_src)과 기존 화면 색(c_dst)을 섞어서 최종 색(c)을 만드는 과정

  • 기본 렌더링은 Depth Test 통과 시에 덮어쓰게 되지만 반투명한 물체가 있는 경우 뒤의 오브젝트와 Blending이 필요하다. 
  • Output value가 렌더 타겟에 찍히기 전에 Pixel Shader의 Output에 Blending Operation이 동작한다.
  • 블렌딩을 위해서는 불투명한 물체와 투명한 물체를 구분하고, z값이 높은 순으로(back-to-front) 처리하게 된다.

 

 

 

 

 

 

이렇게 Rendering Piepline 포스팅을 마무리하겠습니다--

 

 

 

Reference KHU 강형엽 교수님 강의를 수강하며 정리한 내용입니다.

'그래픽스' 카테고리의 다른 글

[DirectX12] 4. Pixel Shader - Lighting  (0) 2026.03.13
[DirectX12] 3. Pixel Shader - Texturing  (0) 2026.03.13
[DirectX12] 2. Rasterizer  (1) 2026.03.13
[DirectX12] 1. Input Assembler, Vertex Shader  (0) 2026.03.12

+ Recent posts