비타Cpp

Direct3D의 초기화 - 1. 장치 생성(Create Device) 본문

DirectX12/튜토리얼

Direct3D의 초기화 - 1. 장치 생성(Create Device)

멍C 2021. 10. 1. 23:25

Direct3D 초기화는 Direct3D 12 장치(ID3D12Device)를 생성하는 것으로 시작한다. 장치(device)는 디스플레이 어댑터를 나타내는 객체이다. 일반적으로는 물리적인 그래픽 하드웨어 장치이지만, 이를 흉내 내는 소프트웨어 디스플레이 어댑터(WARP)도 존재한다. Direct3D12 장치는 기능 지원 점검에 쓰이며, 자원이나 뷰, 명령 목록 등의 다른 모든 Direct3D 인터페이스 객체들의 생성에도 쓰인다.


장치를 생성할 때에는 다음과 같은 함수를 사용한다.

HRESULT D3D12CreateDevice(
  IUnknown          *pAdapter,
  D3D_FEATURE_LEVEL MinimumFeatureLevel,
  REFIID            riid,	//ID3D12Device에 해당하는 ID를 넣어야함.
  void              **ppDevice
);

1. pAdapter: 장치가 나타내는 디스플레이 어댑터를 지정한다. 이 매개변수에 NULL 포인터를 지정하면 시스템의 기본 디스플레이 어댑터가 쓰인다. 

2. MinimumFeatureLevel: 응용 프로그램이 요구하는 최소 기능 수준. 만약 디스플레이 어댑터가 이 수준을 지원하지 않으면 장치 생성이 실패한다.

3. riid: 생성하고자 하는 ID3D12Device 인터페이스의 COM ID.

4. ppDevice: 생성된 장치가 이 매개변수에 설정된다.


이 함수의 호출의 예는 다음과 같다.

if defined(DEBUG) || defined(_DEBUG) 
	// D3D12 디버그층을 활성화한다.
{
	ComPtr<ID3D12Debug> debugController;
	ThrowIfFailed(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)));
	debugController->EnableDebugLayer();
}
#endif

	ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&mdxgiFactory)));

	// 하드웨어 어댑터를 나타내는 장치를 생성해 본다.
	HRESULT hardwareResult = D3D12CreateDevice(
		nullptr,             // default adapter
		D3D_FEATURE_LEVEL_11_0,
		IID_PPV_ARGS(&md3dDevice));

	// 실패했다면 WARP 어댑터를 나타내는 장치를 생성한다.
	if(FAILED(hardwareResult))
	{
		ComPtr<IDXGIAdapter> pWarpAdapter;
		ThrowIfFailed(mdxgiFactory->EnumWarpAdapter(IID_PPV_ARGS(&pWarpAdapter)));

		ThrowIfFailed(D3D12CreateDevice(
			pWarpAdapter.Get(),
			D3D_FEATURE_LEVEL_11_0,
			IID_PPV_ARGS(&md3dDevice)));
	}

첫 D3D12CreateDevice 호출이 실패하면 소프트웨어 어댑터인 WARP를 나타내는 장치를 생성한다. WARP는 Window Advanced Rasterization Platform의 약자이다. 

 

Comments