Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

MOONSUN

[D3D 이론] 렌더링 파이프라인에서 각 스테이지의 역할 본문

D3D

[D3D 이론] 렌더링 파이프라인에서 각 스테이지의 역할

MoonSun_v 2025. 9. 4. 10:58

 

 

Direct3D11 렌더링 파이프 라인 이란?


Direct3D11이 GPU에서 3D 데이터를 최종 2D 프레임 이미지를 만드는 과정.

 

  • 각 단계를 "스테이지" 라고 한다.

( DeviceContext::Draw 함수를 호출 할 때 GPU에서 각 단계를 실행 )

 

 

 

 

각 스테이지 요약 


  스테이지 약어 역할
1 Input Assembler IA 입력 조립기. 점 모으기.
2 Vertex Shader VS 좌표 변환 (Model → World → View → Clip)
3 Hull / Tessellator /Domain   삼각형을 쪼개 추가적인 삼각형으로 만드는 단계 (생략 가능)
4 Geometry Shader GS 도형 추가/변형 (생략 가능)
5 Rasterizer RS 화면 픽셀로 쪼개기 : 3D → 2D 화면 좌표 변환 (Clip → NDC → Screen)
6 Pixel Shader PS 픽셀 색칠하기
7 Output-Merger OM 최종 픽셀 합치기 (백버퍼에 기록)

 

 

 

 

1. Input - Assembler (IA)

입력 조립기.

파이프 라인이 사용할 버텍스의 구조, 그리는 방법, 버텍스 버퍼,인덱스 버퍼를 설정하는 단계

1. Primitive Topology 점,선,삼각형 을 어떻게 그릴 것인가
2. Vertex Buffer 버텍스 정보를 담을 버퍼 ( 3D 위치좌표 xyz , 텍스처좌표 uv 등)
3. Index Buffer 버텍스 버퍼를 인덱스로 접근할 인덱스가 담긴 버퍼
4. Input Layout VS (Vertex Shader)에 전달 할 Vertex구조 정의

 

  • IndexBuffer
    • 무언가를 그릴 때, 점에 대한 정보는 같은 걸 쓰고, 점에 대한 정보를 인데스 여러개 두어서 같은 점을 활용할 때 사용함

 

 

 

2. Vertex Shader (VS)

Model 좌표계 버텍스를 Matrix 곱해서 World -> Camera ->Projection(Clip) (x,y,z,w) 좌표계 까지 변환하는 단계

( 기본 정보는 Projection(Clip) 공간 변환 후 의 위치 SV_POSITION ) 

  • 각 Vertex 마다 실행한다.

 

 

 

3. Hull Shader / Tesselator / Domain Shader

삼각형을 쪼개 추가적인 삼각형으로 만드는단계 (생략 가능)

  • 목적 : 가까이 볼 때 디테일 증가 (곡면 매끄럽게).
 Hull Shader HS 삼각형을 얼마나 잘게 쪼갤지 (Tessellation 레벨 설정)
Tesselator TS 실제로 삼각형을 세분화
Domain Shader DS 세분화된 새 정점들의 위치 계산

 

 

 

4. Geometry Shader (GS)

삼각형 단위에 추가 작업(생성/수정/삭제) 을 하는 단계 (생략 가능)

예시 : 법선 시각화 - 각 삼각형의 정점에서 법선 벡터를 작은 선(화살표)으로 추가 생성해서 디버깅에 사용

 

 

 

5. Rasterizer (RS)

앞 단계에서 전달 받은 Primitive(삼각형,선,라인)을 뷰포트에 맞춰 픽셀 이전의 조각(Fragment)을 만드는 과정.

  • 좌표계를 화면 좌표로 변환 Clip -> NDC -> Screen 변환하며
  • 뒤집힌 면 제거(Back-face culling) / 화면 밖 영역 잘라내기(Clipping) 진행
    • (깊이 값 있는 fragment(조각)을 만드는 단계)

 

 

 

5-1. Rasterizer 세부 과정 정리 

 

1. 정규화 좌표 변환 (NDC 변환)

  • Vertex Shader에서 나온 좌표는 (x', y', z') 형태.<aside>z → 0.0 ~ 1.0 (카메라 앞~뒤 깊이)
x, y → -1.0 ~ +1.0
이걸 나누기 (x'/w', y'/w', z'/w') 해서 정규화 좌표계 (NDC) 로 변환.

 

 

2. 뷰포트(Viewport) 변환

NDC 좌표를 실제 모니터(혹은 윈도우 창) 픽셀 단위 좌표로 변환.ex) ( -1, -1 ) → ( 0,0 ) , ( +1,+1 ) → ( 1920,1080 )

 

 

3. 삼각형 → 픽셀 조각(Fragment) 만들기

이제 화면에 그릴 수 있는 삼각형, 선, 점이 픽셀 단위로 변환됨."이 삼각형이 화면의 어떤 픽셀을 덮을까?"를 계산해서 조각(Fragment) 생성.

 

 

4. 보간 (Interpolation)

  • 삼각형 꼭짓점(Vertex)마다 있던 색, UV좌표, 노멀 같은 정보를
  • → 삼각형 안의 픽셀 위치에 따라 "적당히 섞어서" 전달.
즉, 정점 색상이 빨강, 파랑, 초록이라면 → 픽셀은 그 중간색으로 자동 계산
    •  

 

5. 최적화(버리는 과정)

  • 화면에 안 보이는 뒷면(Back-face Culling), 화면 밖(Clipping)은 버림.
    • Pixel Shader를 불필요하게 많이 실행하지 않기 위해서

 

 

6. Pixel Shader (PS)

Rasterizer가 만든 조각 (Fragment) 마다 Pixel Shader를 실행하여 각 픽셀의 색상을 결정.

  • 삼각형의 보간된 정보(주로 텍스처, uv 좌표)와 스테이지에 설정된 다른 입력 정보(주로 텍스처) 로 최종 픽셀을 결정하는 단계
  • ex) 텍스처, 조명, 그림자 효과 반영 등..

 

VS - RS - PS 관계 요약

  • Vertex Shader : "좌표점들을 변환해서 도형(삼각형) 위치를 정해줌"
  • Rasterizer : "그 도형을 픽셀 칸(격자)에 맞춰 잘라서 채울 부분을 결정"
  • Pixel Shader : "정해진 칸마다 색깔을 채움"

 

 

 

7. Output-Merger (OM)

  • 픽셀을 깊이(Depth)판정이나 스텐실 판정에 의해 폐기
  • 최종적으로 살아남은 픽셀을 렌더 타겟( 보통 Back-Buffer 백버퍼 ) 에 기록.