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

+ Recent posts