フル スクリーン モードをサポートする Direct3D 10/11 アプリケーションを作成しようとしています。そのためには、利用可能なビデオ モードのリストをユーザーに提供する必要があります。また、ビデオ モードの変更を最小限に抑えるために、現在のデスクトップ設定をデフォルトのビデオ モードとして選択するとよいでしょう。
Direct3D 9 でそれを行うのは非常に簡単でした。たとえば、Direct3D 9 で提供される私のモード リストは次のとおりです。
Current mode: 1920x1080x60Hz 32bit X8R8G8B8
Available modes:
Front buffer format 32bit X8R8G8B8: 35
1: 1920x1080x60Hz
2: 640x480x60Hz
3: 640x480x72Hz
4: 640x480x75Hz
5: 720x480x56Hz
6: 720x480x60Hz
7: 720x480x72Hz
8: 720x480x75Hz
9: 720x576x56Hz
10: 720x576x60Hz
11: 720x576x72Hz
12: 720x576x75Hz
13: 800x600x56Hz
14: 800x600x60Hz
15: 800x600x72Hz
16: 800x600x75Hz
17: 1024x768x60Hz
18: 1024x768x70Hz
19: 1024x768x75Hz
20: 1152x864x75Hz
21: 1280x720x60Hz
22: 1280x768x60Hz
23: 1280x800x60Hz
24: 1280x960x60Hz
25: 1280x1024x60Hz
26: 1280x1024x75Hz
27: 1360x768x60Hz
28: 1366x768x60Hz
29: 1600x900x59Hz
30: 1600x900x60Hz
31: 1600x1024x59Hz
32: 1600x1024x60Hz
33: 1680x1050x59Hz
34: 1680x1050x60Hz
35: 1440x900x60Hz
しかし、同じ単純なことを DXGI で行うのは少し複雑です。私を最も混乱させたのは、IDXGIOutpit.GetDisplayModeListメソッドが同じビデオ モードの最大 3 つのコピーを返すという事実です。違いは、提供されるスケーリング モードにあります。
DXGI_MODE_SCALING_UNSPECIFIED = 0
DXGI_MODE_SCALING_CENTERED = 1
DXGI_MODE_SCALING_STRETCHED = 2
ここにあります:
List of modes for format 32bit R8G8B8A8 UNorm:
640x480x60Hz Progressive Unspecified
640x480x72Hz Progressive Unspecified
640x480x75Hz Progressive Unspecified
720x480x56Hz Progressive Unspecified
720x480x56Hz Progressive Centered
720x480x56Hz Progressive Stretched
720x480x60Hz Progressive Unspecified
720x480x60Hz Progressive Centered
720x480x60Hz Progressive Stretched
720x480x72Hz Progressive Unspecified
720x480x72Hz Progressive Centered
720x480x72Hz Progressive Stretched
720x480x75Hz Progressive Unspecified
720x480x75Hz Progressive Centered
720x480x75Hz Progressive Stretched
720x576x56Hz Progressive Unspecified
720x576x56Hz Progressive Centered
720x576x56Hz Progressive Stretched
720x576x60Hz Progressive Unspecified
720x576x60Hz Progressive Centered
720x576x60Hz Progressive Stretched
720x576x72Hz Progressive Unspecified
720x576x72Hz Progressive Centered
720x576x72Hz Progressive Stretched
720x576x75Hz Progressive Unspecified
720x576x75Hz Progressive Centered
720x576x75Hz Progressive Stretched
800x600x56Hz Progressive Unspecified
800x600x60Hz Progressive Unspecified
800x600x72Hz Progressive Unspecified
800x600x75Hz Progressive Unspecified
1024x768x60Hz Progressive Unspecified
1024x768x70Hz Progressive Unspecified
1024x768x75Hz Progressive Unspecified
1152x864x75Hz Progressive Unspecified
1280x720x60Hz Progressive Unspecified
1280x768x59Hz Progressive Unspecified
1280x768x59Hz Progressive Centered
1280x768x59Hz Progressive Stretched
1280x800x59Hz Progressive Unspecified
1280x960x60Hz Progressive Unspecified
1280x1024x60Hz Progressive Unspecified
1280x1024x75Hz Progressive Unspecified
1360x768x59Hz Progressive Unspecified
1360x768x59Hz Progressive Centered
1360x768x59Hz Progressive Stretched
1366x768x59Hz Progressive Unspecified
1366x768x59Hz Progressive Centered
1366x768x59Hz Progressive Stretched
1440x900x59Hz Progressive Unspecified
1600x900x59Hz Progressive Unspecified
1600x900x59Hz Progressive Centered
1600x900x59Hz Progressive Stretched
1600x1024x59Hz Progressive Unspecified
1600x1024x59Hz Progressive Centered
1600x1024x59Hz Progressive Stretched
1680x1050x59Hz Progressive Unspecified
1920x1080x60Hz Progressive Unspecified
最初に私が考えたのは、DXGI_MODE_SCALING_STRETCHED = このモードにはストレッチが必要である (バック バッファーが小さい、次にフロント バッファー、解像度が物理的ではない可能性がある)、DXGI_MODE_SCALING_CENTERED = このモードでは画像が画面全体を占有しない可能性がある (バック バッファーが小さい、次にフロント バッファー、ただし、物理解像度は保持されます)、DXGI_MODE_SCALING_UNSPECIFIED = "通常モード" (バック バッファーとフロント バッファーのサイズは一致しますが、物理解像度は保証されません)。つまり、Scaling = DXGI_MODE_SCALING_UNSPECIFIED を持つモードのみを一覧表示する必要があります。
しかし、その後、現在のモードを特定しようとしました。MSDN によると、IDXGIOutput.FindClosestMatchingModeメソッドを使用する場合、いずれかのパラメーターを指定しない場合、このメソッドは現在のデスクトップ設定に引き寄せられ、設定されているパラメーターに優先順位を付け、何らかの優先順位 (ScanlineOrdering>Scaling>Format> を使用) を使用します。 Resolution>RefreshRate) を選択して、他のものを選択します。そこで、デバイスを作成し (フォーマットを DXGI_FORMAT_UNKNOWN として指定できるようにするため)、完全に未決定のモードをこのメソッドに渡しました (Scaling = DXGI_MODE_SCALING_UNSPECIFIED を含む)。
結果は次のとおりです。
Suggested mode: 32bit B8G8R8A8 UNorm 1600x1024x59Hz Progressive Stretched
Suggested mode 1.1: 32bit B8G8R8A8 UNorm 1600x1024x59Hz Progressive Stretched Mono
ご覧のとおり、現在のデスクトップ モードである 1920x1080x60Hz と一致しません。現在のデスクトップ モードを別のモードに変更しようとしたところ、IDXGIOutput.FindClosestMatchingModeは、デスクトップ パラメータに近いパラメータを使用して最も近い利用可能なモードを選択する傾向があることがわかりましたが、Scaling = DXGI_MODE_SCALING_STRETCHED では、指定された Scaling = DXGI_MODE_SCALING_UNSPECIFIED を単に無視します。自分。
Current mode: 32bit B8G8R8A8 UNorm 1024x768x75Hz Progressive Unspecified
Suggested mode: 32bit B8G8R8A8 UNorm 1280x768x59Hz Progressive Stretched
Suggested mode 1.1: 32bit B8G8R8A8 UNorm 1280x768x59Hz Progressive Stretched Mono
これにより、DXGI_MODE_SCALING_UNSPECIFIED は、少なくともIDXGIFactory.CreateSwapChainメソッドの Scaling パラメーターの無効な値として扱われるという驚くべき結論に至りました (それ以外の場合、モードを選択するために使用されるIDXGIOutput.FindClosestMatchingModeは、ほとんどの場合IDXGIFactory.CreateSwapChainに提供されます)。 、1920x1080x60Hzの選択を拒否しますか?)。
IDXGIFactory.CreateSwapChainは、 IDXGIOutput.FindClosestMatchingModeを内部的に呼び出して、使用する「物理」モードを決定していると思います。しかし、それはどういう意味ですか? Scaling = DXGI_MODE_SCALING_CENTERED または DXGI_MODE_SCALING_STRETCHED を持たないモードをユーザーに提供することはできません。このモードは「物理的な」モードではないためです。つまり、IDXGIFactory.CreateSwapChainはとにかく他のモードを選択しますか?
しかし、なぜ DXGI_MODE_SCALING_UNSPECIFIED が利用可能なモードのリストに返されるのでしょうか? IDXGIFactory.CreateSwapChainメソッドを呼び出してイメージを中央に配置するかスケーリングするかを指定するときにのみ Scaling パラメーターを使用する場合、指定されたモードが「物理的な」モードと一致せず、 IDXGISwapChain.ResizeTargetを呼び出すときに使用されない場合、このメソッドは「物理」モードのみの場合、スケーリング パラメーターがIDXGIOutpit.GetDisplayModeListによって返される 1 つのリストに混在するのはなぜですか?
ユーザーにどのモードを表示する必要がありますか? スケーリング <> DXGI_MODE_SCALING_UNSPECIFIED を持つもののみ? それとも逆のことをするべきですか?従来の Win API を使用する代わりに、DXGI 自体を介して現在のモードを決定する方法は?
誰かが私にそれを説明できますか?MSDN でそれについて明確にされているものはありません。