그래픽스 파이프라인
그래픽스 파이프라인 (Graphics Pipeline)
1. 개요
그래픽스 파이프라인이란 3차원 공간에 정의된 가상 장면(3D Scene)을 2차원 평면인 모니터 화면에 픽셀 단위로 출력하기 위해 거치는 일련의 연속적인 처리 과정을 의미한다.
이 프로세스는 추상화된 기하학적 데이터(정점, 인덱스 등)가 입력되어 래스터화(Rasterization)와 셰이딩(Shading) 과정을 거쳐 최종적인 색상 값으로 변환되는 데이터 흐름(Data Flow)으로 구성된다. 렌더링 프로세스의 궁극적인 목적은 3D 공간의 수학적 모델을 인간이 시각적으로 인지할 수 있는 2D 이미지로 효율적이고 정확하게 투영하는 것이다.
참고: 파이프라인 과정에서 래스터화의 결과물로 생성되는 잠재적 픽셀 단위를 프래그먼트(Fragment)라 하며, 이것이 최종 테스트를 거쳐 화면의 픽셀(Pixel)로 확정된다.
2. 파이프라인 단계별 상세 공정
그래픽스 파이프라인은 크게 입력, 기하 처리, 래스터화, 픽셀/프래그먼트 처리의 단계로 나뉜다.
2.1. 전체 흐름 다이어그램
[ CPU 영역 ] [ GPU 영역 ]
Application ---> Input Assembler ---> Vertex Shader ---> Tessellation ---> Geometry Shader
|
v
Frame Buffer <--- Output Merger <--- Pixel/Fragment Shader <--- Rasterizer <--- Clipping & Viewport Transform
2.2. 단계별 세부 과정
- 애플리케이션 단계 (Application Stage): CPU에서 수행되며, 가시성 판단, 애니메이션 계산, 렌더링 명령 생성 및 GPU로의 데이터 전송을 담당한다.
- 기하 단계 (Geometry Stage):
- 정점 셰이더 (Vertex Shader): 개별 정점의 위치를 변환하고 조명 계산을 수행한다.
- 테셀레이션 (Tessellation): 단순한 폴리곤을 더 세밀한 폴리곤으로 쪼개어 디테일을 높인다.
- 기하 셰이더 (Geometry Shader): 정점들을 조합하여 새로운 도형을 생성하거나 삭제한다.
- 클리핑 및 뷰포트 변환 (Clipping & Viewport Transform): 시야 범위 밖의 요소를 잘라내고, 최종적으로 화면 해상도에 맞는 2D 좌표로 변환하여 래스터화 준비를 마친다.
- 래스터화 단계 (Rasterization Stage): 3D 공간의 삼각형(Primitive)을 화면상의 픽셀 뭉치(Fragment)로 변환하는 과정이다.
- 픽셀/프래그먼트 단계 (Pixel/Fragment Stage): 각 프래그먼트의 최종 색상을 결정한다. 텍스처 매핑, 라이팅 계산 등이 여기서 이루어진다.
- 출력 병합 (Output Merger): 깊이 테스트(Depth Test)와 스텐실 테스트를 통해 최종적으로 화면에 그려질 픽셀을 결정하고 프레임 버퍼에 기록한다.
2.3. 단계별 요약 표
| 단계 | 입력 데이터 | 주요 수행 작업 | 출력 데이터 |
|---|---|---|---|
| 애플리케이션 | 씬 데이터, 리소스 | 가시성 판단, 드로우 콜 생성 | 정점 버퍼, 인덱스 버퍼 |
| 기하 단계 | 정점(Vertex) | 좌표 변환, 도형 생성, 클리핑 | 변환된 정점, 기본 도형 |
| 래스터화 | 기본 도형(Primitive) | 픽셀 영역 판별, 보간(Interpolation) | 프래그먼트(Fragment) |
| 픽셀/프래그먼트 단계 | 프래그먼트 | 텍스처링, 픽셀 셰이딩 | 픽셀 색상(RGBA) |
| 출력 병합 | 픽셀 색상, 깊이 값 | 깊이/스텐실 테스트, 블렌딩 | 최종 픽셀 (Frame Buffer) |
3. 주요 렌더링 단계의 원리
3.1. 좌표계 변환 (Coordinate Transformation)
3D 모델이 화면에 그려지기 위해서는 다음과 같은 연속적인 행렬 변환을 거친다.
[변환 흐름도]
Model Space $\rightarrow$ World Space $\rightarrow$ View Space $\rightarrow$ Clip Space $\rightarrow$ NDC Space $\rightarrow$ Screen Space
- Model Space $\rightarrow$ World Space: 모델 고유의 좌표를 전체 게임/씬 세계의 절대 좌표로 변환한다.
- World Space $\rightarrow$ View Space: 카메라(관찰자)의 위치와 방향을 기준으로 좌표를 재설정한다.
- View Space $\rightarrow$ Projection Space: 원근법(Perspective) 또는 직교(Orthographic) 투영을 통해 Clip Space(동차 좌표계)로 변환한다. 이후 Perspective Divide(원근 분할) 과정을 통해 모든 좌표가 -1에서 1 사이의 값으로 정규화되는 NDC(Normalized Device Coordinates) 공간으로 넘어간다.
3.2. 클리핑 (Clipping)
투영 변환 후, 카메라의 시야 범위(View Frustum) 밖에 있는 정점과 폴리곤을 잘라내어 렌더링 대상에서 제외함으로써 연산 낭비를 방지한다.
3.3. 래스터화 및 보간법 (Rasterization & Interpolation)
래스터라이저는 수학적인 삼각형을 픽셀 격자로 변환한다. 이때 보간법(Interpolation)이 핵심적인 역할을 한다. - 원리: 정점 셰이더에서 계산된 값(색상, 법선 벡터, UV 좌표 등)은 정점에만 존재한다. 래스터라이저는 이 정점들 사이의 값을 Barycentric Coordinates(무게 중심 좌표)를 이용하여 선형적으로 보간하여, 삼각형 내부의 모든 픽셀(프래그먼트)에 전달한다. - 결과: 이를 통해 부드러운 그라데이션이나 정확한 텍스처 매핑이 가능해진다.
4. 셰이더(Shader)와 프로그래밍 가능 파이프라인
4.1. 파이프라인 패러다임 비교
| 구분 | 고정 함수 파이프라인 (Fixed-Function) | 프로그래밍 가능 파이프라인 (Programmable) |
|---|---|---|
| 제어 방식 | 하드웨어에 내장된 정해진 연산 사용 | 개발자가 셰이더 언어로 연산 정의 |
| 유연성 | 낮음 (제공되는 옵션 내에서만 설정 가능) | 매우 높음 (커스텀 라이팅, 특수효과 가능) |
| 성능 최적화 | 하드웨어 수준에서 최적화됨 | 코드 효율성에 따라 성능 차이 발생 |
| 주요 시대 | OpenGL 1.x, DirectX 7 이전 | 현대의 모든 그래픽 API (GLSL, HLSL 등) |
4.2. 주요 셰이더의 역할
- 정점 셰이더 (Vertex Shader): 정점의 위치 변환, 본 애니메이션(Skinning) 처리.
- 픽셀 셰이더 (Pixel Shader): 텍스처 샘플링, PBR(물리 기반 렌더링) 계산, 그림자 처리.
4.3. 셰이더 코드 예시 (GLSL)
다음은 정점의 위치를 변환하고 색상을 전달하는 완성된 GLSL 코드이다.
// --- Vertex Shader ---
#version 330 core
layout (location = 0) in vec3 aPos; // 입력: 정점 위치
layout (location = 1) in vec3 aColor; // 입력: 정점 색상
out vec3 ourColor; // 픽셀 셰이더로 전달될 출력 변수
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main() {
// 3.1절의 좌표계 변환 수행: Model -> World -> View -> Clip Space
gl_Position = projection * view * model * vec4(aPos, 1.0);
// 정점 색상을 출력 변수에 할당.
// 이 값은 래스터라이저에 의해 보간(Interpolation)되어 픽셀 셰이더로 전달됨.
ourColor = aColor;
}
// --- Fragment Shader ---
#version 330 core
in vec3 ourColor; // 래스터라이저에 의해 보간된 색상 값 입력
out vec4 FragColor;
void main() {
// 보간된 색상을 최종 픽셀 색상으로 출력 (RGBA)
FragColor = vec4(ourColor, 1.0);
}
5. 최신 GPU의 하드웨어 가속 구조
현대 GPU는 파이프라인의 병렬성을 극대화하기 위해 특수한 하드웨어 구조를 가진다.
- SIMT (Single Instruction, Multiple Threads): 하나의 명령어를 수천 개의 스레드가 동시에 서로 다른 데이터에 적용하는 구조로, 픽셀 셰이딩과 같은 반복 연산에 최적화되어 있다.
- Compute Units / Streaming Multiprocessors: 셰이더 코어를 묶은 연산 단위로, 스케줄러가 유동적으로 정점 처리와 픽셀 처리를 분배한다.
- Tiled-Based Rendering: 화면을 작은 타일 단위로 나누어 메모리 대역폭을 줄이고 캐시 효율을 높이는 구조(특히 모바일 GPU에서 사용).
- Hardware Ray Tracing Cores: 최근 GPU(RTX 등)는 BVH(Bounding Volume Hierarchy) 탐색을 가속하는 전용 하드웨어를 탑재하여 파이프라인 외적으로 실시간 광선 추적을 수행한다.
6. 최적화 및 현대적 기법
- 컬링 (Culling):
- Back-face Culling: 카메라를 등지고 있는 폴리곤을 그리지 않는다.
- Frustum Culling: 시야 범위 밖의 오브젝트를 통째로 제외한다.
- LOD (Level of Detail): 카메라와의 거리에 따라 모델의 폴리곤 수를 조절하여 연산량을 줄인다.
- 지연 렌더링 (Deferred Rendering): 모든 조명 계산을 즉시 수행하지 않고, 기하 정보(깊이, 법선, 색상)를 G-Buffer에 먼저 저장한 뒤 마지막에 조명을 한 번에 계산하여 조명 개수가 많을 때의 성능 저하를 막는다.
7. 관련 기술 및 API
| API | 개발사 | 특징 | 추상화 수준 |
|---|---|---|---|
| OpenGL | Khronos Group | 범용적, 배우기 쉬움, 오래된 표준 | 높음 (High) |
| DirectX | Microsoft | Windows/Xbox 표준, 강력한 도구 지원 | 중간 (Medium) |
| Vulkan | Khronos Group | 저수준 제어, CPU 오버헤드 최소화, 고성능 | 낮음 (Low) |
| Metal | Apple | Apple 하드웨어 최적화, 간결한 API | 중간 (Medium) |
분류: 기술 / 소프트웨어 / 렌더링 공정
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.