포스트

DirecX12 | Lecture 5. 장치 초기화 (인프런)

DirectX12 강의 5. 장치 초기화을 정리한 글입니다.

DirecX12 | Lecture 5. 장치 초기화 (인프런)

강의 정보 🎓


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과 스마트 포인터 규칙
    • ComPtrconst &로 넘김
    • shared_ptrconst std::shared_ptr<T>& 방식 사용 (외부 소유권 유지 주의)

요약 및 느낀점 📝

  • Engine 프로젝트에는 Device, CommandQueue, SwapChain, DescriptorHeap과 같은 기본 API들이 만들어진다.
  • 수업을 따라가면서 함수 버젼이라던지 싱글톤을 적용하는 등의 리펙토링을 조금 하였다.

    느낀점 💡 이전에는 하나 하나씩 신경쓰면서 구현하지는 않아서 그런지 하나씩 살펴보면 신경쓰이는 부분들이 꽤 있었다. 특히 컨벤션을 만들어서 그에 맞게 수정하는 과정도 섞이다보니 시간을 공들일 필요가 있었다. 수정하는 과정에서 구조체를 초기화하지 않아서 오류가 나는 문제도 겪었고 사소한 것에도 신경 쓸 수 있는 개발자가 되어야 겠다는 생각이 들었다.

프로젝트 상태 💾

< 실행 시 다음과 같은 윈도우 창이 뜬다 >

< 실행 시 다음과 같은 윈도우 창이 뜬다 >

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.