DirectX 11 API への DirectX 9 の機能のマッピング
Direct3D 9 ゲームで使う機能が Direct3D 11 とユニバーサル Windows プラットフォーム (UWP) にどのように変換されるかについて説明します。
DirectX 移植の計画および Direct3D 9 から Direct3D 11 への重要な変更点に関する記事も参照してください。
DirectX 11 API への Direct3D 9 のマッピング
Direct3D はこれまでと同じく DirectX グラフィックスの土台ですが、API は DirectX 9 以降変更されています。
- Microsoft DirectX Graphic Infrastructure (DXGI) はグラフィックス アダプターを設定するために使われます。 バッファー形式の選択、スワップ チェーンの作成、フレームの表示、共有リソースの作成には DXGI を使います。 「DXGI の概要」をご覧ください。
- Direct3D のデバイス コンテキストは、パイプラインの状態を設定し、レンダリング コマンドを生成するために使われます。 ほとんどのサンプルではイミディエイト コンテキストを使ってデバイスに直接レンダリングしていますが、Direct3D 11 ではマルチスレッド レンダリングもサポートされており、その場合は遅延コンテキストが使われます。 「Direct3D 11 のデバイスについて」をご覧ください。
- 一部の機能は非推奨になっていますが、特に固定関数パイプラインが推奨されなくなりました。 「推奨されなくなった機能」をご覧ください。
Direct3D 11 の機能の完全な一覧については、「Direct3D 11 の機能」と「Direct3D 11 の機能」をご覧ください。
Direct2D 9 から Direct2D 11 への移行
Direct2D (Windows) は、これまでどおり DirectX グラフィックスと Windows の重要な一部です。 これまでどおり Direct2D を使って 2D ゲームを描画したり、Direct3D の上にオーバーレイ (HUD) を描画したりできます。
Direct2D は Direct3D の上で実行されます。2D ゲームは API を使って実装できます。 たとえば、Direct3D を使って実装される 2D ゲームでは、正投影を使ったり、Z 値を設定してプリミティブの描画の順序を制御したり、ピクセル シェーダーを使って特殊効果を追加したりできます。
Direct2D は Direct3D に基づいているため、DXGI とデバイス コンテキストも使います。 「Direct2D API の概要」をご覧ください。
DirectWrite API は、Direct2D を使って書式付きテキストのサポートを追加します。 「DirectWrite の紹介」をご覧ください。
推奨されなくなったヘルパー ライブラリの置き換え
D3DX と DXUT は推奨されなくなったため、UWP ゲームでは使うことができません。 これらのヘルパー ライブラリでは、テクスチャの読み込みやメッシュの読み込みなどのタスク用にリソースが提供されていました。
- 「チュートリアル: DirectX 11 とユニバーサル Windows プラットフォーム (UWP) への簡単な Direct3D 9 アプリの移植」では、ウィンドウの設定、Direct3D の初期化、基本的な 3D レンダリングの方法を示します。
- 「DirectX を使った単純なユニバーサル Windows プラットフォーム (UWP) ゲームの作成」では、グラフィックス、ファイルの読み込み、UI、コントロール、サウンドなど、一般的なゲーム プログラミング タスクを示します。
- DirectX ツール キット コミュニティのプロジェクトには、Direct3D 11 および UWP アプリで利用できるヘルパー クラスが用意されています。
FX から HLSL へのシェーダー プログラムの移行
Effects を含め、D3DX ユーティリティ ライブラリ (D3DX 9、D3DX 10、D3DX 11) は、UWP では推奨されなくなりました。 UWP のすべての DirectX ゲームは、Effects を使わずに、HLSL を使ってグラフィックス パイプラインを実行します。
Visual Studio は、シェーダー オブジェクトをコンパイルするために FXC をバックグラウンドで使います。 UWP ゲームのシェーダーは事前にコンパイルされます。 バイトコードは実行時に読み込まれ、各シェーダー リソースは適切なレンダリング パスの間にグラフィックス パイプラインにバインドされます。 シェーダーを独自の別の .HLSL ファイルに移し、レンダリング テクノロジを C++ コードで実装する必要があります。
シェーダー リソースの読み込みの概要については、「チュートリアル: DirectX 11 とユニバーサル Windows プラットフォーム (UWP) への簡単な Direct3D 9 アプリの移植」をご覧ください。
Direct3D 11 ではシェーダー モデル 5 が導入されましたが、これには Direct3D 機能レベル 11_0 以上が必要です。 「Direct3D 11 の HLSL シェーダー モデル 5 の機能」をご覧ください。
XNAMath と D3DXMath の置き換え
XNAMath (または D3DXMath) を使ったコードは DirectXMath に移行する必要があります。 DirectXMath には、x86、x64、Arm 間で移植可能な型が含まれています。 「XNA Math ライブラリからのコードの移行」をご覧ください。
DirectXMath の浮動小数点型はシェーダーで使うと便利です。 たとえば、XMFLOAT4 と XMFLOAT4X4 は、定数バッファーのデータの整列に便利です。
XAudio2 (とバックグラウンド オーディオ) への DirectSound の置き換え
DirectSound では、UWP はサポートされていません。
- ゲームにサウンド効果を追加するには XAudio2 を使います。
XInput および Windows ランタイム API への DirectInput の置き換え
DirectInput では、UWP はサポートされていません。
- マウス、キーボード、タッチ入力には CoreWindow の入力イベント コールバックを使います。
- ゲーム コントローラーのサポート (とゲーム コントローラーのヘッドセットのサポート) には XInput 1.4 を使います。 デスクトップと UWP に共有コード ベースを使う場合は、下位互換性について、「XInput のバージョン」をご覧ください。
- ゲームでアプリ バーを使う必要がある場合は、EdgeGesture イベントに登録します。
DirectShow の代わりに Microsoft メディア ファンデーションを使う
DirectShow は DirectX API (または Windows API) にはもう含まれていません。 Microsoft メディア ファンデーションは共有サーフェイスを使って Direct3D にビデオ コンテンツを提供します。 「Direct3D 11 のビデオ API」をご覧ください。
ネットワーク コードへの DirectPlay の置き換え
Microsoft DirectPlay は推奨されなくなりました。 ゲームでネットワーク サービスを使う場合は、UWP の要件に準拠しているネットワーク コードを提供する必要があります。 次の API を使います。
- UWP アプリの Win32 と COM (ネットワーク) (Windows)
- Windows.Networking 名前空間 (Windows)
- Windows.Networking.Sockets 名前空間 (Windows)
- Windows.Networking.Connectivity 名前空間 (Windows)
- Windows.ApplicationModel.Background 名前空間 (Windows)
次の記事は、ネットワーク機能を追加し、アプリのパッケージ マニフェストでネットワークのサポートを宣言するうえで役立ちます。
- ソケットを使った接続 (C#/VB/C++ と XAML を使った UWP アプリ) (Windows)
- WebSocket を使った接続 (C#/VB/C++ と XAML を使った UWP アプリ) (Windows)
- Web サービスへの接続 (C#/VB/C++ と XAML を使った UWP アプリ) (Windows)
- ネットワークの基本
アプリの中断中は、すべての UWP アプリ (ゲームを含む) で特定の種類のバックグラウンド タスクを使って接続を維持します。 中断されている間、ゲームが接続状態を保存する必要がある場合は、「ネットワークの基本」をご覧ください。
関数のマッピング
Direct3D 9 から Direct3D 11 にコードの変換を行う場合は、次の表を参考にしてください。 これは、デバイスとデバイス コンテキストの区別にも役立ちます。
Direct3D9 | 相当する Direct3D 11 の要素 |
---|---|
グラフィックス パイプラインのステージについては、「グラフィックス パイプライン」で説明されています。 |
|
DXGI_PRESENT_TEST フラグを設定して IDXGISwapChain1::Present1 を呼び出します。 |
|
ID3D11DeviceContext::DrawIndexed ID3D11DeviceContext::DrawIndexedInstanced ID3D11DeviceContext::DrawInstanced |
|
直接相当する要素はなし |
|
標準的なカーソル API を使います。 |
|
LOST デバイスと POOL_MANAGED はもう存在しません。 IDXGISwapChain1::Present1 は戻り値 DXGI_ERROR_DEVICE_REMOVED で失敗する可能性があります。 |
|
IDirect3DDevice9:DrawRectPatch IDirect3DDevice9:MultiplyTransform |
固定関数パイプラインは推奨されなくなりました。 |
IDirect3DDevice9:CheckDepthStencilMatch IDirect3DDevice9:CheckDeviceFormat |
互換性ビットは機能レベルに置き換えられます。 特定の機能レベルでは、いくつかの形式と機能の使用のみオプションです。 これは ID3D11Device::CheckFeatureSupport と ID3D11Device::CheckFormatSupport でチェックできます。 |
サーフェス形式のマッピング
Direct3D 9 形式から DXGI 形式への変換を行う場合は、次の表を参考にしてください。
Direct3D 9 形式 | Direct3D 11 形式 |
---|---|
D3DFMT_UNKNOWN |
DXGI_FORMAT_UNKNOWN |
D3DFMT_R8G8B8 |
使用できません。 |
D3DFMT_A8R8G8B8 |
DXGI_FORMAT_B8G8R8A8_UNORM DXGI_FORMAT_B8G8R8A8_UNORM_SRGB |
D3DFMT_X8R8G8B8 |
DXGI_FORMAT_B8G8R8X8_UNORM DXGI_FORMAT_B8G8R8X8_UNORM_SRGB |
D3DFMT_R5G6B5 |
DXGI_FORMAT_B5G6R5_UNORM |
D3DFMT_X1R5G5B5 |
使用できません。 |
D3DFMT_A1R5G5B5 |
DXGI_FORMAT_B5G5R5A1_UNORM |
D3DFMT_A4R4G4B4 |
DXGI_FORMAT_B4G4R4A4_UNORM |
D3DFMT_R3G3B2 |
使用できません。 |
D3DFMT_A8 |
DXGI_FORMAT_A8_UNORM |
D3DFMT_A8R3G3B2 |
使用できません。 |
D3DFMT_X4R4G4B4 |
使用できません。 |
D3DFMT_A2B10G10R10 |
DXGI_FORMAT_R10G10B10A2 |
D3DFMT_A8B8G8R8 |
DXGI_FORMAT_R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM_SRGB |
D3DFMT_X8B8G8R8 |
使用できません。 |
D3DFMT_G16R16 |
DXGI_FORMAT_R16G16_UNORM |
D3DFMT_A2R10G10B10 |
使用できません。 |
D3DFMT_A16B16G16R16 |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DFMT_A8P8 |
使用できません。 |
D3DFMT_P8 |
使用できません。 |
D3DFMT_L8 |
DXGI_FORMAT_R8_UNORM
注: Direct3D 9 の動作を得るには、シェーダーで .r スウィズルを使用して赤を他の成分に複製します。
|
D3DFMT_A8L8 |
DXGI_FORMAT_R8G8_UNORM
注: Direct3D 9 の動作を得るには、シェーダーでスウィズル .rrrg を使用してアルファ成分に赤を複製し、緑を移動します。
|
D3DFMT_A4L4 |
使用できません。 |
D3DFMT_V8U8 |
DXGI_FORMAT_R8G8_SNORM |
D3DFMT_L6V5U5 |
使用できません。 |
D3DFMT_X8L8V8U8 |
使用できません。 |
D3DFMT_Q8W8V8U8 |
DXGI_FORMAT_R8G8B8A8_SNORM |
D3DFMT_V16U16 |
DXGI_FORMAT_R16G16_SNORM |
D3DFMT_W11V11U10 |
使用できません。 |
D3DFMT_A2W10V10U10 |
使用できません。 |
D3DFMT_UYVY |
使用できません。 |
D3DFMT_R8G8_B8G8 |
DXGI_FORMAT_G8R8_G8B8_UNORM
注: Direct3D 9 ではデータは 255.0f だけスケールアップされましたが、これはシェーダーで処理できます。
|
D3DFMT_YUY2 |
使用できません。 |
D3DFMT_G8R8_G8B8 |
DXGI_FORMAT_R8G8_B8G8_UNORM
注: Direct3D 9 ではデータは 255.0f だけスケールアップされましたが、これはシェーダーで処理できます。
|
D3DFMT_DXT1 |
DXGI_FORMAT_BC1_UNORM と DXGI_FORMAT_BC1_UNORM_SRGB |
D3DFMT_DXT2 |
DXGI_FORMAT_BC1_UNORM と DXGI_FORMAT_BC1_UNORM_SRGB
注: API とハードウェアの観点からは、DXT1 と DXT2 は同じです。 唯一の違いは、プリマルチプライ済みアルファが使われるかどうかです。これはアプリケーションで追跡でき、別の形式は必要ありません。
|
D3DFMT_DXT3 |
DXGI_FORMAT_BC2_UNORM と DXGI_FORMAT_BC2_UNORM_SRGB |
D3DFMT_DXT4 |
DXGI_FORMAT_BC2_UNORM と DXGI_FORMAT_BC2_UNORM_SRGB
注: API とハードウェアの観点からは、DXT3 と DXT4 は同じです。 唯一の違いは、プリマルチプライ済みアルファが使われるかどうかです。これはアプリケーションで追跡でき、別の形式は必要ありません。
|
D3DFMT_DXT5 |
DXGI_FORMAT_BC3_UNORM と DXGI_FORMAT_BC3_UNORM_SRGB |
D3DFMT_D16 と D3DFMT_D16_LOCKABLE |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32 |
使用できません。 |
D3DFMT_D15S1 |
使用できません。 |
D3DFMT_D24S8 |
使用できません。 |
D3DFMT_D24X8 |
使用できません。 |
D3DFMT_D24X4S4 |
使用できません。 |
D3DFMT_D16 |
DXGI_FORMAT_D16_UNORM |
D3DFMT_D32F_LOCKABLE |
DXGI_FORMAT_D32_FLOAT |
D3DFMT_D24FS8 |
使用できません。 |
D3DFMT_S1D15 |
使用できません。 |
D3DFMT_S8D24 |
DXGI_FORMAT_D24_UNORM_S8_UINT |
D3DFMT_X8D24 |
使用できません。 |
D3DFMT_X4S4D24 |
使用できません。 |
D3DFMT_L16 |
DXGI_FORMAT_R16_UNORM
注: D3D9 の動作を取得するには、シェーダーで .r スウィズルを使用して赤を他の成分に複製します。
|
D3DFMT_INDEX16 |
DXGI_FORMAT_R16_UINT |
D3DFMT_INDEX32 |
DXGI_FORMAT_R32_UINT |
D3DFMT_Q16W16V16U16 |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DFMT_MULTI2_ARGB8 |
使用できません。 |
D3DFMT_R16F |
DXGI_FORMAT_R16_FLOAT |
D3DFMT_G16R16F |
DXGI_FORMAT_R16G16_FLOAT |
D3DFMT_A16B16G16R16F |
DXGI_FORMAT_R16G16B16A16_FLOAT |
D3DFMT_R32F |
DXGI_FORMAT_R32_FLOAT |
D3DFMT_G32R32F |
DXGI_FORMAT_R32G32_FLOAT |
D3DFMT_A32B32G32R32F |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DFMT_CxV8U8 |
使用できません。 |
D3DDECLTYPE_FLOAT1 |
DXGI_FORMAT_R32_FLOAT |
D3DDECLTYPE_FLOAT2 |
DXGI_FORMAT_R32G32_FLOAT |
D3DDECLTYPE_FLOAT3 |
DXGI_FORMAT_R32G32B32_FLOAT |
D3DDECLTYPE_FLOAT4 |
DXGI_FORMAT_R32G32B32A32_FLOAT |
D3DDECLTYPED3DCOLOR |
使用できません。 |
D3DDECLTYPE_UBYTE4 |
DXGI_FORMAT_R8G8B8A8_UINT
注: シェーダーでは UINT 値を取得しますが、Direct3D 9 スタイルの integral float (0.0f、1.0f... 255.f) が必要な場合、UINT をシェーダーで float32 に変換できます。
|
D3DDECLTYPE_SHORT2 |
DXGI_FORMAT_R16G16_SINT
注: シェーダーでは SINT 値を取得しますが、Direct3D 9 スタイルの integral float が必要な場合、SINT をシェーダーで float32 に変換できます。
|
D3DDECLTYPE_SHORT4 |
DXGI_FORMAT_R16G16B16A16_SINT
注: シェーダーでは SINT 値を取得しますが、Direct3D 9 スタイルの integral float が必要な場合、SINT をシェーダーで float32 に変換できます。
|
D3DDECLTYPE_UBYTE4N |
DXGI_FORMAT_R8G8B8A8_UNORM |
D3DDECLTYPE_SHORT2N |
DXGI_FORMAT_R16G16_SNORM |
D3DDECLTYPE_SHORT4N |
DXGI_FORMAT_R16G16B16A16_SNORM |
D3DDECLTYPE_USHORT2N |
DXGI_FORMAT_R16G16_UNORM |
D3DDECLTYPE_USHORT4N |
DXGI_FORMAT_R16G16B16A16_UNORM |
D3DDECLTYPE_UDEC3 |
使用できません。 |
D3DDECLTYPE_DEC3N |
使用できません。 |
D3DDECLTYPE_FLOAT16_2 |
DXGI_FORMAT_R16G16_FLOAT |
D3DDECLTYPE_FLOAT16_4 |
DXGI_FORMAT_R16G16B16A16_FLOAT |
FourCC 'ATI1' |
DXGI_FORMAT_BC4_UNORM
注: 機能レベル 10.0 以降が必要です。
|
FourCC 'ATI2' |
DXGI_FORMAT_BC5_UNORM
注: 機能レベル 10.0 以降が必要です。
|
その他のマッピング情報
- IDirect3DDevice9::SetCursorPosition は SetCursorPos に置き換えられます。
- IDirect3DDevice9::SetCursorProperties は SetCursor に置き換えられます。
- IDirect3DDevice9::SetIndices は ID3D11DeviceContext::IASetIndexBuffer に置き換えられます。
- IDirect3DDevice9::SetRenderTarget は ID3D11DeviceContext::OMSetRenderTargets に置き換えられます。
- IDirect3DDevice9::SetScissorRect は ID3D11DeviceContext::RSSetScissorRects に置き換えられます。
- IDirect3DDevice9::SetStreamSource は ID3D11DeviceContext::IASetVertexBuffers に置き換えられます。
- IDirect3DDevice9::SetVertexDeclaration は ID3D11DeviceContext::IASetInputLayout に置き換えられます。
- IDirect3DDevice9::SetViewport は ID3D11DeviceContext::RSSetViewports に置き換えられます。
- IDirect3DDevice9::ShowCursor は ShowCursor に置き換えられます。
IDirect3DDevice9::SetGammaRamp を介したビデオ カードのハードウェア ガンマ ランプの制御は、IDXGIOutput::SetGammaControl に置き換えられます。 ガンマ補正の使用に関する記事を参照してください。
IDirect3DDevice9::ProcessVertices は、ジオメトリ シェーダーのストリーム出力機能に置き換えられます。 ストリーム出力ステージの使用開始に関する記事を参照してください。
ユーザー クリッププレーンを設定する IDirect3DDevice9::SetClipPlane メソッドは、VS_4_0 以上で使用可能な HLSL の SV_ClipDistance 頂点シェーダー出力セマンティクス (「セマンティクス」を参照)、または新しい HLSL クリッププレーン関数属性 (機能レベル 9 ハードウェアのユーザー クリップ プレーンに関するページを参照) に置き換えられました。
IDirect3DDevice9::SetPaletteEntries と IDirect3DDevice9::SetCurrentTexturePalette は非推奨になりました。 代わりに、256x1 R8G8B8A8 テクスチャで色を検索するピクセル シェーダーにこれらを置き換えてください。
DrawRectPatch、DrawTriPatch、SetNPatchMode、DeletePatch のような固定機能のテセレーション関数は非推奨になりました。 プログラミング可能なパイプライン SM5.0 テセレーション シェーダーにこれらを置き換えてください (ハードウェアでテセレーション シェーダーがサポートされている場合)。
IDirect3DDevice9::SetFVF コードと FVF コードはサポートされなくなりました。 D3D8/D3D9 FVF コードから D3D9 頂点宣言に移植してから、D3D11 入力レイアウトに移植する必要があります。
直接サポートされていないすべての D3DDECLTYPE 型は、VS_4_0 以上の頂点シェーダーの先頭にあるビット演算の数が少ない場合に、かなり効率的にエミュレートできます。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示