🙇‍♀️DirectX12 공부를 위한 프로젝트 설정


🪐프로젝트 생성

스크린샷 2023-12-05 201248

windows 데스크톱 애플리케이션으로 생성을 한다.
현재의 경우 원하는 폴더에 생성을하고 솔루션 이름은 DirectX12Game, 프로젝트 이름은 Client로 지었다.

winMain함수

기본적으로 wWinMain이 main함수와 동일하며 이 프로젝트에서 그래도 실행하면 아래와 같은 화면이 나온다.

windows애플리케이션 기본 실행 화면

wWinMain에서 while문에서 빠져나가지 않기 때문에 화면이 꺼지지 않고 계속 실행된다.
게임도 이와 마찬가지로 main함수안에 무한 루프를 통해서 게임이 끊기지 않고 실행된다.

현재 wWinMain의 While을 살펴보자.

winMain함수의 while

GetMessage는 클릭이나 키보드 입력 등 이벤트가 발생했을 때만 실행되는데 게임 같은 경우 이렇게 끊기면 안되고 실시간으로 계속 실행되어야 하기때문에 이 부분이 변경이 필요하다.

그래서 GetMessage가 아니라 true로 변경하고 PeekMessage를 사용하게 된다.
이것은 PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE) 로 사용하는데 인자들을 설명해보자면 첫 번째 인자로 메시지를 받아줄 수가 있는거고 그 다음 인자는 핸들을 통해서 어떤 핸들 윈도우즈를 지금 사용하는 건지를 지정할 수 있는데 이렇게 nullptr을 사용하게 된다면 Thread와 관련된 모든 메시지를 받게된다.
그 다음 0, 0 은 필터인데 이렇게하면 모든 메시지를 받게된다.
PM_REMOVE는 기본적으로 일감을 메시지 큐에 집어넣고 그것을 하나씩 꺼내서 사용하게 되는데 PM_REMOVE는 큐에서 꺼내주는 의미이다.

기본적으로 메인은 한번만 만들고 건들지 않기 때문에 기억안해도 되는 부분이라고 한다.
근데 왜 루키스님은 다 알고있는데..

그리고 프로그램은 나가기 위해서 WM_QUIT를 사용하면 아래와 같이 변경되게 된다.

winMain변경 1

이렇게까지 하고 편하게 작업하기 위하여 pch를 만들어준다.
pch와 관련된 것은 따로 정리하였다.

pch를 만들고 난 뒤에는 Game 클래스를 만들었다.
game class

Game 클래스를 만들었으므로 winMain에 적용한다.
winMain 변경 2

그리고 프로젝트를 실행할 때 메뉴바를 없애기 위하여 woex.lpszMenuName를 nullptr로 변경한다.
메뉴이름 없애기

메뉴를 제외하면 아래와 같은 화면이 나온다.
메뉴를 뺀 화면


🪐Engine 만들기

코드를 재사용하기 위하여 Engine 라이브러리를 만든다.

라이브러리를 생성하기 위해서 솔루션 -> 추가 -> 새 프로젝트를 한다.
라이브러리 생성 1

다른 Windows 실행 파일 내에 패키지할 수 있는 정적 라이브러리를 만든다.
라이브러리 생성 2

lib파일은 스스로 실행할 수 없다.
왜냐하면 실행파일인 exe파일을 만들지 않기 떄문이다.

라이브러리 생성 3

라이브러리는 main함수가 따로없기 때문에 Engine.cpp 파일도 필요하지 않으므로 삭제한다.
그리고 framework.h 안에 보면 한 줄만 있기 때문에 복사하여 pch.h에 넣고 삭제한다.

그리고 클라이언트에서 자주 사용되는 것들을 따로 pch로 만들기 위해서 EnginePch 라는 클래스를 따로 만들었다.

Engine.h의 내용은 아래와 같다.
다른 프젝에서도 사용될 수 있을거같아서 코더로 넣었다.

#pragma once

// 각종 include
#include <windows.h>
#include <tchar.h>
#include <memory>
#include <string>
#include <vector>
#include <array>
#include <list>
#include <map>
using namespace std;

#include "d3dx12.h"
#include <d3d12.h>
#include <wrl.h>
#include <d3dcompiler.h>
#include <dxgi.h>
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
#include <DirectXColors.h>
using namespace DirectX;
using namespace DirectX::PackedVector;
using namespace Microsoft::WRL;

// 각종 lib
#pragma comment(lib, "d3d12")
#pragma comment(lib, "dxgi")
#pragma comment(lib, "dxguid")
#pragma comment(lib, "d3dcompiler")

// 각종 typedef
using int8		= __int8;
using int16		= __int16;
using int32		= __int32;
using int64		= __int64;
using uint8		= unsigned __int8;
using uint16	= unsigned __int16;
using uint32	= unsigned __int32;
using uint64	= unsigned __int64;
using Vec2		= XMFLOAT2;
using Vec3		= XMFLOAT3;
using Vec4		= XMFLOAT4;
using Matrix	= XMMATRIX;


🪐파일 생성 위치 변경

파일 생성 위치를 Output이라는 폴더내에 다 집어 넣도록 변경한다.
먼저 Engine을 우클릭하여 속성에 들어간다.
파일 생성 위치 변경 1

그 뒤에 구성속성의 일반에서 출력 디렉토리를 $(SolutionDir)Output\로 변경한다.
파일 생성 위치 변경 2


🪐엔진의 기능을 클라이언트에서 사용하기

클라이언트에서 엔진과 관련된 기능을 끌어다쓰는 방법을 알아보자.
클라이언트에게 엔진의 헤더파일이 있는 경로와 lib파일의 경로를 알려줘야한다.
지금은 Engine폴더에 가면 헤더파일이 있고, Output 폴더에가면 lib 파일이 있다.
그것을 알려주면 된다.

클라이언트 프로젝트를 우클릭하여 속성에 들어가서 구성속성 -> VC++ 디렉터리에 들어간다.
엔진 사용하기 1

포함 디렉터리는 헤더파일이 있는 경로를, 라이브러리 디렉터리는 lib 파일이 있는 경로로 지정해주면 된다.
경로는 상대 경로로 지정하는게 좋다.

엔진 사용하기 2

이렇게 포함디렉터리에는 $(SolutionDir)Engine\ 을 넣어준다.

엔진 사용하기 3

라이브러리 디렉터리에는 $(SolutionDir)Output\ 을 넣어준다.

이렇게 하고 Engine에 있는것을 클라에서 사용하게 된다면 아래와같은 에러가 뜬다.
엔진 사용하기 4

이 에러는 링커에러인데 이것을 해결하기 위해서 pch.h 에서 #pragma comment(lib, "Engine.lib) 를 추가한다.
pragma는 전처리 단계에서 일어난다.

엔진 사용하기 5

이렇게 하면 에러가 나지 않고 사용할 수 있다.

프로젝트 세팅 끝