Company
교육 철학

Nuget패키지 D3D12 라이브러리 설치하기

NuGet을 통한 DirectX 12 라이브러리 설치

DirectX 12는 Windows SDK에 기본적으로 포함되어 있지만, NuGet 패키지 관리자를 통해 추가 개발 도구와 최신 기능을 손쉽게 프로젝트에 통합할 수 있습니다. 이 문서에서는 NuGet을 사용하는 이유와 설치 과정, 그리고 Agility SDK의 개념을 상세히 다룹니다.

NuGet을 사용하는 이유

Windows SDK에는 기본적인 Direct3D 12 헤더와 라이브러리가 포함되어 있지만, 다음과 같은 이유로 NuGet 패키지를 추가로 사용합니다.
최신 기능 접근
Windows SDK는 운영체제 업데이트 주기에 따라 배포되기 때문에, 최신 GPU 기능과 API를 즉시 사용하기 어렵습니다. NuGet 패키지는 독립적으로 업데이트되어 최신 DirectX 12 기능을 빠르게 적용할 수 있습니다.
자동 프로젝트 구성
NuGet 패키지는 Visual Studio 프로젝트에 자동으로 통합됩니다. 헤더 경로, 라이브러리 링크, 종속성 관리가 자동으로 설정되어 수동 구성의 번거로움을 줄여줍니다.
개발 도구 통합
PIX 디버깅 도구, 셰이더 컴파일러, 텍스처 로딩 라이브러리 등 DirectX 개발에 필요한 추가 도구들을 간편하게 설치할 수 있습니다.
크로스 플랫폼 빌드 지원
NuGet 패키지는 여러 플랫폼과 Visual Studio 버전에서 일관된 빌드 환경을 제공합니다. 팀 협업 시 환경 차이로 인한 문제를 최소화할 수 있습니다.

DirectX 관련 주요 NuGet 패키지

DirectX 개발에 사용되는 대표적인 NuGet 패키지들은 다음과 같습니다.
패키지 이름
설명
최신 Direct3D 12 헤더와 라이브러리를 제공합니다. 기본 Windows SDK보다 최신 API를 포함합니다.
Microsoft.Direct3D.D3D12.Agility
D3D12 Agility SDK로, 운영체제 버전과 무관하게 최신 GPU 기능을 사용할 수 있게 합니다. Mesh Shader, Enhanced Barriers 등 최신 기능을 지원합니다.
WinPixEventRuntime
PIX GPU 프로파일러에서 사용할 수 있는 이벤트 마커를 코드에 삽입하기 위한 런타임입니다. 성능 분석과 디버깅에 필수적입니다.
DirectXTex
이미지 파일을 로딩하고 텍스처로 변환하는 라이브러리입니다. DDS, PNG, JPEG 등 다양한 포맷을 지원하며, 밉맵 생성과 압축 기능을 제공합니다.
DirectXTK12
DirectX Tool Kit으로, 스프라이트 렌더링, 모델 로딩, 입력 처리 등 게임 개발에 필요한 유틸리티 함수들을 제공합니다.
DirectXMath
SIMD 명령어를 활용한 고성능 수학 라이브러리입니다. 벡터, 행렬, 쿼터니언 연산을 제공합니다.
D3D12MemoryAllocator
DirectX 12의 복잡한 메모리 관리를 단순화하는 라이브러리입니다. 자동 메모리 풀링과 디프래그먼테이션을 지원합니다.

NuGet과 vcpkg의 차이점

C++ 개발자라면 vcpkg라는 패키지 관리자도 익숙할 것입니다. NuGet과 vcpkg는 서로 다른 목적과 생태계를 가지고 있습니다.
항목
NuGet
vcpkg
주 목적
Microsoft 플랫폼 SDK와 Windows API 확장 배포
오픈소스 C/C++ 라이브러리의 크로스 플랫폼 빌드 및 관리
대상 라이브러리
DirectX, Windows SDK, .NET 컴포넌트 등
imgui, glm, stb, Boost, OpenCV 등
설치 위치
프로젝트 폴더 내 packages 디렉터리
전역 또는 사용자 지정 vcpkg_installed 디렉터리
Visual Studio 통합
네이티브 지원, 자동 프로젝트 구성
CMake 통합 또는 수동 설정 필요
DirectX 지원
Agility SDK, PIX Runtime, HLSL Compiler 등 완전 지원
DirectXTK, DirectXMath 등 일부 유틸리티 라이브러리만 지원
버전 관리
프로젝트별 독립적인 버전 지정 가능
전역 설치로 프로젝트 간 버전 충돌 가능
결론
Microsoft 플랫폼 전용 개발에는 NuGet이 더 적합하며, 크로스 플랫폼 오픈소스 라이브러리에는 vcpkg를 사용하는 것이 일반적입니다. 많은 프로젝트에서 두 패키지 관리자를 함께 사용합니다.

NuGet 패키지 설치 과정

Visual Studio에서 DirectX 12 Agility SDK를 설치하는 과정은 다음과 같습니다.
1단계: NuGet 패키지 관리자 열기
Solution Explorer에서 프로젝트를 우클릭하고 "NuGet 패키지 관리"를 선택합니다. 예제에서는 YamYamEngine_CORE 프로젝트를 대상으로 합니다.
2단계: D3D12 Agility SDK 검색 및 설치
찾아보기 탭에서 "D3D12"를 검색하고 Microsoft.Direct3D.D3D12 패키지를 찾습니다. 최신 버전을 선택하여 설치합니다.
설치가 완료되면 프로젝트의 packages 폴더에 필요한 헤더, 라이브러리, DLL 파일이 자동으로 다운로드됩니다.
3단계: 헤더 경로 설정
NuGet은 라이브러리 링크를 자동으로 설정하지만, 헤더 파일 경로는 수동으로 추가해야 할 수 있습니다. 프로젝트 속성에서 다음 경로를 추가합니다.
대상 프로젝트: YamYamEngine_Window
경로 설정: C/C++일반추가 포함 디렉터리
설치한 NuGet 패키지 버전에 맞는 경로를 지정합니다. 일반적으로 다음과 같은 형식입니다.
4단계: 헤더 파일 포함
yaGraphics.h 파일을 수정하여 DirectX 12 헤더를 포함시킵니다. DirectX 11 헤더는 제거하고 DirectX 12 헤더를 추가합니다.
#pragma once #include "CommonInclude.h" #include <wrl.h> #include <d3d12.h> #include <dxgi1_6.h> #include <d3dcompiler.h> // d3dx12.h는 편의 헬퍼 함수를 제공하는 헤더입니다 #include <include\d3dx12\d3dx12.h> #pragma comment(lib, "d3d12.lib") #pragma comment(lib, "dxgi.lib") #pragma comment(lib, "d3dcompiler.lib") #define CB_GETBINDSLOT(name) __CBUFFERBINDSLOT__##name##__ #define CBUFFER(name, slot) static const int CB_GETBINDSLOT(name) = slot; struct alignas(16) name #define CBSLOT_TRANSFORM 0 #define DX12_ENABLE
C++
복사
헤더 파일 설명
d3d12.h: DirectX 12 핵심 API
dxgi1_6.h: DXGI 인터페이스로 어댑터 관리와 스왑체인 생성 담당
d3dcompiler.h: HLSL 셰이더 컴파일러
d3dx12.h: Microsoft가 제공하는 편의 헬퍼 함수 모음 (Resource Barrier, Descriptor Handle 등)
wrl.h: Windows Runtime Library의 ComPtr 스마트 포인터 제공
빌드 테스트
모든 설정이 완료되었으면 프로젝트를 빌드하여 헤더 파일이 정상적으로 인식되는지 확인합니다. 빌드가 성공하면 설치가 완료된 것입니다.

Agility SDK란 무엇인가

Agility SDK는 DirectX 12의 최신 기능을 운영체제 업데이트 없이 사용할 수 있게 해주는 혁신적인 배포 모델입니다.
전통적인 DirectX 업데이트 방식의 문제점
과거 DirectX 업데이트는 Windows 운영체제 업데이트에 종속되어 있었습니다. 새로운 GPU 기능이나 API 개선 사항이 있어도, 사용자가 Windows를 최신 버전으로 업데이트하지 않으면 개발자는 이러한 기능을 사용할 수 없었습니다.
예를 들어, Mesh Shader나 Variable Rate Shading 같은 최신 GPU 기능은 특정 Windows 빌드 이상에서만 사용 가능했습니다. 이는 다음과 같은 문제를 야기했습니다.
사용자가 Windows 업데이트를 미루면 최신 게임을 즐길 수 없음
개발자는 오래된 API를 계속 지원해야 함
새로운 GPU 하드웨어의 성능을 완전히 활용하지 못함
Agility SDK의 해결 방안
Agility SDK는 DirectX 12 런타임을 애플리케이션과 함께 배포하는 방식을 도입했습니다. 게임이나 애플리케이션이 실행될 때, 운영체제에 설치된 d3d12.dll 대신 애플리케이션 폴더에 포함된 최신 버전의 d3d12.dll을 우선 로딩합니다.
이를 통해 다음과 같은 이점을 얻을 수 있습니다.
사용자가 Windows를 업데이트하지 않아도 최신 DirectX 기능 사용 가능
개발자는 최신 API를 즉시 채택하여 개발 생산성 향상
GPU 제조사는 새로운 기능을 빠르게 게임에 적용할 수 있음
Agility SDK의 주요 기능
Agility SDK를 통해 사용할 수 있는 주요 기능들은 다음과 같습니다.
Mesh Shader: 정점 처리와 테셀레이션을 통합한 새로운 지오메트리 파이프라인
Sampler Feedback: 텍스처 샘플링 패턴을 분석하여 스트리밍 최적화
Enhanced Barriers: 리소스 상태 전환을 더 세밀하게 제어할 수 있는 개선된 배리어 시스템
Work Graphs: GPU 주도형 렌더링을 위한 새로운 프로그래밍 모델
DirectStorage: NVMe SSD에서 GPU로 데이터를 직접 전송하여 로딩 시간 단축
버전 관리와 호환성
Agility SDK는 버전 관리 시스템을 통해 API 안정성을 보장합니다. 각 버전은 고유한 SDK 버전 번호를 가지며, 애플리케이션은 코드에서 사용할 SDK 버전을 명시합니다.
extern "C" { __declspec(dllexport) extern const UINT D3D12SDKVersion = 610; } extern "C" { __declspec(dllexport) extern const char* D3D12SDKPath = ".\\D3D12\\"; }
C++
복사
이 코드는 애플리케이션이 SDK 버전 610을 사용하며, DLL 파일이 D3D12 폴더에 있음을 시스템에 알립니다. 런타임은 이 정보를 바탕으로 적절한 DLL을 로딩합니다.
배포 방식
Agility SDK를 사용하는 애플리케이션을 배포할 때는 다음 파일들을 포함해야 합니다.
D3D12\D3D12Core.dll: DirectX 12 핵심 런타임
D3D12\d3d12SDKLayers.dll: 디버그 레이어 (디버그 빌드용)
이 파일들은 실행 파일과 동일한 폴더 또는 지정된 서브 폴더에 위치해야 합니다. 게임 배포 시 이 파일들을 함께 포함하면 사용자의 Windows 버전과 무관하게 최신 DirectX 12 기능을 사용할 수 있습니다.

NuGet 설치 시 주의사항

NuGet 패키지를 사용할 때 몇 가지 주의해야 할 사항이 있습니다.
라이브러리 자동 링크
NuGet은 일반적으로 .lib 파일을 자동으로 프로젝트에 링크하지만, 헤더 파일 경로는 수동으로 설정해야 할 수 있습니다. 빌드 오류가 발생하면 프로젝트 속성에서 추가 포함 디렉터리를 확인하세요.
버전 호환성
여러 프로젝트가 서로 다른 버전의 DirectX 패키지를 참조하면 링크 오류가 발생할 수 있습니다. 솔루션 내 모든 프로젝트가 동일한 버전을 사용하도록 관리하세요.
플랫폼 타겟
NuGet 패키지는 x64, x86, ARM64 등 여러 플랫폼을 지원합니다. 프로젝트의 플랫폼 타겟과 일치하는 라이브러리가 자동으로 선택되므로, 빌드 구성을 정확히 설정해야 합니다.
디버그 레이어
Agility SDK의 디버그 레이어는 개발 중 API 오류를 감지하는 데 매우 유용합니다. 릴리즈 빌드에서는 성능 저하를 피하기 위해 디버그 레이어를 비활성화해야 합니다.

정리

NuGet을 통한 DirectX 12 설치는 현대적인 그래픽 프로그래밍의 필수 과정입니다. 핵심 내용을 정리하면 다음과 같습니다.
항목
설명
NuGet의 역할
DirectX 12 최신 헤더, 라이브러리, 개발 도구를 자동으로 설치하고 프로젝트에 통합합니다.
Agility SDK
운영체제 업데이트 없이 최신 GPU 기능을 사용할 수 있게 하는 런타임 배포 모델입니다.
설치 과정
NuGet 패키지 관리자에서 패키지 검색 및 설치 후 헤더 경로를 설정합니다.
주요 이점
최신 API 접근, 자동 프로젝트 구성, 개발 도구 통합, 크로스 플랫폼 지원을 제공합니다.
이러한 설정을 통해 DirectX 12의 모든 기능을 활용한 고성능 그래픽 애플리케이션을 개발할 수 있습니다.