C++ Algorithm & Study/Game Math & DirectX 11

[Direct11] 2. Direct3D initialization

GameChoi 2023. 6. 12. 17:49

1. Direct3D

1.1 Direct3D initialization

1.1.1 Device & Device Context Create

 - Direct3D의 주된 인터페이스로 물리적인 그래픽 장치 하드웨어에 대한 소프트웨어 제어기

   - 응용 프로그램은 이 인터페이스들을 통해 하드웨어에게 할 일을 지시

     - GPU 메모리 자원 할당, Back Buffer 지우기, 자원을 여러 파이프라인 단계에 묶기, 기하구조 그리기 등

ComPtr<ID3D11Device> _device; ComPtr<ID3D11DeviceContext> _deviceContext;

 - Device Interface  기능 지원 점검과 자원 할당

 - Device Context Interface → 렌더 대상을 결정, 자원을 그래픽 파이브라인에 묶고 GPU가 수행할 렌더링 명령 지시

1.1.2 Swap Chain Setting & Create

 - Device를 초기화 한 후 Swap Chain을 생성하기 위해 DXGI_SWAP_CHAIN_DESC 구조체 인스턴스를 만듦

   - 만든 구조체 인스턴스를 이용하여 특성 설정

ComPtr<IDXGISwapChain> _swapChain;

 - 위에서 생성한 구조체를 이용하여 함수를 호출하여 Swap Chain Interface 생성

1.1.3 Render Target View

 - 자원을 파이프라인의 단계에서 직접 묶는 것이 아닌 자원에 대한 View를 생성하고 그 View를 묶어야 함

   - Back Buffer를 OM단계에서 묶으려면 Back Buffer에 대한 Render Target View를 생성

ComPtr<ID3D11RenderTargetView> _renderTargetView;

1.1.4 Depth & Stencil Buffer, View

 - Depth Buffer는 깊이 정보를 담는 2차원 Texture, Stencil Buffer 또한 스텐실 정보를 담는 2차원 Texture

   - 2차원 Texture를 생성할 때 사용하는 구조체를 채우고 함수를 호출해 Texture 생성

ComPtr<ID3D11Texture2D> _depthStencilBuffer;

 - Depth & Stencil View를 사용하기 위해 파이프라인에 붙임

   - Back Buffer에서 사용한 방식 그대로 Render Target View를 이용하여 View 생성

    - Texture에 초기 자료를 가르키는 포인터는 Depth & Stencil Buffer로 사용할 것이므로 채울 필요X

      - 깊이 버퍼링 및 스텐실 연산을 수행할 때는 Direct3D가 직접 Depth & Stencil Buffer를 기록

ComPtr<ID3D11DepthStencilView>  _depthStencilView;

 - 위의 방식을 통해 Depth & Stencil Buffer, View를 생성하였으므로 OM 단계에 묶음

_deviceContext->OMSetRenderTargets(1, _renderTargetView.GetAddressOf(), _depthStencilView.Get());

1.1.5 Viewport

 - 3차원 장면을 Back Buffer 전체에 그리지만 일부를 차지하는 직사각형 영역에만 그리는 것도 가능

   - 장면을 그려 넣고자 하는 Back Buffer의 부분 직사각형 영역을 Viewport

     - 원하는 구조체를 생성한 후 함수를 이용하여 Direct3D에게 Viewport를 알림 (RSSetViewports)

D3D11_VIEWPORT _viewport;

 - 2인용 모드를 위해 화면을 분할하는 경우

   - 화면 왼쪽 절반을 위한 Viewport & 화면 오른쪽 절반을 위한 Viewport 생성

     - 플레이어 2명의 관점에서 보는 장면을 Viewport에 그림

 - 또한 인터페이스로도 사용할 수 있음