D3D12 기반 비행 데모


개요

이 프로젝트는 C++로 작성된 학습용 3D 비행 데모로, DirectX 12 그래픽스 API를 사용합니다. D3D12 렌더링 파이프라인의 CPU 측 설정을 학습하는데 중점을 둔 실습 예제입니다. 또한, 동작 명령 대기열씬 스택 관리 같은 게임 시스템 설계 패턴도 구현하고 있습니다.

저장소 보기


D3D12 렌더링 파이프라인의 CPU 측 단계별 구성

DirectX 12 렌더링 파이프라인의 CPU 측 설정 및 실행 과정을 다루며, 디바이스 초기화부터 렌더링까지다섯 가지 핵심 단계로 구성됩니다.

⚠️ 참고: GPU 파이프라인의 셰이딩이나 래스터화 같은 내부 단계는 구체적으로 설명하지 않습니다.

초기화의 1~5단계는 Game::Initialize()에서 단 한번 실행됩니다.

bool Game::Initialize()
{
    // 1. 디바이스 초기화
    if (!D3DApp::Initialize()) 
	    return false;   
        
	// 2. 그래픽스 파이프라인 설정
	BuildRootSignature();
	BuildShadersAndInputLayout();
	BuildPSOs();
 
	// 3. 리소스 에셋 설정
	LoadTextures();
	BuildMaterials();
	BuildDescriptorHeaps();
 
	// 4. 기하 정보 및 정점 버퍼 설정
	BuildShapeGeometry();
 
	// 5. 프레임 리소스 설정
	BuildFrameResources();
    
    /* 코드 간결성을 위해 생략된 부분이 있습니다. */
    
    return true;
}


1 단계 - 디바이스 초기화

  • D3D12 디바이스란?

    • D3D12 디바이스는 프로그램과 GPU 사이의 핵심 인터페이스입니다. D3D12에서 모든 GPU 관련 작업을 관리하며, 주요 역할은 다음과 같습니다:
      • 버퍼, 텍스처 등 GPU 리소스 생성
      • 설명자 힙과 명령 객체 관리
      • 렌더링 과정을 관리하고 하드웨어 기능을 점검
  • 핵심 함수

    • bool D3DApp::InitDirect3D():
      • D3DApp::Initialize()에서 한번만 호출됩니다. 그래픽 디바이스를 생성하고 GPU와 통신을 설정합니다. 최적의 그래픽 어댑터를 선택하며, GPU 리소스 접근에 사용되는 설명자 크기나 안티앨리어싱을 위한 멀티샘플링 지원 같은 디바이스 리소스를 초기화합니다.

2 단계 - 그래픽스 파이프라인 설정

  • 어떤 단계인가?

    • 이 단계에서는 GPU 파이프라인을 구성하여 렌더링 방식을 정의합니다. 루트 서명을 준비하고, 셰이더 코드를 컴파일하며, 파이프라인 상태 객체를 생성합니다.
  • 핵심 함수들


3 단계 - 리소스 에셋 설정

  • 어떤 단계인가?

    • 이 단계에서는 렌더링에 필요한 리소스를 준비하는 과정입니다. 텍스처 정보를 불러오고, 재질 속성을 정의하며, 셰이더가 해당 리소스에 접근할 수 있도록 설명자 힙을 구성합니다.
  • 핵심 함수들


4 단계 - 기하 정보 및 정점 버퍼 설정

  • 어떤 단계인가?

    • 이 단계에서는 렌더링할 메쉬도형을 생성하고, GPU가 사용할 정점 버퍼인덱스 버퍼를 생성합니다.
  • 핵심 함수

    • void Game::BuildShapeGeometry():
      • 기하 정보(정점, 인덱스)를 생성하고 GPU 버퍼를 만들며 렌더링을 위한 호출 매개변수를 구성합니다.

5 단계 - 프레임 리소스 설정

  • 어떤 단계인가?

    • 이 단계에서는 각 프레임마다 상수 버퍼명령 할당자를 저장할 메모리 구조를 준비하여, CPU와 GPU가 프레임 단위로 동기화할 수 있도록 지원합니다.
  • 핵심 함수

    • void Game::BuildFrameResources():
      • GPU가 현재 프레임을 처리하는 동안 CPU가 다음 프레임을 준비할 수 있게, 각 프레임에 필요한 리소스 집합(예: 상수버퍼와 커맨드 할당자)을 할당합니다.

맺는 말

이 프로젝트는 핵심 DirectX 12 개념을 명확하고 단계적인 파이프라인 설정을 통해 적용합니다. 렌더링을 넘어 동작 명령 대기열씬 스택 관리같은 시스템을 적용하여, C++ 기반의 확장 가능한 3D 애플리케이션을 체계적으로 구축 및 구현했습니다. 또한, 저레벨 그래픽스 프로그래밍과 엔진 아키텍쳐 설계에 입문하는 출발점이 되는 프로젝트였습니다.