Device
- DirectX에서 Device Class는 각종 디스플레이 관련 객체를 생성한다.
- 현실로 치면 인력사무소 느낌
class Device
{
public:
void Init();
ComPtr<IDXGIFactory> GetDXGI() { return _dxgi; }
ComPtr<ID3D12Device> GetDevice() { return _device; }
private:
// direct x 는 gpu를 제어하고 프로그래밍할 때 쓰이는 저수준 그래픽 API
// -> 우리는 direct x에 집중하고 마쏘와 제조사가 알아서 만든다.
// COM(Component Object Model)
// - DX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 하는 기술
// - COM 객체(COM 인터페이스)를 사용. 세부사항은 우리한테 숨겨짐
// - ComPtr 일종의 스마트 포인터
// - GPU접근 시 ComPtr을 사용함
ComPtr<ID3D12Debug> _debugController;
ComPtr<IDXGIFactory> _dxgi; // 화면 관련 기능들 (출력..)
ComPtr<ID3D12Device> _device; // 각종 객체 생성
};
void Device::Init()
{
#ifdef _DEBUG
::D3D12GetDebugInterface(IID_PPV_ARGS(&_debugController));
_debugController->EnableDebugLayer();
#endif
::CreateDXGIFactory(IID_PPV_ARGS(&_dxgi));
::D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&_device));
}
DXGI(DirectX Graphics Infrastructure)
ComPtr<IDXGIFactory> _dxgi;
- Device를 생성하기 위해서는 IDXGIFactory라는 COM객체가 필요하다.
- DXGI란?
- Direct3D와 함께 쓰이는 API이다
- 전체 화면 모드 전환
- 지원 되는 디스플레이 모드 열거
- 스왑 체인 생성 등
- 저 수준 작업들을 관리한다.
::CreateDXGIFactory(IID_PPV_ARGS(&_dxgi));
- IDXGIFactory란?
- 어댑터(비디오 카드), 출력장치(모니터), 디바이스(그래픽카드)를 포함하는 COM객체
- IDXGIFactory를 생성하여 위 기능을 수행할 수 있도록 한다.
- 첫번째 인자로 rrid(디바이스의 COM ID), 두번째 인자로 ppDevice(주소).
- 위 코드는 IID_PPV_ARGS을 통해 확장하여 사용
Device
ComPtr<ID3D12Device> _device;
::D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&_device));
- Device를 생성하는 함수이다.
- device = 디스플레이 어댑터(그래픽 카드)를 나타내는 객체
- pAdapter : nullptr 지정하면 시스템 기본 디스플레이 어댑터
- MinimumFeatureLevel : 응용 프로그램이 요구하는 최소 기능 수준 (위 코드는 D3D_FEATURE_LEVEL_11_0를 지원하는 그래픽카드부터 가능하다고 제약을 걸고있다.)
- riid : 디바이스의 COM ID
- ppDevice : 생성된 장치가 매개변수에 설정
- 위 코드는 IID_PPV_ARGS을 통해 확장하여 사용