MOONSUN
[D3D 이론] 렌더링 파이프라인에서 각 스테이지의 역할 본문
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 백버퍼 ) 에 기록.
'D3D' 카테고리의 다른 글
| [D3D 이론] 기저벡터(Basis Vector)와 행렬(Matrix) (0) | 2025.09.10 |
|---|---|
| [D3D] DirectX 11에서 HLSL 셰이더 컴파일 2가지 방법 (0) | 2025.09.05 |
| [D3D] Comptr 사용해보자 (0) | 2025.09.05 |
| [D3D] Comptr(COM Smart Pointer) 란? (1) | 2025.09.05 |
| [Error] Invalid vs_2_0 output semantic 'SV_TARGET’ (0) | 2025.09.04 |