3D 데이터를 2D 화면으로 변환하는 전체 과정이다. 버텍스 처리 -> 래스터화 -> 픽셀 처리 순으로 처리한다.
3D 데이터가 화면이 되는 전체 과정이다.
- 3D 세계 데이터 (메시, 텍스처, 조명) -> 렌더링 파이프라인 (GPU) -> 2D 화면 픽셀 (프레임버퍼) -> 모니터 출력
파이프라인(Pipeline)이라는 이름의 이유
- 공장 생산라인처럼 각 단계가 순서대로 실행한다.
- 앞 단계 출력 = 뒷 단계 입력
- 각 단계가 병렬로 동시 실행이 가능하다. (단계 A가 버텍스 2를 처리하는 동안 단계 B는 버텍스 1을 처리한다)
렌더링 파이프라인 전체 단계
애플리케이션 단계
- 씬 구성, 컬링, 드로우콜 발행
- 어떤 오브젝트를 그릴지 결정한다
- 버텍스 데이터를 GPU에 전달한다.
↓
드로우콜(Draw Call)
↓
GPU 파이프라인 시작
↓
1. 입력 어셈블러 (Input Assembler)
- VBO에서 버텍스 데이터 읽는다.
- 인덱스로 삼각형 조립한다.
↓
2. 버텍스 셰이더 (Vertex Shader) <- 프로그래머블 버텍스마다 실행
- MVP 행렬로 3D -> 클립 공간 변환
- 법선, UV 변환
↓
3. 테셀레이션 (Tessellation) (선택적)
- 헐 셰이더 + 테셀레이터 + 도메인 셰이더
- 폴리곤을 세분화해 디테일 추가
↓
4. 지오메트리 셰이더 (Geometry Shader) (선택적)
- 삼각형 단위 처리
- 새 삼각형 생성 가능 ( 파티클, 그림자 볼륨 )
↓
5. 래스터화 (Rasterization) (고정 기능)
- 클립 공간 -> 화면 픽셀 변환
- 삼각형 내부 픽셀 생성
- 버텍스 속성 보간 (UV, 법선, 색상)
↓
6. Early-Z 테스트 ( 고정 기능 )
- 픽셀 셰이더 실행 전 깊이 검사
- 가려진 픽셀 기각 -> 오버드로우 방지
↓
7. 픽셀/프래그먼트 셰이더 <- 프로그래머블
- 픽셀마다 실행
- 텍스처 샘플링, 조명 계산
- 최종 색상 결정
↓
8. 출력 병합 (Output Merger)
- 깊이 테스트 (Z버퍼)
- 스텐실 테스트
- 알파 블렌딩 (반투명 처리)
- 프레임버퍼에 최종 색상 쓰기
↓
프레임버퍼 -> 화면 출력
각 단계 상세 - 프로그래머블 vs 고정
프로그래머블 단계 (개발자가 셰이더로 제어)
- 버텍스 셰이더 : 버텍스 변환, 스키닝
- 픽셀 셰이더 : 조명, 텍스처, 색상
- 테셀레이션 : 폴리곤 세분화 방식
- 지오메트리 셰이더 : 삼각형 조작
- 컴퓨트 셰이더 : 파이프라인 외 GPU 연산
고정 기능 단계 (하드웨어가 처리, 설정만 가능)
- 입력 어셈블러 : 버텍스 데이터 읽기 방식 설정
- 래스터화 : 삼각형 채우기 방식 설정
- Early-Z : 깊이 테스트 활성화 여부
- 출력 병합 : 블렌딩 방식 설정 (Add, Alpha 등)
좌표 변환의 흐름 - 버텍스 세이더의 핵심
모델 공간 (Model Space / Object Space)
- 오브젝트 자신의 로컬 좌표계
- 메시 원점 기준
↓
Model 행렬 (월드 변환) 위치, 회전, 스케일 적용
↓
월드 공간 (World Space)
- 씬 전체의 공통 좌표계
- 모든 오브젝트가 같은 기준
↓
View 행렬 (카메라 변환) 카메라를 원점으로 이동
↓
뷰 공간 (View Space / Camera Space)
- 카메라가 원점, 카메라가 바라보는 방향이 -Z
↓
Projection 행렬 (원근 변환) 원근감 적용, 시야각 처리
↓
클립 공간 (Clip Space)
- 화면에 보이는 범위 : -1 ~ +1
- 이 범위 밖은 클리핑 (잘라낸다)
↓
원근 나누기 (하드웨어)
↓
NDC (Normalized Device Coordinates)
- -1 ~ +1 정규화 좌표
↓
뷰포트 변환 (하드웨어)
↓
화면공간 (Screen Space)
- 실제 픽셀 좌표 (0 ~ 1920, 0 ~ 1080)
래스터화 단계 - 고정 기능의 핵심
래스터화가 하는 일
- 삼각형 3개 버텍스 -> 삼각형 내부 픽셀 생성
- 버텍스 A (UV = 0.0, 0.0), 버텍스 B (UV = 1.0, 0.0), 버텍스 C (UV = 0.5, 1.0)
- 삼각형 내부 픽셀 P의 UV = A.UV * 무게중심_A + B.UV * 무게중심_B + C.UV * 무게중심_C
-> 버텍스 사이의 모든 값이 자동으로 보간된다. UV, 법선, 색상, 월드 포지션 모두 적용된다.
면 방향 컬링 (Face Culling)
- 삼각형 버텍스 순서(와인딩 오더)로 앞/뒷면 판별
- 뒷면은 래스터화 자체를 건너뛴다.
-> 드로우콜 수는 그대로, 픽셀 셰이더 실행 감소
-> Two Sided 머티리얼은 이 컬링을 비활성화한다.
출력 병합 단계 - 최종 결정
출력 병합(Output Merger)이 하는 일
- 픽셀 셰이더가 출력한 색상을 프레임 버퍼에 쓸지 말지 결정한다.
결정 기준1. 깊이 테스트 (Depth Test)
- 현재 픽셀의 Z값 vs Z버퍼의 기존 Z값
-> 더 가까우면 덮어쓰고 더 멀면 버린다.
결정 기준2 : 스텐실 테스트 (Stencil Test)
- 스텐실 버퍼의 값으로 픽셀 마스킹
- 특정 영역에만 그리거나 그리지 않는다
- 외곽선 렌더링, 포탈 효과, 거울에 활용한다
결정 기준3 : 알파 블렌딩 (Alpha Blending)
- 반투명 처리
- src * srcAlpha + dst * (1-srcAlpha)
- Z버퍼 쓰기 비활성화가 필요하다 -> 오버드로우 발생
포워드 vs 디퍼드 렌더링 - 깊이 비교
포워드 렌더링 (Forward Rendering)
- 오브젝트마다 모든 조명을 계산한다.
for each object:
for each light:
color += calculateLighting(object, light)
오브젝트 100개, 광원 10개 -> 1000번 조명 계산
장점 : 단순하며 반투명 처리가 쉽다. MSAA 쉽다.
단점 : 광원 많으면 급격히 느려진다.
용도 : 모바일, 광원 적은 게임에 사용된다.
디퍼드 렌더링 (Deferred Rendering)
- 먼저 표면 정보를 G-Buffer에 저장한 다음 나중에 한 번에 조명 계산한다
- Pass 1 : G-Buffer 채우기 ( 조명 계산 없다 )
- Pass 2 : for each light:
화면 픽셀마다 G-Buffer 읽어서 조명 계산
- 오브젝트 100개, 광원 10개
-> G-Buffer : 100번
-> 조명 : 화면 픽셀 수 x 10번
장점 : 광원 수에 강하다
단점 : 메모리를 많이 쓴다 (G-Buffer), 반투명 처리가 어려우며 MSAA 어렵다
용도 : PC/콘솔, 오픈월드, 광원 많은 게임에 사용된다.
지금까지 배운 파이프라인 위치
드로우콜 → CPU-GPU 경계
버텍스 셰이더 → 2번 단계
MVP 행렬 → 버텍스 셰이더 내부
테셀레이션 → 3번 단계
래스터화 → 5번 단계
UV 매핑 → 래스터화 보간 + 픽셀 셰이더
Early-Z → 6번 단계
픽셀 셰이더 → 7번 단계
PBR 조명 → 픽셀 셰이더 내부
텍스처 샘플링 → 픽셀 셰이더 내부
노멀 맵 → 픽셀 셰이더 내부
HLSL / GLSL → 버텍스/픽셀 셰이더 언어
Z버퍼 → 8번 출력 병합
알파 블렌딩 → 8번 출력 병합
오버드로우 → 6-8번에서 발생
LOD → 버텍스 수 자체를 조절
드로우콜 최적화 → CPU 측 최적화
컴퓨트 셰이더 → 파이프라인 외부 GPU 연산
연결되는 단어들
- 프레임버퍼 (Framebuffer) : 렌더링 결과를 저장하는 최종 버퍼. 색상 버퍼 + 깊이 버퍼 + 스텐실 버퍼로 구성하며 화면에 표시된다.
- 스왑체인 (Swap Chain) : 화면에 표시하는 버퍼와 다음 프레임을 그리는 버퍼를 그대로 사용한다. 더블/트리플 버퍼링의 기반이다.
- 렌더 타킷 (Render Target) : 화면 대신 텍스처에 렌더링하는 것. G-Buffer, 그림자 맵, 반사 텍스처에 사용한다.
- VSync : 렌더링 완료를 모니터 주사율과 동기화하며 테어링(화면 찢김) 방지한다. 프레임레이트를 모니터 주사율로 제한한다.
'Word' 카테고리의 다른 글
| 픽셀/프래그먼트 셰이더 (Pixel / Fragment Shader) (0) | 2026.08.05 |
|---|---|
| 버텍스 셰이더 (Vertex Shader) (0) | 2026.07.31 |
| 텍스처 샘플링 (Texture Sampling) (0) | 2026.07.28 |
| 오버드로우 (Overdraw) (0) | 2026.07.27 |
| UV 매핑 (UV Mapping) (0) | 2026.07.22 |
