3D 물리 엔진의 그래픽 연산 프로세스
3D 렌더링 엔진에서 Cube는 어떠한 그래픽 연산 절차를 거쳐 그려질까?
유니티 엔진은 기본적으로 그래픽 연산 방식은 DirectX를, Camera에는 OpenGL을 탑재하고 있다. 두 라이브러리를 공용으로 사용하는 이유는 각 라이브러리마다 특성을 바탕으로 멀티플랫폼에 효율적으로 대응하기 위함이다. 자세한 내용은 Shader를 공부하다 보면 확인할 수 있는데, 플랫폼 마다 그래픽 연산 방식이 다르기 때문에 행렬 데이터를 새로 작성해주어야 한다고 한다.
유니티 에디터를 실행하면 하아라키 창에는 기본적으로 Camera와 Light가 세팅된다. 해당 컴포넌트들은 물리 엔진에서 오브젝트를 렌더링하는데 가장 필수적인 요인이다.
Cube 오브젝트를 생성하면 다음과 같이 컴포넌트가 붙어있다. 빈 게임 오브젝트에 Transform 컴포넌트가 붙어있는 것을 감안하면, 렌더링 오브젝트에는 다음 3가지(Mesh Renderer, Mesh Filter, Collider) 컴포넌트가 기본적으로 들어가 있다. Mesh Renderer와 Mesh Filter가 유니티에서 오브젝트를 렌더링하는 핵심 컴포넌트이다.
오브젝트 메시 렌더링 프로세스
오브젝트를 렌더링하는 과정은 Mesh Filter에서 Mesh 데이터를 생성하고, Mesh Renderer로 전달하는 프로세스를 거친다.
Mesh Renderer는 Material과 Light를 계산하여 Shader를 만들어 씬 뷰에 그리는 역할을 하고, Mesh Filter는 Vertice + Triangle + UV 데이터를 합쳐 text 타입의 Mesh 데이터를 생성한다.
DirectX 오브젝트 렌더링 프로세스
유니티 렌더링 컴포넌트가 아닌, DirectX를 사용해서 Mesh를 렌더링해보려고 한다.
가로/세로 길이가 1인 정사각형을 그린다고 가정해 본다. 해당 사각형은 quad처럼 앞부분만 그려지고 뒷부분은 그려지지 않는다.
Vector3[] myVertice = new Vector3[4]; // 정점의 좌표는 배열 번호
myVertice[0] = new Vector3(-0.5f, 0.5f, 0);
myVertice[1] = new Vector3(0.5f, 0.5f, 0);
myVertice[2] = new Vector3(-0.5f, -0.5f, 0);
myVertice[3] = new Vector3(0.5f, -0.5f, 0);
mf.mesh.vertices = myVertice; // 메쉬 필터 안에 있는 mesh 데이터
먼저 사각형의 pivot을 (0,0,0) 좌표 기준으로 잡고, 다음과 같이 4개의 정점 좌표를 가진 Vector 배열을 선언해준다. 참고로, 두께가 없기 때문에 z 값은 따로 설정해주지 않는다.
// 정점을 잇는 순서를 배열로 만든다
int[] myTriangle = new int[6];
myTriangle = new int[] { 0, 1, 2, 2, 1, 3 };
mf.mesh.triangles = myTriangle;
그 다음은, Vertice 정점을 이어 Triangle 배열 데이터로 만들어주는 작업이다.
내적(Dot Product), 외적(Cross Product)
외적을 통해 각 정점의 normal(수직) 방향을 찾는다.
외적할 때 법선은 두개가 나온다.
픽셀의 컬러 값도 결국 Vector4의 데이터타입을 갖는다(R,G,B,A)
컬럭 벡터를 3차원 행렬 형태로 가지고 있는 것을 Image 파일이라고 한다.
동영상은 Image 파일의 연속, 4차원 이상의 행렬 데이터를 텐서(Tensor) 파일이라고 한다.
동영상 파일(avi, mov)은 Tensor 파일 형태로 저장되어 진다.
텐서 데이터들을 다루는 라이브러라기 파이썬에서 텐서플로우(TensorFlow)라고 한다.
텐서플로우는 사실 AI가 아닌, 그래픽 용이었다.
0 검정색, 0.5 회색, 1 흰색 -> Grayscale(흑백 이미지)
GrayScale = 흰색과 검은색 만으로 이미지를 나타내는 행렬 데이터
컬러 이미지는 R,G,B 행렬 데이터를 겹쳐놓은 것, 즉 3차원 데이터이기 때문에 텐서 데이터이다.
이러한 텐서 데이터를 연결해 놓은 것이 바로 동영상 파일이다.
UV 매핑은 가로 세로가 일정한 텍스쳐를 비율에 따라 모델링 데이터에 입혀주는 과정을 의미한다.
모델링 데이터는 직선,곡선, 굴곡 등 다양한 형태로 이루어져 있기 때문에 텍스쳐 데이터를 알맞게 연결해주어야 하기 때문이다.
텍스처 데이터는 2차원 배열로 (U좌표, V좌표)로 구성된다. 정점 좌표를 비율에 따라 줄이거나 늘려서 넣는 개념
'게임 프로그래밍 > 유니티 프로젝트' 카테고리의 다른 글
[Unity] 유니티 Layer & Tag 비교, Layer 충돌 체크와 비트 연산 활용법 (0) | 2022.08.05 |
---|---|
[Unity] Level Design 레벨디자인 파이프라인 (0) | 2022.07.28 |
[Unity] Joystick 제작 원리 (0) | 2022.07.20 |
[Unity] GameManager 클래스 선언과 .NET 연관성, enum 타입 (0) | 2022.07.19 |
[Unity] 2D 게임 플레이 영역 제한하기, Rendering Pipeline의 좌표 공간에 대한 이해(WorldToViewport / ViewportToWorld) (0) | 2022.07.19 |