새소식

프로그래밍/DirectX

[DirectX] 001. CreateDevice

  • -

!!! NOTICE !!!
이 글은 DirectX의 기본 이론 등을 다루고 있습니다!
학습한 정보를 제가 기억하고 추후에도 사용해두기 위해 기록해둔 내용입니다!
이 점 유의하고 봐주세요!


Direct3D가 어떤식으로 구현이 되는지 알아보려고 합니다.
이를 위해서 여러분은 먼저, SDK 를 설치해주어야 합니다.

구글에 'DirectX SDK' 를 검색하시면
마이크로소프트 공식 홈페이지에서 설치가 가능합니다.

https://www.microsoft.com/en-us/download/details.aspx?id=6812

 

DirectX SDK - (June 2010)

Download the complete DirectX SDK, which contains the DirectX Runtime and all DirectX software required to create DirectX compliant applications.

www.microsoft.com

설치 후에 'directX sample browser' 를 실행하면
directX에서 제공하는 샘플들을 볼 수 있습니다.

또한, Direct3D 를 다루기 위해서는
C++, Win32 API에 대한 지식이 필요합니다.
이 점 유의해주세요.


예제로 올라와있는 튜토리얼 중에서 Tutorial 1: CreateDevice 를 먼저 살펴보도록 하겠습니다.
Install Project 버튼으로 솔루션을 받아서 열어보도록 하죠.

 

코드를 살펴보기에 앞서서
게임이 실행되는 루틴 4요소에 대해 설명하겠습니다.

게임을 실행하게 되면 프로그램은 다음의 흐름으로 이루어 집니다.
초기화 -> (업데이트 -> 렌더링[출력]) -> 해제

게임에서 사용할 변수들을 초기화하는 초기화영역,
게임의 변화를 처리하는 업데이트영역,
화면에 출력하기 위해 연산을 거치는 렌더링영역,
게임을 종료하면서 사용했던 자원들을 해제하는 해제영역.

이때, 게임은 업데이트 ~ 렌더링 영역은 무한루프를 돌려서
유저가 입력하는 이벤트/메세지 등을 감지하고, 화면에 반응을 만들어주고,
게임이 계속해서 작동되게끔 합니다.

이 부분에서 종료에 해당하는 메시지가 발생하면
무한루프를 깨고 해제영역으로 들어스면서 게임을 종료됩니다.

이 무한루프 구조는 솔루션 내에서 쉽게 확인할 수 있습니다.
INT WINAPI wWinMain() 함수를 살펴보면 다음과 같은 코드가 존재합니다.

무한루프

while문을 이용하여 무한루프를 돌리고,
GetMessage() 함수로 게임에서 발생하는 메시지가 존재하는지 체크,
TranslateMessage() 함수로 키보드 입력과 관련해 처리를 진행,
DispatchMessage() 함수로 윈도우 프로시져에게 메세지를 전송하여 처리를 요청합니다.

위 과정을 무한루프 돌려 게임에 변화를 줍니다.

이때, 문제점이 존재한다면 GetMessage 부분입니다.

유저가 프로그램을 사용할 때, 항상 입력이 존재하는 것은 아닙니다.
마우스를 가만히 두는 둥, 입력이 들어오지 않는 경우를 말하고 있는겁니다.

GetMessage()는 메시지가 들어오는가를 판단하고, 메시지가 들어오지 않았다면
대기 상태에 돌입합니다.
대기 상태에 돌입한 무한루프는 GetMessage()에서 계속하여 대기하고 있기 때문에
아래 TranslateMessage(), DispatchMessage()를 실행하지 않습니다.

때문에 이러한 구조를 바꾸기 위해서는 PeekMessage() 를 활요하는 방법이 존재합니다.
PeekMessage()는 GetMessage() 처럼 메시지를 확인하고, 처리해주는 기능은 동일하나,
GetMessage() 처럼 메시지가 올때까지 대기하는게 아닌 들어왔는가만 확인하고
들어오지 않았어도 아래 과정을 실행합니다.
대기상태가 존재하지 않습니다.

PeekMessage()를 적용한 모습은 다음과 같습니다.

이러한 메세지 루프를 구성함으로써,
Direct3D의 기본 환경을 구성했다고 할 수 있습니다.


Direct3D 가 정점 데이터를 출력하기 위해서
그래픽 파이프라인의 구조를 띄우고 있습니다.
이에 대한 내용은 아래에서 확인이 가능합니다.

https://onionisdelicious.tistory.com/41

 

[Direct3D/Issue] Direct3D 그래픽 파이프라인 구조에 대해

3D 그래픽을 렌더링하는데 있어서 가장 핵심이 되는 점은 정점(Vertex)입니다. 어떠한 삼각형을 그린다고 했을때, 3D 공간상에 올라갈 삼각형의 꼭지점 위치가 존재하는데요, 이를 정점이라고 합니

onionisdelicious.tistory.com

추가로 Win32 응용 프로그램을 만들때,
기초에선 GDI 라고 하는 그래픽을 그리기 위한 인터페이스로 그렸습니다.
이때, GDI를 Direct3D로 치완하여 우리는 그래픽을 출력하는 것입니다.

Direct3D를 사용하기 위해서는 해당 헤더파일이 선언되어 있어야 합니다.
이는 해당코드에서 다음과 같이 확인이 가능합니다.

추가로 Direct3D를 사용하기 위한 라이브러리가 포함되어 있어야 합니다.
이는 해당 프로젝트의 속성에서 다음과 같이 확인이 가능합니다.

 

미완성 게시글!!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.