Nanashi-softプログラマ専用DirectX11開発


◇DirectX11プログラミング -MSAAを有効にする-

ふとサンプルソース中にMSAAと言う記述を見かけた
MSAAはマルチサンプル・アンチエイリアシングのことで,要は画像を滑らかにする処理
ショボいシェーダーしかよう作らない私には,ぜひ欲しい機能です

CheckMultisampleQualityLevelsでそのパソコンのビデオカード能力を調べて,スワップチェインを作成する
ふむふむ('-'*)
……ん? いやいや,それ矛盾してるから(汗

D3D11CreateDeviceAndSwapChainで,デバイスとスワップチェインを生成する
CheckMultisampleQualityLevelsには,そのデバイスが必要(ぉ

D3D11CreateDeviceAndSwapChain使うには,CheckMultisampleQualityLevelsが必要で,
CheckMultisampleQualityLevels使うには,D3D11CreateDeviceAndSwapChainが必要
まさに,鶏が先か,卵が先か,状態(*'-')

一番簡単な方法は,D3D11CreateDeviceAndSwapChainじゃなくて,昔の D3D11CreateDeviceでデバイス生成して,CreateSwapChainでスワップチェイン生成する方法を使う
じゃあなんで,同時生成の APIなんて作ったんだよ!
そうしろみたいなニュアンスが,MSNのマニュアルに書いてあります(汗

後から変更する方法があるのかも知れませんが,生成直後に変更するなら最初からそれで作るべきでしょうし

昔のソースはその方法でやっていたので,引っ張り出してきて置き換えました
	//デバイスの生成
HRESULT hr;
ID3D11Device* hpDevice = NULL;
ID3D11DeviceContext* hpDeviceContext = NULL;
hr = D3D11CreateDevice(
NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
0,
NULL,
0,
D3D11_SDK_VERSION,
&hpDevice,
NULL,
&hpDeviceContext);
if(FAILED(hr)){
MessageBoxW(hWnd, L"D3D11CreateDevice", L"Err", MB_ICONSTOP);
goto End;
}

//使用可能なMSAAを取得
DXGI_SAMPLE_DESC MSAA;
for(int i=0; i <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; i++){
UINT Quality;
if SUCCEEDED(hpDevice->CheckMultisampleQualityLevels(DXGI_FORMAT_D24_UNORM_S8_UINT, i, &Quality)){
if(0 < Quality){
MSAA.Count = i;
MSAA.Quality = Quality - 1;
}
}
}

//インターフェース取得
IDXGIDevice1* hpDXGI = NULL;
if(FAILED(hpDevice->QueryInterface(__uuidof(IDXGIDevice1), (void**)&hpDXGI))){
MessageBoxW(hWnd, L"QueryInterface", L"Err", MB_ICONSTOP);
goto End;
}

//アダプター取得
IDXGIAdapter* hpAdapter = NULL;
if(FAILED(hpDXGI->GetAdapter(&hpAdapter))){
MessageBoxW(hWnd, L"GetAdapter", L"Err", MB_ICONSTOP);
goto End;
}

//ファクトリー取得
IDXGIFactory* hpDXGIFactory = NULL;
hpAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&hpDXGIFactory);
if(hpDXGIFactory == NULL){
MessageBoxW(hWnd, L"GetParent", L"Err", MB_ICONSTOP);
goto End;
}

//スワップチェイン作成
IDXGISwapChain* hpDXGISwpChain = NULL;
DXGI_SWAP_CHAIN_DESC hDXGISwapChainDesc;
hDXGISwapChainDesc.BufferDesc.Width = 1980;
hDXGISwapChainDesc.BufferDesc.Height = 1080;
hDXGISwapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
hDXGISwapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
hDXGISwapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
hDXGISwapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
hDXGISwapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
hDXGISwapChainDesc.SampleDesc = MSAA;
hDXGISwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
hDXGISwapChainDesc.BufferCount = 1;
hDXGISwapChainDesc.OutputWindow = hWnd;
hDXGISwapChainDesc.Windowed = TRUE;
hDXGISwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
hDXGISwapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
if(FAILED(hpDXGIFactory->CreateSwapChain(hpDevice, &hDXGISwapChainDesc, &hpDXGISwpChain))){
MessageBoxW(hWnd, L"CreateSwapChain", L"Err", MB_ICONSTOP);
goto End;
}

上が適用前,下が適用後です
クオリティの差は一目瞭然です('-'*)


TOPプログラマ専用DirectX11開発

Melonbooks DL