fwadrogic tek

主にプログラミングや開発ログなどを中心にお送りします

DirectX11のチュートリアルサイトでつまづいたこと

RasterTek(http://www.rastertek.com/tutdx11.html)というDirectX11を学ぶのに良さそうなサイトがあったので、つまづいたところをメモ。

Could not initialize Direct3Dと表示されてしまう。

これは今自分が使ってるグラフィックボードがDirectX11に対応していないため。
http://pc.watch.impress.co.jp/docs/topic/spec/gpu_spec.html
ここを見ると最低でもGeForce GT 430/Radeon HD 5450クラスのボードが必要みたいです(;´Д`)
というわけで解決法その一。

CPUに処理してもらう。

d3dclass.cppの205行目付近にデバイスとスワップチェインを作成するところがあります。以下のコードを見てください

// Create the swap chain, Direct3D device, and Direct3D device context.
	result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &featureLevel, 1, 
					       D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
	if(FAILED(result))
	{
		return false;
	}

D3D11CreateDeviceAndSwapChain()関数の第2引数をD3D_DRIVER_TYPE_REFERENCEにすると、すべての描画処理をCPUに託すことができます。(参考:http://www.gamedev.net/topic/635168-could-not-initialize-direct3d/)

// Create the swap chain, Direct3D device, and Direct3D device context.
	result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_REFERENCE, NULL, 0, &featureLevel, 1, 
					       D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
	if(FAILED(result))
	{
		return false;
	}

ただし、このモードにすると処理速度が1000分の1くらいまでガタ落ちするんですね。。。そこでDirectX10.1までの機能制限付きでもっと高速にする方法が次。

WARPデバイスを作る。

// Create the swap chain, Direct3D device, and Direct3D device context.
	result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_WARP, NULL, 0, &featureLevel, 1, 
					       D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
	if(FAILED(result))
	{
		return false;
	}

第2引数をD3D_DRIVER_TYPE_WARPに変えるだけです。ちなみに僕はこれを解消するだけで丸1日かかりました\(^o^)/
参考: http://wlog.flatlib.jp/item/1220