[DirectX12]

프로젝트 설정

럭키🍀 2021. 12. 11. 17:22

DirectX12로 게임 프레임워크 만들것 같은데 이것저것 해보기 위해 DirectX를 사용하는 프로젝트를 세팅해보자.

 

VS2019로 새 프로젝트 만들기>C++ Window 데스크톱 어플레케이션>솔루션 이름을 Game으로, 프로젝트 이름을 Client로 만들어보자.

 

*엔진을 따로 빼서 관리할 것이다.

WindowAPI를 사용해 만들 것이다. 

 

Client.cpp에는

WinMain이 있어서 여기서부터 호출이 되고 기본메세지루프 While문이 있어 이 안에서만 동작할 것이다.

더 자세히 살펴보면 GetMessage가 있는데 입력을 메세지로 받아서 동작한다.(그러나 GetMessage는 입력이 없으면 대기상태를 유지하므로 계속 동작하기위해(렌더링도 해야하고 통신도 해야하고 할게 많으니깐) 후에 PeekMessage로 바뀐다.)

*참고로 모든 API의 내용을 알긴 힘드므로 간단하게 보고 넘어가자.

 

 While문은 계속 동작하도록 true로 바꾸고 if(PeekMessage())를 넣는다.

 

PeekMessage() 의 인자는 첫번째로 받는 메세지, 두번째인 핸들은 어떤 윈도우핸들을 사용할지로 null로 하면 현재 스레드와 관련된 핸들의 모든 메세지를 받게된다. 세번째로 특정 메세지를 필터링해서 받을 수 있지만 모든 메세지를 받기 위해 0,0으로 했다. 마지막 인자로 PM_REMOVE를 했는데 이는 Windows에서 물리 입력 이벤트가 들어오면 큐에 들어오는 이를 하나씩 살펴보고 큐에서 지우도록 하는 옵션이다.

그리고 머 WM_QUIT하는 경우, 메세지 처리하는 부분 등 메인루프를 보았다.

 

*Precompiled Header의 개념

자주 활용하는 기능을 매번 include하는 것은 쉽지 않으므로 공용으로 모아서 관리하는 파일이다. 미리 공용으로 컴파일 되어있으므로 속도에도 이점이 있다. 

 

*버전을 x64로 바꾸고 프로젝트 속성에서 C/C++>미리 컴파일된 헤더>모든구성에 대해 플랫폼은 모든 플랫폼으로 하고 미리 컴파일된 헤더를 사용으로 바꾸고 헤더 파일 이름을 pch.h로 정해(stdafx.h도 많이 사용한다.) 확인을 누른다!

 

헤더파일 디릭토리에서 헤더파일들을 소스파일로 옮기고 헤더파일 디렉토리는 지워버렸다. 굳이 구분해 관리할 이유는 없으니깐 . 새필터> Utils, Game을 만들었다. 기본적으로 만들어진 파일들은 Utils에 넣고 Utils에 새 클래스추가로 pch를 만들었다. pch.h에서 pch클래스는 지우고 pch.cpp만 우클릭으로 속성에 가서 미리컴파일된 헤더를 만들기로 바꿔준다.

 

이 상태에서 빌드하면 에러가 나는데 Client.cpp에 #include "pch.h"를 하고 빌드를 해준다. 이러면 pch.h에 사용할 라이브러리를 넣어주므로 여기서 가져다쓰게된다.

 

Game디렉토리(필터)에다가 클래스 추가로 Game클래스를 만들어준다. (이제 새로만든 클래스에 대해선 pch.h가 인클루드되어있다.)

 

Game.h에 void Init(), void Update()를 만들어 주자.

Utils\Client.h,Client.cpp에는 윈도우즈 창을 만들고 메인루프에서 Update만 한번씩 하도록하고 Game에는 게임과 관련된 부분을 만들어 Client에서 호출되도록 분리하여 만든다.

Clinent에서 Game* game= new Game();이런식으로 만들어 호출하도록한다. 메인while루프 밖에서 game()->init(), 루프안에서 game()->update();를 넣어준다.

참고로 여즘엔 속도에 손해를 보더라도 생 포인터를 사용하지 않고 스마트포인터를 사용하므로 new Game();이렇게 직접안하고 

unique_ptr<Game> game= make_unique<Game>(); 이렇게 바꿔주자.

pch.h에 #include <memory>;를 해서 사용가능하다.

 

 

실행시켰을 때 나오는 메뉴에 파일과 도움말으 없애기 위해 Client.cpp에서 lpszMenuName을 nullptr로 바꾼다.

 

 

엔진을 별도의 라이브러리로 빼서 관리할 것이다. 공용으로 만들어 재사용을 위해서.

솔루션탐색기에서 솔루션>우클릭>추가>새 프로젝트>정적 라이브러리(프로젝트 자체에 같이 합쳐져서)

프로젝트 이름은 Engine으로 했다.

*동적라이브러리는 실행하는 시점에 불러와 사용

헤더파일 필터안에 있는 파일들을 소스파일필터로 옮기고 헤더파일 필터를 없애버렸다 리소스 필터와 Engine.cpp도 삭제. (메인파일이 생성되지 않았는데 시작프로그램으로 설정 할 수 없다.)

framework.h의 내용을 pch.h에 추가하고 framework.h를 삭제했다. Engine이라는 필터 Resource라는 필터, Utils라는 필터를 만들었다. 글구 pch.h와 pch.cpp를 Utils필터에 넣구 소스파일 필터를 삭제했다.

Utils에 EnginePch클래스를 추가한다. 그리고 pch.h에 #include EnginePch.h를 추가했다.

EnginePch.h 요기에 각종 include, lib, typedef를 쓸 것이다.

(~26:00)

 

#include "d3dx12.h"를 추가 Utils에 하는데 MS에서 비공식적으로 제공해 깃헙에서 추가한다.

이외에도 추가할 라이브러리는 루키스껄 긁어오자.

 

파일 탐색기에서 Debug나 x64에 중간 파일이나 실행파일이 생기니깐 바꾸기 위해 Output폴더를 만들고 Engine 우클릭>속성>출력 디렉토리에 모든 구성과 모든 플랫폼에 대해 $(Solution)Output\ 으로 바꿔보자. (Client도 동일하게 만들어준다.)

 

또 파일탐색기에 미리 Resources폴더도 만들어보자.

프로젝트 내에

Engine

Client:엔진을 사용해 만든 게임

Output:빌드를 해 만든 실행파일

 

Client프로젝트에서 Engine프로젝트를 끌어다 쓰기 위해서 헤더파일들이 있는 경로와 lib파일들이 있는 경로를 알려줘야한다. 상대경로를 만들어 알려주는데 솔루션의 위치를 기준으로

Client>속성>VC++ 디렉토리>포함디렉터리:헤더가 있는 디렉토리($(SolutionDir)Engine\) / 라이브러리 디렉토리: 라이브러리가 있는 디렉토리($(SolutionDir)Output\) 를 추가하고 적용한다.

마지막으로 Client\Utils\pch.h에 #include "EnginePch.h"추가하고 빌드해준다.

근데 이럼 링크에러가 뜬다ㅠㅠ

Client>우클릭 속성>링커>입력>추가 종속성에 Engine.lib를 추가해준다.

다시 빌드하면 성공☺

아니면 #pragma comment (lib,"Engine.lib")를 Client\Utils\pch.h를 하면 컴파일 전 전처리기가 이를 읽어 위와 같은 걸 해주는 것이다. 추가 종속성을 전처리기가 해주는 것!

 

Client프로젝트를 시작 프로젝트로 빌드하면 이제 실행 가능하게 된다.

 

~The End~