DirectX9 でのフルスクリーンのサンプルはそこそこ見かけるのですが、DirectX9Ex でのフルスクリーンのサンプルってほとんど見かけないので作ってみました。通常の DirectX9 とほとんど同じで、違う箇所は初期化のところだけだったのでその部分だけを本記事では紹介したいと思います。
DirectX9Exの初期化
Direct3DCreate9 の代わりに Direct3DCreate9Ex を使用します。引数がちょっと変わっています。
そして定番の D3DPRESENT_PARAMETERS を設定します。本来はもうちょっとモニタの設定とか確認したりエラーチェック入れたりする必要があるのですが、サンプルなので省略してます。
Direct3DCreate9Ex( D3D_SDK_VERSION, &g_pD3D9 ); if( !g_pD3D9 ) { return; } DWORD flag = D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE; D3DPRESENT_PARAMETERS d3dpp = { 0 }; d3dpp .BackBufferCount = 3; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight= WINDOW_HEIGHT; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.Windowed = FALSE; if( d3dpp.Windowed == FALSE ) { d3dpp.FullScreen_RefreshRateInHz = 60; }
ここでのポイントは特にないと思います。続いて CreateDeviceEx を呼び出してデバイスを作成するのですが、こちらの方には気をつけるポイントが存在します。まずはコードを示します。
D3DDISPLAYMODEEX dm; dm.Format = D3DFMT_X8R8G8B8; dm.Height = WINDOW_HEIGHT; dm.Width = WINDOW_WIDTH; dm.ScanLineOrdering = D3DSCANLINEORDERING_PROGRESSIVE; dm.RefreshRate = 60; dm.Size = sizeof(dm); HRESULT hr = S_OK; if( d3dpp.Windowed == TRUE ) { hr = g_pD3D9->CreateDeviceEx( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, flag, &d3dpp, NULL, &g_pDevice ); } else { hr = g_pD3D9->CreateDeviceEx( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, flag, &d3dpp, &dm, &g_pDevice ); }
ポイントとは、Windowモードの時には D3DDISPLAYMODEEX を設定してはならない点、フルスクリーンのときには設定が必須となる点が1つです。もう1つは D3DPRESENT_PARAMETERS のリフレッシュレート設定と DISPLAYMODEEX のリフレッシュ設定を同じにしなくてはならない点です。適当にゼロを入れておくのでは関数が失敗となります。
この関数が成功したらあとは通常の DirectX9 と変わらないです。
今回は不遇の扱いをされているDirectX9Ex のしかもほとんど情報がなさそうなフルスクリーンをやってみました。通常の DirectX9 と違い DirectX9Ex ではデバイスロストの問題も発生しないですし、割と使いやすいものだと思います。 Vista 以降を必須とする点はちょっとマイナスかもしれませんが、毛嫌いするほど出来が悪いとも思えないんですよね~
コメント