✍️ 개요
Unity에서 특정 Model을 이동시키는 로직을 구현해보셨나요? 언뜻 보기에는 모델 자체가 이동되는 것처럼 보입니다. 하지만 실제로는 Model을 구성하는 여러 정점(Vertices)들이 이동한 뒤 그래픽스 파이프라인 과정을 거쳐 화면에 출력되게 됩니다. 이 과정을 반복하여 Model이 이동되는 것처럼 보이는 것이죠. 오늘은 Model이 렌더링되는 과정이 어떻게 이루어지는지 살펴보도록 하겠습니다.
📌 3D Model이 렌더링 되는 과정
Unity에서는 어떻게 모델들을 화면에 출력시키는 걸까요?
만약 비행기가 날아다닌다면 3D Model을 구성하는 Mesh들이 실시간으로 이동하는 것처럼 보이겠죠?
지금부터 3D Model이 어떤 원리로 화면에 실시간으로 출력되는 지 알아보도록 하겠습니다.
모든 게임 오브젝트는 정점(Vertices) 데이터를 가집니다.
각 정점마다 위치, 노멀 벡터, 색상 등 속성을 가집니다.
정점들은 선(Edges)을, 선은 다각형(Polygons)을, 다각형은 3D 모델의 표면(Mesh)으로 변환되는 과정을 거치죠.
이러한 변환 과정을 통해 3D Model이 화면에 출력되게 됩니다.
이 변환 과정을 렌더링이라고 부르며, 이 작업은 Frame마다 수행됩니다.
즉, 3D Model의 위치가 변경될 때마다 단순히 Mesh가 이동하는 것이 아닌, Mesh를 구성하는 Vertices들의 위치를 변환하며 최종적으로 Mesh를 그리는 과정을 수행합니다.
CPU는 Mesh, Texture, Material, Shader, DP Call(GPU 명령어) 등을 묶어 GPU에 전송하고, 이것을 드로우 콜(Draw Call)이라고 부릅니다.
- CPU는 Draw Call을 통해 GPU로 렌더링에 필요한 정보를 전달
- GPU는 Draw Call을 기반으로 작업을 준비하고, DP Call을 실행하여 렌더링 수행
- GPU의 그래픽스 파이프라인이 실행되며 최종적으로 화면 출력
📌 MVP(Vertex) Transformation
지금부터 GPU의 그래픽스 파이프라인 처리 과정에 대해 살펴보도록 하겠습니다.
현재 GPU는 CPU로부터 Draw Call을 받은 상태라고 가정하겠습니다.
CPU로부터 Mesh와 Material, Texture, Shader 등 많은 정보를 전달받았지만, 현재 시점에서는 Mesh를 구성하는 정점(Vertices)을 여러 좌표계로 변환하는 작업이 먼저 수행합니다.
Q. 그냥 하나의 좌표계만 있으면 되는거 아닌가요?
A. 하나의 좌표계로 그래픽스를 처리하는 것은 관리와 계산이 복잡해질 수 있습니다. 정점들을 화면에 출력하도록 하는 과정에서 여러 작업이 존재하게 되는데, 각 작업마다 행렬 계산과 처리가 존재합니다. 그렇기 때문에 여러 좌표계로 관리하며, 이를 통해 효율적으로 행렬 계산을 수행하고 체계적으로 그래픽스를 처리할 수 있습니다.
로컬 좌표계: 오브젝트의 자체 좌표계
오브젝트의 중심을 기준으로 좌표계를 정의합니다.
특정 오브젝트의 자식 오브젝트를 살펴보면 로컬 좌표계로 표현되어 있음을 알 수 있습니다.
월드 좌표계: 씬 전체의 글로벌 좌표계
세상의 중심을 기준으로 좌표계를 정의합니다.
오브젝트가 씬 내에서 어디에 존재하는지 나타냅니다.
로컬 좌표계에 월드 변환 행렬을 적용하여 계산합니다.
뷰 좌표계: 카메라를 기준으로 변환된 좌표계
카메라를 중심으로 좌표계를 정의합니다.
카메라의 위치와 방향에 따라 정점들의 좌표가 계산됩니다.
월드 좌표계에 뷰 변환 행렬을 적용하여 계산합니다.
투영 좌표계: 카메라를 기준으로 변환된 좌표계
원근 투영(Perspective) 또는 직교 투영(Orthographic)을 통해 변환된 좌표계입니다.
결과적으로 클립(Clip) 좌표계로 변환된 상태이며, 화면에 출력될 준비를 마친 상태입니다.
즉, Model을 구성하는 정점들은 이러한 변환 과정을 거쳐 화면에 출력될 수 있는 상태가 됩니다.
만약 행렬 계산 및 구체적인 과정을 원하신다면 '컴퓨터 그래픽스'를 참고하시면 됩니다.
📝 정리
정리하자면 CPU는 Model을 화면에 출력하기 위해 GPU에게 Draw Call을 전송합니다.
이때 GPU는 정점들을 로컬 -> 월드 -> 뷰 -> 투영 -> 클립 좌표계로 변환하는 작업을 수행합니다.
이후 작업은 2편에서 추가로 정리해보도록 하겠습니다.
💡 참고 자료
[출처: Unity Korea 알쓸유잡 ]
'유니티(Unity) > 이론 정리' 카테고리의 다른 글
[Unity] 카메라와 컬링 (0) | 2024.12.13 |
---|---|
[Unity] URP란 무엇인가? (0) | 2024.11.20 |
[Unity] 직렬화(Serialization)란 무엇인가? (1) | 2024.11.19 |
[Unity] Mono & IL2CPP 컴파일 방식의 차이 (0) | 2024.11.18 |
[Unity] .NET이란? (4) | 2024.11.17 |