설치 후에 '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 가 정점 데이터를 출력하기 위해서 그래픽 파이프라인의 구조를 띄우고 있습니다. 이에 대한 내용은 아래에서 확인이 가능합니다.