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

DX11 튜터리얼 2번째 연재를 시작하겠습니다.

 

저번시간에는 3D 디바이스를 초기화하는 전체 과정에 대해서 살펴보았습니다. 3D 디바이스를 초기화 한다는 말은 곧 3D 화면을 생성하고 오브젝트를 렌더링하기 위한 준비단계를 의미합니다. 이 과정을 거쳐서야 비로서 애플리케이션의 윈도우에 3D 렌더링을 위한 화면이 준비되고, 거기에 오브젝트들을 렌더링하고 움직이면서 게임이나 3D 그래픽스 프로그래밍이 시작되는 것입니다.

 

이번 시간에는 지난 시간에 알아본 내용들을 실제로 코드로 어떻게 구현하는지에 대해서 이야기 해보겠습니다. 전체 예제 코드는 DirectX SDK에 포함되어있는 Tutorial을 보시면 됩니다. ^^

 

우선은 튜터리얼의 코드를 수정하지 않고 있는 그대로 설명을 하겠습니다. 튜터리얼은 간단히 내용만 구현하기 위해서 코드가 지저분한 부분도 있고, 필요없는 부분도 있습니다 수정을 해서 좀더 깔끔하게 만들 수도 있습니다만 우선은 기본 이해를 위해서 튜터리얼 1번 예제 코드를 수정없이 그대로 분석하면서 연재를 진행하겠습니다. (제가 수정해서 헷갈릴수도 있으니까요.. 예제 코드와 다르잖아!! 이런걸 방지하기 위해 ㅡ.ㅡ;)

 

그리고 이해를 돕기위해 튜터리얼 코드에 한글 주석을 달아서 첨부파일로 첨부하였습니다. 참조하시기 바랍니다.

 

 

DirectX3D 디바이스와 SwapChain 생성하기

 

DX11에서 3D디바이스와 SwapChain은 동시에 생성됩니다. "D3D11CreateDeviceAndSwapChain" 함수를 이용해서 두개의 디바이스 객체를 한번에 생성하게 됩니다. 생성하는 방법은 DX의 객체의 생성법이 다 그렇듯이, 생성을 위한 인자들과 생성 정보를 담고 있는 구조체를 인자로 넘겨주면 생성이 됩니다.

이제는 예제 코드의 순서에 따라서 생성하기 위한 정보들이 어떤것들이 있고, 어떻게 설정하는지 Step by Step으로 설명하겠습니다. (다시 말씀드리지만 이 연재는 초보자용으로 쓰고 있는 입문 연재입니다.^^)

  1. 변수 선언


디바이스를 생성하고, 생성된 디바이스 객체 정보를 담을 변수들을 선언합니다.

 

위 객체들이 어떤 역할을 하는지는 타입명만 보면 대충 감이 잡히실겁니다. 초기화의 목적은 아래 세개의 객체 디바이스, 디바이스컨텍스트, SwapChin을 생성하고 초기화하는 것입니다. 생성 방법은 아래 내용에서 알아보겠습니다.

 

2. CreateDeviceFlag의 설정
생성할 DX 디바이스의 플래그를 설정해줍니다.



위와 같이 UINT값으로 플래그를 설정합니다. 디버그 버전에서는 위처럼 디버그용 플래그를 설정하고 릴리즈의 경우에서는 0을 설정하면 됩니다.

 

3. 3D 드라이버 타입의 설정
생성할 3D 드라이버 타입 배열을 설정합니다.



원래는 바로 하드웨어 지원으로 설정해도 되지만, 아직 DX11을 지원하지않는 그래픽카드가 많기 때문에, DX11을 지원하지 않는 그래픽 카드에서는 REF 모드로 생성하기 위해서 가능할만한 드라이버 타입들을 배열로 생성해서 나중에 디바이스를 생성할 때 for 문을 돌면서 하나씩 직접 생성해 볼것입니다. 그래서 처음으로 생성에 성공하는 드라이버 타입을 사용할 겁니다.
즉, 하드웨어 모드나 WARP 모드로 디바이스가 생성되지 않는다면, DX11을 지원하지 않는 하드웨어이기 때문에 마지막 레퍼런스 모드로 생성이 됩니다.
레퍼런스 모드는 하드웨어가 지원하지 않을 때 소프트웨어적으로 지원을 해서 디바이스를 생성하여 줍니다. 물론 하드웨어 가속을 사용하지 못하기 때문에 성능이 상당히 처절하긴 하지만, 이로 인해서 DX11을 지원하지 않는 하드웨어서도 DX11 디바이스를 생성하고 사용할 수 있습니다. 아직 기초 예제에서는 성능에 부하가 큰 내용이 없기 때문에 DX11을 지원하지 않는 그래픽 카드에서도 이 예제를 실행해 보는데는 무리가 없습니다.

4. Feature Level의 설정
피처레벨은 DX의 어느 버전의 기능을 지원할지를 설정하는 것입니다.



피처레벨에 대해서는 '조진현'님이 상세한 설명을 해주셨기 때문에 그 연재 내용을 참고하시면 됩니다.

 

5. DXGI_SWAP_CHAIN_DESC 구조체 설정
스왑체인을 생성하기 위한 정보들을 구조체에 세팅하여 줍니다.



가장 설정하게 많은 스왑체인 생성 구조체입니다. 우선 하나하나 설명을 하겠습니다.

BufferCount는 생성할 백버퍼의 카운트입니다. 현재는 하나만 생성합니다. Width와 Height는 생성할 백버퍼의 해상도입니다. 생성한 윈도우와 같은 크기의 백버퍼를 생성하기 때문에, 윈도우의 크기와 같게 설정하여 줍니다. (윈도우 크기를 구하는 코드는 예제코드 위쪽에 있습니다) Formatr은 역시 백퍼러를 생성할 포맷을 설정합니다. 지금은 기본 포맷이기 때문에 R8G8B8A8, 즉 각각의 RGBA 컬러에 8비트씩을 할당하는 32비트 컬러포맷으로 백버퍼를 생성합니다.

RefreshRate는 화면 주사율을 의미합니다. 일반적으로 60으로 설정합니다. Denominator 역시 1로 설정합니다.

BufferUsage는 생성한 버퍼의 사용 용도를 의미합니다. 백버퍼에 사용할 렌더타겟으로 버퍼를 생성하고 있기 때문에 위와 같이 설정하여 줍니다.

OutputWindow는 이 버퍼를 출력할 윈도우 핸들을 지정합니다. 어플리케이션을 생성할 때 저장한 현재 윈도우의 핸들을 지정해 줍니다.

SampleDesc는 멀티샘플링을 사용할지에 대한 설정입니다. 멀티샘플링은 다른 말로 하면 안티얼라이싱과 같은 의미입니다. 화면의 계단 현상을 줄이기 위한 기술로 독자 여러분도 많이들 들어보셨을 겁니다. 이 설정을 Count = 1, Quality = 0으로 설정하면 이 기능을 사용하지 않는 다는 의미입니다. 이 예제는 멀티샘플링을 사용하지 않기 때문에 위와 같이 설정합니다.

Windowed는 풀스크린으로 출력할지, 윈도우 창으로 출력할지에 대한 설정입니다. 예제에서는 윈도우 모드로 생성하기 때문에 TRUE를 설정하였습니다.

 

6. 3D 디바이스와 스왑체인의 생성
이제 위와 같은 설정들이 모두 끝나면 실제로 디바이스와 스왑체인을 생성할 수 있습니다. 지금까지 위의 과정은 이 과정을 위한 준비단계였습니다. 실제로 Create함수를 호출하여 디바이스를 생성하겠습니다.



지금껏 준비과정에서 생성된 정보들을 가지고 함수를 호출해서 필요한 객체들을 생성합니다.
실제 예제 코드에서는 DX11을 지원하지 않는 하드웨어를 위해서 for문 내에서 드라이버 타입을 바꿔가면서 위 함수를 호출하고 있습니다. 그러다가 디바이스가 성공적으로 생성되면 그 디바이스를 사용하게 되어있습니다. 따라서 이 예제는 DX11이 지원되지 않는 그래픽카드에서도 레퍼런스 모드로도 돌아가게 되어있습니다. 나중에 DX11이 기본적으로 지원되는 세상이 된다면 이런 작업을 해주지 않고 바로 하드웨어 지원으로 설정해도 되겠죠. (사실 이런 코드 때문에 코드가 좀더 복잡해 보입니다.. =ㅅ=)

 

 

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

이 연재에는 예제 코드가 첨부 파일로 포함되어 있습니다.

 

 

 

 

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

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

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

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