이 글은 Inflearn의 Rookies님의 강의를 보고 제 나름대로 필기한 내용입니다.
https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-2/dashboard
이번 글에선 장치 초기화에 대해 알아보자. 이전 글인 "프로젝트 세팅"과 이어지는 내용이다.
https://ddukddaksudal.tistory.com/4
이전 글에서는 솔루션과 각 프로젝트가 가지는 의미에 대해 알아보았다.
이제부터는 장치 초기화를 구현하고 각 파일, 클래스, 함수 등이 어떤 의미를 가지는지 알아보도록 하자.
장치 초기화?
우선 장치 초기화라는 말을 사용했는데, 이 말은 Engine 프로젝트에서 GPU를 사용해 무언가를 렌더링할 준비를 해주었다는 뜻으로 받아들이면 되겠다.
그걸 어떻게함?
그렇다면 장치 초기화는 어떻게 하는 것일까? 어떻게 GPU를 사용해 렌더링을 할까? 무언가를 그리기 위해서는 GPU를 사용하는 방법을 알아야한다.
일단 Client에서 네모를 그리는 과정을 상상해보자.
대충 위 그림과 비슷할 것이다. 일단 Client 프로젝트에서 Engine 라이브러리를 사용해 특정 위치에 특정 크기, 특정 각도의 정사각형을 그려달라고 요청할 것이다. 그럼 Engine 라이브러리는 이 요청을 받아들이고 이 요청을 GPU가 알아먹을 수 있도록 DirectX 라이브러리를 사용해 GPU에게 다시 요청할 것이다.
그렇다면 Enigine에서 해야할 일이 정해졌다. 위 그림에서 빨간 네모 안의 영역이다. 그런데 위의 과정처럼 간단하지는 않다. 여러 최적화 라던가 연속된 프레임을 문제없이 그리기 위한 장치라던가 렌더링의 종류를 알려준다던가 하는 작업들이 필요하다.
그래서 아래와 같은 개념들이 추가된다.
- COM(Comtponent Object Model) : 다양한 언어로 만들어진 소프트웨어 모듈들의 기능을 공유하고 통합하기 위한 서비스 또는 표준을 말한다. 다른 언어로 만들어진 프로그램 일지라도 COM 인터페이스르 통해 서로의 기능을 사용할 수 있다는 뜻이다. 이것이 DirectX가 프로그래밍 언어와 독립성과 하위 호환성을 가질 수 있는 이유다.
- CommandQueue : GPU에게 보내는 명령을 저장해 두는 큐 이다. GPU에게 작업을 요청할 때, 그냥 작업이 생길 때마다 요청한다면, 작업이 생길 때마다 GPU와 통신해야 한다. 그러나 밀려오는 작업 요청들을 큐에 잘 모아놨다가 적절히 모였을 때, 혹은 적절한 시간에 한 번에 요청해주면 한 번의 요청으로 여러 작업들을 처리할 수 있다.
- SwapChain : 두 개의 캔버스(?)를 번갈아가며 화면에 출력하고 새 그림을 그리는 구조를 말한다. 그 과정을 간략히 설명하자면 다음과 같다. 우선 한 화면에 출력할 데이터를 담을 수 있는 종이를 두 개 준비한다. 각각을 1번 종이, 2번 종이라고 부른다. 1번 종이에 첫 프레임에 화면에 띄울 그림을 그려놓는다. 1번 종이가 첫 프레임에 화면에 그려질 동안 2번 종이는 GPU에게 맡겨 두 번째 프레임에 띄워질 그림을 그려놓게 한다. 그리고 다음 프레임에는 2번 종이에 그려진 그림을 화면에 띄운다. 그리고 1번 종이를 다시 GPU에 맡겨 세 번째 프레임에 띄울 그림을 그리게 한다. 이것을 반복하는 것을 SwapChain 이라고 한다. 참고로 종이를 두 개 뿐 아니라 더 많이도 준비할 수 있지만, 보통 두 개면 충분하다.
- DescriptorHeap : 문자 그대로는 descriptor의 모음(Heap)이다. 여기서 descriptor란 GPU가 렌더링할 오브젝트에 대한 설명을 담은 블록이다. 즉, 리소스를 설명하는 내용과 그 리소스를 가리키는 내용으로 채워진 블록이다. 이는 View라고도 불린다.(DX 11이전에는 그냥 View였음.) DescriptorHeap을 만들 때 필요한 리소스에 대한 설명의 내용으로는 간략히 View의 타입, descriptor 갯수 등이 있다.
이제 위 개념들을 Engine 프로젝트에 적용할 일만 남았다. 근데 힘드니까 다음 글에 이어서 쓰겠다.
'그래픽스' 카테고리의 다른 글
Index Buffer (0) | 2021.12.08 |
---|---|
Constant Buffer (0) | 2021.11.10 |
프로젝트 세팅 (0) | 2021.10.07 |
GPU외주와 렌더링 파이프라인 (0) | 2021.10.06 |
그래픽스 개론 (0) | 2021.10.05 |