유니티 3D 렌더링 파이프라인

댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.

댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
렌더링 파이프라인은 3D 오브젝트의 정점(Vertex) 데이터를 모니터에 보이는 최종 픽셀(Pixel)로 바꾸는 전체 과정이다.
핵심은 공간 변환과 GPU 연산이 따로 떨어진 개념이 아니라, 하나의 연속된 흐름이라는 점이다.
정점(Vertex)은 폴리곤을 이루는 하나의 점
전체 흐름: Local → World → CPU 선별 → View → Projection → Screen → Rasterization → Fragment Shader → Output Merging
이 과정은 다음 네 구역으로 나누어 이해할 수 있다.
| 구역 | 단계 | 중심 내용 |
|---|---|---|
| Zone A: Foundation | 1~2 | 로컬 공간의 모델을 월드 공간에 배치 |
| Zone B: Camera & CPU | 3~5 | 카메라에 보일 대상을 선별하고 뷰 공간으로 변환 |
| Zone C: Geometry | 6~9 | 정점과 삼각형을 화면의 2D 좌표로 변환 |
| Zone D: Pixel & Output | 10~14 | 픽셀 후보의 색을 계산하고 최종 화면을 합성 |
| 단계 | 이름 | 핵심 역할 | 주 처리 위치 |
|---|---|---|---|
| 1 | Local Space | 모델 자체의 원점을 기준으로 정점 데이터를 표현 | 모델 데이터 |
| 2 | World Space | 모든 오브젝트를 씬의 공통 좌표계에 배치 | 좌표 변환 |
| 3 | View Frustum Culling | 카메라 시야 밖의 오브젝트를 통째로 제외 | CPU |
| 4 | Draw Call | 남은 오브젝트의 렌더링 명령과 데이터를 GPU에 전달 | CPU → GPU |
| 5 | View Space | 카메라가 원점에 고정된 것처럼 월드 전체를 변환 | GPU 정점 처리 |
| 6 | Back-face Culling | 카메라의 반대쪽을 향한 삼각형의 뒷면을 제외 | GPU |
| 7 | Clipping | 시야 경계에 걸친 폴리곤을 경계에 맞게 잘라냄 | GPU |
| 8 | Projection | 원근감을 적용해 3D 좌표를 정규화된 2D 평면으로 투영 | GPU |
| 9 | Viewport Transform | 정규화된 좌표를 실제 모니터의 픽셀 좌표로 매핑 | GPU |
| 10 | Rasterization(레스터화) | 삼각형이 덮는 픽셀 위치를 찾아 Fragment를 생성 | GPU |
| 11 | Material 연산 | Base Color, Metallic 등 재질 값을 계산 | Fragment Shader |
| 12 | Lighting 연산 | 조명과 표면 정보를 이용해 색을 계산 | Fragment Shader |
| 13 | Depth Test | 같은 위치의 후보 중 카메라에 더 가까운 것을 선택 | GPU 출력 단계 |
| 14 | Alpha Blending | 반투명 색을 배경과 혼합하여 최종 화면을 합성 | GPU 출력 단계 |
※ 위 단계 번호는 이 PPT에서 설명한 학습용 구분을 따른 것이다.
Local Space는 모델마다 가지고 있는 고유 좌표계이다.
World Space는 씬 전체가 함께 사용하는 공통 좌표계이다.
| 구분 | Local Space | World Space |
|---|---|---|
| 기준점 | 각 모델의 자체 원점 | 씬 전체의 공통 원점 |
| 의미 | 모델 내부에서의 위치 | 게임 세계 안에서의 실제 배치 |
| 예시 | 캐릭터 발밑을 원점으로 한 정점 | 캐릭터가 맵의 특정 위치에 놓인 상태 |
카메라의 시야 영역을 View Frustum이라고 한다. CPU는 이 영역 밖에 있는 오브젝트를 렌더링 대상에서 미리 제외한다.
View Frustum Culling은 카메라 시야 밖에 있는 오브젝트를 제외하고, 시야 안에 있는 오브젝트만 렌더링 대상으로 남기는 과정이다. 렌더링 대상으로 남은 오브젝트에는 GPU로 Draw Call이 전달되며, 카메라가 움직일 때마다 매 프레임 실시간으로 다시 계산되므로 시야가 빠르게 변해도 화면을 갱신할 수 있다.
Draw Call은 CPU가 GPU에 “이 오브젝트를 이 재질로 그려라”라고 전달하는 렌더링 명령이다.
Draw Call이란? CPU가 GPU에 “이 오브젝트를 이 재질과 설정으로 화면에 그려라”라고 전달하는 렌더링 명령이다. Draw Call이 너무 많으면 CPU와 GPU 사이의 명령 전달 부담이 커지므로, Batching을 이용해 여러 오브젝트를 묶어 처리하기도 한다.
Batching이란? 함께 처리할 수 있는 여러 오브젝트의 렌더링 작업을 하나로 묶어 GPU에 전달하는 방법이다. Draw Call 횟수와 CPU·GPU 사이의 통신 부담을 줄여 렌더링 성능을 높인다.
함께 처리할 수 있는지는 주로 같은 Material·Shader·렌더링 설정을 사용하는지에 따라 결정된다. Batching 방식에 따라 움직이지 않는 오브젝트를 묶거나, 같은 Mesh와 Material을 사용하는 오브젝트들을 한꺼번에 처리한다.
Batching의 대표적인 방법
직관적으로는 카메라가 월드 안을 이동한다고 생각하기 쉽다. 하지만 렌더링 계산에서는 카메라를 원점에 고정하고, 세상 전체에 카메라 변환의 역변환을 적용한다고 이해하면 쉽다.
핵심: 카메라를 움직여 계산하는 것이 아니라, 카메라를 원점에 둔 좌표계로 모든 물체를 변환한다.
만일 카메라가 여러 개라면?
각 카메라마다 서로 다른 View Space를 만들어 같은 World Space를 각각의 시점으로 변환한다. 예를 들어 게임 카메라와 미니맵 카메라는 동일한 오브젝트를 서로 다른 View Matrix로 변환하여 별도로 렌더링한다. 따라서 카메라가 많아지면 컬링과 렌더링도 카메라별로 수행되어 성능 비용이 증가할 수 있다.
| 비교 항목 | View Frustum Culling | Back-face Culling |
|---|---|---|
| 단계 | 3단계 | 6단계 |
| 제외 대상 | 오브젝트 전체 | 삼각형 표면의 뒷면 |
| 처리 위치 | CPU, 파이프라인 앞부분 | GPU, 정점·지오메트리 처리 구간 |
| 판단 기준 | 카메라 시야 안에 있는가? | 표면이 카메라를 향하고 있는가? |
| 목적 | 시야 밖 오브젝트의 계산을 처음부터 제거 | 보이는 물체 안에서도 뒤를 향한 면의 계산을 제거 |
두 컬링은 서로 대립하는 개념이 아니라, 서로 다른 시점과 단위에서 불필요한 연산을 줄이는 최적화 과정이다.
Back-face Culling에 대한 알기 쉬운 설명은 해당 페이지에서 볼 수 있다.
-> Unity 오브젝트가 안에서 보이고 밖에선 안 보일 때 해결하기 https://sungmin08.tistory.com/17
카메라 시야 경계에 걸쳐 있는 폴리곤을 경계에 맞게 잘라낸다.
View Space의 3D 좌표를 원근감이 적용된 2D 평면으로 변환한다.
정규화된 2D 좌표를 실제 화면 해상도의 픽셀 좌표로 바꾼다.
Rasterization은 화면에 매핑된 삼각형이 실제로 어떤 픽셀 위치를 덮는지 판정하는 과정이다.
| 구분 | Rasterization | Fragment Shader |
|---|---|---|
| 질문 | “이 픽셀 위치가 삼각형에 포함되는가?” | “이 Fragment의 색은 무엇인가?” |
| 입력 | 화면에 투영된 삼각형 | Rasterization으로 생성된 Fragment |
| 결과 | 픽셀 후보 목록 | 재질과 조명이 반영된 색 후보 |
| 색 계산 | 하지 않음 | 수행함 |
주의: Rasterization과 픽셀 색 계산은 서로 다른 과정이다.
Rasterization으로 생성된 각 Fragment는 Fragment Shader에서 서로 독립적으로 처리된다.
예를 들어 1920×1080 화면은 약 207만 개의 픽셀로 이루어진다. GPU는 많은 코어를 이용해 이 픽셀 후보들을 병렬로 처리한다.
| 구분 | Fragment | Pixel |
|---|---|---|
| 의미 | Rasterization이 만든 픽셀 후보 | 최종 화면에 기록된 결과 |
| 색 상태 | Shader에서 계산 중인 후보 색 | Depth Test와 Blending까지 통과한 최종 색 |
| 생존 여부 | 가려지거나 버려질 수 있음 | Frame Buffer에 남아 화면에 표시됨 |
Fragment는 아직 최종 결과가 아니다. Fragment Shader에서 색을 계산한 뒤에도 Depth Test와 Alpha Blending 같은 출력 과정을 통과해야 최종 Pixel이 된다.
Fragment Shader의 강점은 같은 연산을 수많은 Fragment에 동시에 적용할 수 있다는 점이다.
즉, GPU는 복잡한 하나의 작업을 순서대로 처리하기보다, 같은 종류의 작은 작업을 대량으로 동시에 처리하는 데 강하다.
여러 물체가 같은 화면 위치를 차지할 때, 깊이값(Z값)을 비교해 카메라에 더 가까운 Fragment를 남긴다.
반투명 물체의 색을 이미 그려진 배경 색과 혼합한다.
Depth Test와 Alpha Blending을 거친 최종 색이 Frame Buffer에 기록되고, 이것이 모니터에 출력되는 한 장의 프레임이 된다.
| 이론적 과정 | Shader Graph에서 연결되는 부분 | 대표 데이터 |
|---|---|---|
| 5~9단계의 정점·좌표 처리 | Vertex Block | Position, Normal, Tangent |
| 10단계의 픽셀 후보 생성 | Fragment라는 이름의 배경 | Rasterization이 만든 픽셀 후보 |
| 11~12단계의 재질·조명 연산 | Fragment Block | Base Color, Emission 등 |
| 13~14단계의 최종 합성 | 렌더 상태와 출력 처리 | Depth, Alpha, Blend 설정 |
Shader Graph의 마지막 출력 부분이 Fragment Block이라고 불리는 이유는 Rasterization에서 생성된 Fragment를 받아 색과 재질을 계산하는 단계이기 때문이다.
렌더링 성능은 “얼마나 많은 계산을 시작하기 전에 제거했는가”와 “남은 계산을 GPU가 얼마나 병렬로 처리할 수 있는가”에 크게 좌우된다.
한 문장 정리: CPU가 그릴 대상을 줄여 GPU에 넘기고, GPU는 3D 정점을 2D Fragment로 바꾼 뒤 색·깊이·투명도를 계산하여 최종 1프레임을 만든다.
참고 자료 PPT (강사님 제공) : https://docs.google.com/presentation/d/1v22uD7Me_CWYFCybI1rwtvTWrmUSWkN5/edit?slide=id.p1#slide=id.p1

우리들의 게임 발매 이야기

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다
