Direct3D-11 렌더링 엔진 만들기: 1 프로젝트 세팅
Direct3D-11 렌더링 엔진 만들기 : 1 프로젝트 세팅
렌더링 엔진을 만들기 위한 프로젝트 설정을 진행합니다.
아래 그림처럼 두 개의 프로젝트를 사용하도록 Visual Studio 솔루션을 만들 예정입니다.
Engine 프로젝트는 빌드 후 dll로 제작합니다.
Direct3D를 직접 사용하는 그래픽스 API가 필요한 기능은 Engine 프로젝트에 추가합니다.
아래와 같은 기능을 Engine 프로젝트에서 구현합니다.
- Direct3D 장치 초기화
- 버퍼 초기화(백 버퍼/깊이 버퍼)
- 정점 버퍼/인덱스 버퍼/상수 버퍼 생성 및 바인딩
- 리소스 생성 및 바인딩
- 쉐이더 컴파일/생성 및 바인딩
- 드로우 콜(Draw Call)
- 백 버퍼-프론트 버퍼 전환(스왑/Swap)
Application 프로젝트는 빌드 후 exe가 생성됩니다.
Application 프로젝트에서 Engine 프로젝트의 빌드 결과물인 dll을 링크해서 엔진의 기능을 활용해 데모를 제작할 것입니다.
엔진 기능이 갖춰지면 Application에서 엔진의 기능을 활용하는 구조라고 생각할 수 있습니다.
그래픽스 API를 직접 사용하는 프로젝트와 프로그램을 제작할 프로젝트를 구분하기 위해 프로젝트를 나눠서 구성합니다.
프로젝트 생성하기
Visual Studio 2019를 실행합니다.
프로젝트 마법사에서 “새 프로젝트 만들기”를 선택합니다.
이어지는 메뉴에서 아래와 같이 메뉴를 선택합니다.
먼저 언어 선택에서 C++를 선택합니다.
그런 다음 “빈 프로젝트”를 선택합니다.
선택을 완료했으면 “다음” 버튼을 클릭합니다.
이제 프로젝트와 솔루션의 이름을 지정할 차례입니다.
먼저 프로젝트 이름란에 “Application”으로 입력합니다.
이어서 솔루션 이름란에 “RenderEngine”으로 입력합니다.
(프로젝트 이름을 먼저 입력한 다음, 솔루션 이름을 입력해야 아래 그림과 같이 입력이 가능합니다.)
그런 다음, 만들기 버튼을 선택합니다.
그러면 RenderEngine 이라는 솔루션 안에 Application이라는 프로젝트가 생성됩니다.
Visual Studio에서 솔루션은 여러 프로젝트를 포함할 수 있습니다.
아래와 같이 솔루션과 프로젝트가 생성된 다음 Visual Studio에서 열렸으면 프로젝트를 하나 더 생성합니다.
솔루션 ‘RenderEngine’ (1/1개 프로젝트) 에서 마우스 오른쪽 버튼을 누릅니다.
나오는 메뉴에서 추가->새 프로젝트를 선택합니다.
나타나는 메뉴에서 “C++”, “빈 프로젝트”를 선택하고 “다음” 버튼을 클릭합니다.
프로젝트 구성 메뉴에서 프로젝트 이름을 “Engine”으로 지정하고 “만들기” 버튼을 선택합니다.
프로젝트 속성 설정하기
이제 솔루션 설정을 진행합니다.
Visual Studio에서 프로젝트를 빌드할 때는 구성(Configuration)과 플랫폼(Platform) 두 가지 속성을 각각 설정할 수 있습니다.
구성은 보통 Debug/Release를 사용하고, 플랫폼은 x86(32비트)/x64(64비트)를 사용합니다.
이 프로젝트에서 플랫폼은 x64만 지원하도록 설정하겠습니다.
Visual Studio 상단 메뉴에서 빌드 -> 구성 관리자를 선택합니다.
나타나는 팝업에서 활성 솔루션 플랫폼을 선택하고, 편집을 선택합니다.
x86을 선택하고 제거를 누른 다음, 닫기 버튼을 클릭합니다.
Application 프로젝트도 아래 그림과 같이, 플랫폼에서 Win32를 제거합니다.
Engine 프로젝트도 같은 방식으로 Win32 플랫폼을 제거합니다.
이렇게 설정해주면 이 프로젝트는 64비트만 지원합니다.
앞서 프로젝트 구성을 설명할 때 Engine 프로젝트는 dll로 빌드하고, Application은 exe로 빌드한다고 설명했습니다.
이에 맞게 프로젝트를 설정합니다.
먼저 Engine 프로젝트를 선택하고 상단의 몽키 모양 버튼을 선택합니다. (마우스 우클릭 -> 속성과 동일한 기능을 합니다.)
속성 설정 페이지에서 아래에 빨간색 박스에 나온대로 모두 설정합니다.
먼저 구성을 선택하고 “모든 구성”을 선택합니다.
마찬가지로 플랫폼도 “활성(x64)”를 선택합니다.
(플랫폼은 64비트 밖에 없기 때문에 하나만 남아 있습니다.
이렇게 선택하고, 다른 설정을 진행해야 모든 구성 및 플랫폼에서 동일한 설정을 사용할 수 있습니다.
구성이나 플랫폼에 따라 다른 설정을 사용하는 경우가 아니라 동일한 설정을 사용해야 하는 경우에는 이렇게 선택을 하고 나머지 속성을 설정해야 두 번 일하는 수고가 줄어듭니다.
이제 구성 형식을 선택해 “동적 라이브러리(.dll)을 선택합니다.
이렇게 설정하면 Engine 프로젝트는 빌드한 후에 dll로 제작됩니다.
C++ 언어 표준은 C++17로 선택합니다.
설정이 완료되었으면, 적용 버튼을 누릅니다.
참고로, 이 프로젝트에서 사용하는 C++ 기능은 대부분 C++14 버전이면 충분한데, C++17 기능인 std::filesystem을 사용할 것이라 C++17로 설정했습니다.
이번에는 같은 설정 화면에 있는 출력 디렉토리와 중간 디렉토리를 변경합니다.
각 항목에 아래와 같이 입력해줍니다.
출력 디렉토리: $(SolutionDir)Bin\$(Configuration)-$(Platform)\$(ProjectName)\
중간 디렉토리: $(SolutionDir)Bin-Intermediate\$(Configuration)-$(Platform)\$(ProjectName)\
출력 디렉토리는 빌드 후 최종 파일이 저장될 경로입니다.
Engine 프로젝트는 dll로 제작될 것이니 Engine.dll 파일이 출력 디렉토리 경로에 생성됩니다.
중간 디렉토리는 .cpp 확장자의 파일이 컴파일된 결과인 .obj 파일 등이 저장되는 경로입니다.
Visual Studio의 기본 설정이 마음에 들지 않아 위의 설정과 같이 변경해 진행할 예정입니다.
같은 방식으로 Application 프로젝트의 설정도 진행합니다.
Engine 프로젝트의 설정과 동일한데, 구성 형식만 exe로 지정합니다.
Application 프로젝트는 exe로 제작될 것이기 때문입니다.
이제 Engine/Application 프로젝트의 하위 시스템을 모두 “창”으로 설정합니다.
이를 위해 Engine 프로젝트의 설정을 열고 왼쪽 목록에서 링커를 찾아 메뉴를 확장합니다.
그런 다음 시스템을 선택하고, 오른쪽 메뉴에서 하위 시스템 항목을 창으로 선택합니다.
같은 방식으로 Application 프로젝트의 하위 시스템도 창으로 선택해줍니다.
프로젝트 종속성 설정하기
대략적인 프로젝트 설정을 진행했지만, 아직 몇 가지 설정이 더 남았습니다.
지금 솔루션에는 Engine 프로젝트 Application 프로젝트 두 개의 프로젝트가 있습니다.
Engine 프로젝트는 빌드 후 dll로 제작되며, 이 프로젝트에 Direct3D를 활용한 대부분의 기능들이 포함됩니다.
Application 프로젝트는 최종 예제를 제작하는 프로젝트입니다.
Engine 프로젝트의 빌드 결과물인 dll을 사용해 화면을 그리고 조명을 처리하는 작업을 구현합니다.
따라서 Application 프로젝트는 Engine.dll을 참조(사용)해야 합니다.
이를 조금 천천히 생각해보면 Engine 프로젝트를 먼저 빌드한 다음, Application 프로젝트를 빌드해야 Application 프로젝트에서 Engine.dll 파일을 사용할 수 있다는 것을 알 수 있습니다.
따라서 프로젝트 빌드는 1. Engine 프로젝트 빌드 2. Application 프로젝트 빌드 순으로 진행해야 합니다.
Visual Studio는 이를 위해 “프로젝트 종속성”이라는 설정을 지원합니다.
Application 프로젝트는 Engine 프로젝트의 결과물인 Engine.dll 파일을 사용하기 때문에 Engine 프로젝트에 종속되어 있습니다.
프로젝트 종속성을 설정합니다.
솔루션 탐색창에서 솔루션 ‘RenderEngine’ (2/2개 프로젝트)를 선택하고 상단의 몽키 모양의 버튼을 클릭합니다.
그러면 팝업 설정 창이 나타나는데 왼쪽 목록에서 “프로젝트 종속성”을 선택합니다.
오른쪽 메뉴에서 “프로젝트”는 Application을 선택하고, “다음에 종속” 항목에 있는 Engine 프로젝트에 체크합니다.
모두 설정했으면 확인 버튼을 누릅니다.
이제 빌드 설정이 잘 됐는지를 보기위해 솔루션을 빌드해보겠습니다.
상단 메뉴에서 빌드 > 솔루션 빌드를 선택합니다.
모든 설정이 문제 없다면 출력 창에 빌드 결과가 아래와 같이 나옵니다.
빌드 순서를 보면 Engine 프로젝트가 먼저 빌드됩니다.
그런 다음, Application 프로젝트가 빌드되는 것을 볼 수 있습니다.
지금까지 솔루션에 프로젝트를 두 개 생성하고, Engine 프로젝트와 Application 프로젝트에 대한 설정을 진행했습니다.
모든 설정을 다 진행한 것은 아니지만, 앞으로 필요할 때마다 하나씩 추가하도록 하겠습니다.
이 정도로 기본적인 프로젝트 구성은 마무리 하겠습니다.
다음 시간에는 Direct3D를 활용해 그림을 그릴 창을 띄우는 과정을 진행합니다.
긴 글 읽어주셔서 감사합니다.
궁금한 점은 댓글로 남겨주세요.