그래픽스/렌더링 파이프라인

[그래픽스] 렌더링 파이프라인

CodeHunst 2025. 7. 19. 22:05

렌더링 파이프 라인이란?

3D 데이터를 2D인 화면에 보이는 이미지로 변환하는 일련의 과정


DirectX, OpenGL, Vulkan 등 다양한 라이브러리가 있는데, 라이브러리마다 파이프라인이 다를까?

구현 방식과 세부 제어 수준은 조금 다르지만, Core 개념은 동일하다.

결국 렌더링 파이프라인은 vertex를 정리하고, 위치를 결정한 뒤, 픽셀화 시켜서 각 픽셀에 색을 입히는 과정.

 


아래 내용은 DirectX11을 기준으로 설명!

 

 

 

 


1. Input Assembler (IA)

정점 버퍼(Vertex Buffer), 인덱스 버퍼(Index Buffer), 입력 레이아웃 (Input Layout), Primitive Topology를 설정 후 정점(Vertex) 데이터를 GPU에 전달


Vertex Buffer

정점(Vertex) 데이터를 담고 있는 GPU 메모리
보통 포지션, 노멀, 텍스처 좌표 등 포함

Index Buffer

정점의 재사용을 위해 인덱스를 따로 지정 (예: 삼각형 공유)
예: 삼각형 1은 0-1-2, 삼각형 2는 2-3-0

Input Layout

정점 버퍼의 데이터를 어떤 방식으로 Vertex Shader에 전달할지 명시
포맷, 오프셋, 데이터 종류 등을 포함

Primitive Topology

정점들을 어떤 도형으로 묶을지 결정 (삼각형, 선, 점 등)


Q. 왜 Vertex Buffer와 Index Buffer로 따로 저장하나요?

메모리 절약 (Vectex Buffer의 데이터 크기 > Index Buffer 데이터 크기),

재사용성 증가(이미 처리한 정점이 다시 나오면, 셰이더를 재실행하지 않고 캐시된 결과만 사용하면 됨)

-> 렌더링 성능 향상,

유지보수 용이


2. Vertex Shader (VS)

각 정점의 위치를 모델 공간 → 클립 공간으로 변환

정점에 필요한 추가 정보(색상, 텍스처 좌표 등) 계산


역할

좌표 변환 

모델 공간(Model Space)에서 월드 공간(World Space)으로,
월드 공간에서 뷰 공간(View Space, 카메라 기준 좌표)으로,
뷰 공간에서 클립 공간(Clip Space)으로 변환,
이 변환들은 모두 행렬 곱셈으로 처리

 

입력 데이터 처리

위치(position), 노멀(normal), 텍스처 좌표(uv), 색상(color) 등
필요한 데이터를 받아서 계산하거나 전달

 

추가 연산

예: 조명 계산 전 처리, 변형(스키닝), 애니메이션
셰이더 내에서 직접 수행 가능

 

출력

변환된 위치 (SV_Position)와 후속 셰이더에 넘길 정보 출력


Q. Clip Space란?
View Space에서 정점에 투영행렬을 적용한 후의 좌표계

정점이 보이는 영역 안에 있는지 판단,  "화면 밖"의 정점은 GPU가 잘라낸다! (Clipping)

 

Q. 투영행렬?

3차원 정점을 2차원 화면에 투영하기 위한 수학적 변환 행렬

원근법을 적용해준다!


3. Tessellator  (Hull Shader → Tessellation → Domain Shader)

고해상도 메시를 동적으로 생성하여 더욱 디테일한 표면 표현을 가능하게 해주는 과정

고해상도 곡면 표현 시에만 사용한다.


Hull Shader

Tessellation 수준(Level)을 결정. Tessellation Factor를 계산하여 얼마나 쪼갤지 결정

Tessellation

Tessellation Factor에 따라 입력 패치를 작은 삼각형/사각형/곡면으로 나눔

Domain Shader

Tessellator가 쪼갠 점들(도메인 좌표)을 바탕으로 실제 위치와 속성 계산


4. Geometry Shader

입력 Primitive(점, 선, 삼각형 등)를 받아서 새로운 정점들을 생성하거나,

기존 정점들을 변형해 출력 Primitive를 새롭게 만들어내는 역할

 

예: 폭발 효과, 실루엣 외곽선, 그림자 볼륨 등


동작 방식

입력 Primitive (점, 선, 삼각형)을 받음
-> 프리미티브 내의 각 정점 정보를 참조 가능
-> 새로운 정점 생성하거나, 정점 속성 변경 가능
-> 출력할 Primitive 형식 지정 (점, 선, 삼각형 중 선택)
-> 여러 개의 출력 Primitive 생성 가능


5. Rasterizer

정점(Vertex) 으로 구성된 삼각형을 화면에 그릴 수 있는 픽셀단위로 바꾸는 과정

뷰포트 설정, 클리핑, 백페이스 컬링 등 수행


Primitive Clipping (절두체 클리핑)

카메라가 볼 수 있는 3D 공간(화면) 밖에 있는 도형은 잘라냅니다.

 

Viewport Transform (뷰포트 변환)

Clip Space → Screen Space 변환.
(-1 ~ 1)의 NDC 좌표를 실제 해상도에 맞는 (x, y) 픽셀 좌표로 매핑합니다.

 

Back-face Culling (백페이스 컬링)

보이지 않는 삼각형의 뒷면 제거.
정점의 시계 방향(Winding Order)에 따라 앞/뒤 판단.
일반적으로 시계 방향(CW) 또는 반시계 방향(CCW) 으로 앞면을 지정.

 

Scissor Test 

특정 영역(Scissor Rectangle) 밖의 픽셀은 그리지 않음.

 

Rasterization

정점으로 이루어진 삼각형을 픽셀(Fragment) 로 나눕니다.

각 픽셀마다:

보간(Interpolation) 수행: 위치, 색상, 텍스처 좌표 등

결과는 Pixel Shader 입력으로 전달.

 



6. Pixel Shader (PS)

 

각 픽셀(Fragment)의 최종 색상 계산

텍스처, 조명, 그림자, 머티리얼 반영

일반적으로 가장 많은 연산이 수행됨


7. Output Merger (OM)

 


최종 결과를 렌더 타겟에 출력


깊이 테스트, 스텐실 테스트, 블렌딩 등 수행

 

 

 

[참고]

https://learn.microsoft.com/ko-kr/windows/win32/direct3d11/overviews-direct3d-11-graphics-pipeline

 

그래픽 파이프라인 - Win32 apps

이 섹션에서는 Direct3D 11 프로그래밍 가능 파이프라인에 대해 설명합니다.

learn.microsoft.com

https://medium.com/@thkim2/%EB%A0%8C%EB%8D%94%EB%A7%81-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%EC%9D%84-%ED%86%B5%ED%95%B4-%EB%93%9C%EB%A1%9C%EC%9A%B0%EC%BD%9C-%ED%95%98%EA%B8%B0-2-rendering-pipeline-ec0cf6f4c4bc

 

렌더링 파이프라인에게 드로우콜 하기 (2) : Rendering Pipeline

이전 시간에는 드로우콜에 대해 알아보았습니다. 다음으로 렌더링 파이프라인에 대해 알아볼게요.

medium.com