DirecX12 | Lecture 5. 장치 초기화 (인프런)
DirectX12 강의 5. 장치 초기화을 정리한 글입니다.
DirecX12 | Lecture 5. 장치 초기화 (인프런)
강의 정보 🎓
- 강의명: C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈 - Part2: 게임 수학과 DirectX12
- 플랫폼: 인프런
- 현재 섹션: Lecture 5 – 장치 초기화
- 주요 내용: DirectX 12 렌더링 파이프라인의 핵심 요소들을 구현하기 위한 초기 작업 단계를 거쳤다.
1. 프로젝트 구조 및 설정
- Client 프로젝트
- 출력 디렉터리:
$(SolutionDir)Output
- 출력 디렉터리:
- Engine 프로젝트
- 다음 주요 클래스 생성:
Engine
,Device
,SwapChain
,CommandQueue
,DescriptorHeap
- 다음 주요 클래스 생성:
2. 전역 객체 및 초기화
EnginePch.h
WindowInfo
구조체 정의extern std::unique_ptr<class Engine> gEngine;
선언※ 전방 선언 방식 확인 필요
→ 전방 선언을 활용할 것으로 결정
EnginePch.cpp
std::unique_ptr<Engine> GEngine;
정의- ※ 추후 싱글톤 패턴으로 전환 예정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Engine
{
public:
static Engine& GetInstance();
...
private:
Engine() {}
~Engine() {}
Engine(const Engine&) = delete; // 복사 방지
Engine& operator=(const Engine&) = delete; // 복사 대입 연산자 금지
...
};
Engine
클래스Init()
,ResizeWindow()
함수 구현
3. Device 클래스 세부 구성
- COM 객체 추가
ID3D12Debug6
,IDXGIFactory4
,ID3D12Device
등 일부 상위 버전 사용DXGIFactory
생성 시CreateDXGIFactory2
로 변경
디바이스 생성
1
::D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_12_0, IID_PPV_ARGS(&mDevice));
D3D_FEATURE_LEVEL_12_0
을 사용하여 하드웨어 최소 요구 수준 설정
4. CommandQueue 클래스
- 초기화 및 렌더링 함수 작성
RenderBegin()
,RenderEnd()
구현
- 레퍼런스 vs 포인터
Viewport
,ScissorRect
는 포인터 대신 레퍼런스 전달 방식 고려
5. SwapChain 클래스
- 상위 버전의 API 사용
IDXGIFactory4::CreateSwapChainForHwnd()
로 변경IDXGISwapChain3
사용
- 설정 및 주의점
EnginePch.h
에 스왑 체인 버퍼 개수 enum 정의 → enum 지양 및 상수로 표현DXGI_SWAP_CHAIN_DESC1
와 같은 구조체 명시적 초기화 습관 강조!- MSAA 비활성화 상태 확인
6. DescriptorHeap 클래스
- RTV/DSV/SRV 등의 리소스 바인딩에 사용될 힙 생성
- 아직 기본적인 구조 작성 단계
7. Engine의 Render 함수
RenderBegin()
,RenderEnd()
내부에서CommandQueue
호출- 현재 렌더링 로직의 베이스 구성 단계
참고
- CD3DX12_RECT
D3D12_RECT
를 감싼 헬퍼 구조체 (d3dx12.h
에 정의)
- COM (Component Object Model)
- DirectX가 사용하는 객체 지향 인터페이스 모델
ComPtr
은 이를 RAII 방식으로 관리하는 스마트 포인터 (메모리 누수 방지)
- ComPtr과 스마트 포인터 규칙
ComPtr
은const &
로 넘김shared_ptr
도const std::shared_ptr<T>&
방식 사용 (외부 소유권 유지 주의)
요약 및 느낀점 📝
- Engine 프로젝트에는 Device, CommandQueue, SwapChain, DescriptorHeap과 같은 기본 API들이 만들어진다.
- 수업을 따라가면서 함수 버젼이라던지 싱글톤을 적용하는 등의 리펙토링을 조금 하였다.
느낀점 💡 이전에는 하나 하나씩 신경쓰면서 구현하지는 않아서 그런지 하나씩 살펴보면 신경쓰이는 부분들이 꽤 있었다. 특히 컨벤션을 만들어서 그에 맞게 수정하는 과정도 섞이다보니 시간을 공들일 필요가 있었다. 수정하는 과정에서 구조체를 초기화하지 않아서 오류가 나는 문제도 겪었고 사소한 것에도 신경 쓸 수 있는 개발자가 되어야 겠다는 생각이 들었다.
프로젝트 상태 💾
< 실행 시 다음과 같은 윈도우 창이 뜬다 >
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.