안녕하세요. 알콜코더 민군입니다. ^^

이제부터 본격적으로 연재를 시작하게 되었습니다. 많은 응원 부탁드립니다.

 

전에 예고했던 DX 11 튜터리얼을 하나씩 예제로 공부하면서 기초 단계부터 하나하나씩 밟고 올라가겠습니다. 이미 튜터리얼쯤이야 건너뛰신 분에게는 별로 도움이 안될지도…(쿨럭;;)

 

자 그럼 대망의 첫번째 튜터리얼을 공부해 보죠

 

 

 

이번 예제의 목표

 

l  DirectX 11을 이용하여 간단한 기본 어플리케이션을 만들어 본다

l  DirectX 11을 사용하기 위한 기본 디바이스 및 오브젝트들을 셋업한다

 

위가 이번 튜터리얼 01의 목표입니다. 우선은 3D 렌더링 화면을 가진 윈도우를 뛰우는것부터 시작해보죠. 3D 화면에 맵을 뛰우고 캐릭터가 뛰어다니는 게임을 만들어 보고 싶으시겠지만천리길도 한걸음 부터입니다. 우선 차근 차근 하나씩 시작해 보죠. ^^

 

 

참고 소스

 

l  DirectX 11 Sample – Tutorial 01 : Direct3D Basics

 

Direct X SDK에 포함되어 있는 샘플입니다. 이 샘플을 기반으로 설명하겠습니다.

직접 SDK에서 설치해서 공부하셔도 되고, 제가 첨부한 파일을 받아서 보셔도 됩니다.

 

 

사전에 준비해야 할 것

 

우선 기본적으로 튜터리얼 역시 윈도우 프로그래밍이기 때문에, 기본적인 윈도우는 뛰우고, DirectX를 설정해야 겠죠? ^^

윈도우를 뛰우는건 기본적인 내용이고 이 연재의 진행을 위해서도 과감하게 생략하겠습니다. (__)

하지만 공부하는 데 도움이 되시라고, 간단히 기본 윈도우를 뛰우는 프로그램을 첨부파일로 첨부합니다. (DX10의 튜터리얼 0번 샘플)

 

직접 코딩을 하면서 공부를 해보기 위해서는 샘플 파일을 받아서 기본적인 윈도우 프로그래밍 기반을 세팅한 후에 아래 내용을 따라서 DX11을 직접 작성해 보면 큰 도움이 될 겁니다.

 

첨부파일 – DirectX 10 Tutorial 00 : Win32 Basics

DirectX 를 아직 세팅하지 않고, 빈윈도우만 뛰우는 기본적인 프로그램입니다.

 

 

Direct3D 디바이스 오브젝트를 셋업하자

 

3D 디바이스 셋업은 3D 프로그래밍의 시작이자, 가장 필수적인 과정입니다.

3D 디바이스, 즉 그래픽카드를 셋업해야 그래픽카드를 통해서 3D 맵을 그리던가, 캐릭터를 렌더링하거나 할 수 있죠. 이 부분이 여타 일반 프로그래밍과 3D 프로그래밍이 시작부터 다른 점입니다. 일반 윈도우 프로그래밍은 그래픽 카드에 접근할 일이 없기 때문에 이런 과정이 당연히 없습니다. ^^

(나름 3D 프로그래머만의 특권일지아니면 지옥의 시작일지…)

 

DX11에서는 우선 아래 세가지 오브젝트를 만들어야 합니다

 

l  Device

l  Immediate Context

l  Swap Chain

 

Device

3D 그래픽 카드와 연결되는 기본 디바이스 객체

 

DX9의 디바이스와 같은 계열이지만, DX 11에서부터는 멀티스레드를 최적화하기 위하여 직접 디바이스를 사용하지 않고, Context를 이용하여 디바이스에 명령을 내립니다. 따라서 별로 사용할 일이 많지는 않을겁니다.

Immediate Context

DX11에 새로 추가된 오브젝트

 

DX11에서는 디바이스 객체에 직접 접근하지 않고, 이 객체를 이용해서 디바이스에 명령을 내린다고 생각하시면 됩니다.

 

DX11에서는 멀티코어/멀티스레드를 최적화 하기 위해서 Device의 하위에 Context를 분리하여 사용합니다. 현재는 이 Context로 디바이스에 명령을 내린다고만 알고 넘어가면 됩니다.

Swap Chain

화면에 렌더링할 백버퍼를 관리하고, 실제로 화면에 렌더링 하는 역할을 담당하는 오브젝트


이 오브젝트를 이용하여 백버퍼의 렌더 타겟을 얻어내 3D  오브젝트를 렌더 타겟에 렌더링하고, 프론트 버퍼와 백버퍼를 스왑(플립(Flip)이라고도 합니다)하여 실제 모니터에 게임 화면을 렌더링하는 역할을 합니다.

 

 

 

기본적인 셋업 및 오브젝트 생성 순서

 

기본적인 DX11의 셋업 순서는 아래와 같습니다.

 

1.   ID3D11Device SwapChain을 생성한다

2.   SwapChain에서 백버퍼를 가져온다(2D Texture)

3.   백버페 실제 렌더링할 렌더 타겟 뷰를 생성하여 바인딩 시킨다

4.   뷰포트를 생성한다

5.   매 프레임마다 위에서 생성한 렌더 타겟 뷰에 게임 화면을 렌더링한다.

6.   SwapChain을 이용하여 디바이스에 화면을 그린다

 

위 순서에서 가장 큰 목적은 바로 렌더 타겟 뷰(Render Target View)’를 생성하는 것입니다. 바로 이 렌더 타겟 뷰가 실제로 우리가 3D 게임 화면을 렌더링할 타겟이 됩니다. (그러니까 렌더타겟이라고 부르는 거겠죠.. ==)

 

이 랜더타겟뷰는 리소스뷰의 일종으로 디바이스의 백버퍼에 바운딩되면서 생성됩니다. 그래서 렌더타겟뷰에 게임 화면을 렌더링한다는 것은 백버퍼에 렌더링하는것과 같습니다. 그리고 백버퍼에 모든 화면을 렌더링하고 난 다음에는 SwapChain을 이용해서 백버퍼를 화면에 그리면 되는겁니다. 정확히는 백퍼버를 프론트버퍼와 바꾸는 스와핑 (또는 플립(Flip))이 일어나는 것이죠.

 

간단히 이야기면, SwapChain을 생성하고, SwapChain안에서 백버퍼를 꺼내오고, 꺼내온 백버퍼를 가지고 렌더타겟뷰라는 오브젝트에 바운딩합니다.

 

그리고 실제 내부에서는 SwapChain이 백버퍼라는 리소스를 가지고 있고, 개발자는 그 백버퍼를 렌더 타겟 뷰에 바인딩하여 사용하는 것입니다.

 

 

 

 

다음 내용으로 이어집니다. ^^;; 

 

 

언젠가 우즈벡에 미소녀 게임 회사를 차리고 싶은 개발자

3D게임 클라이언트 프로그래머, 살짝 오타쿠

드래곤볼 온라인 개발, 현재는 네오위즈 서식중

신입게임 개발자의 서울상경기’초중급 게임개발자 스터디’ 운영중