ゲーム開発者向けの Direct3D 11 展開

この記事では、必要に応じて Direct3D 11 コンポーネントをシステムに展開する方法について説明します。

概要

Direct3D 11 API は、マルチスレッド レンダリングとリソース作成、コンピューティング シェーダー、ハードウェア テセレーション、BC6H/BC7 テクスチャ圧縮、HLSL シェーダー モデル 5.0 と動的シェーダー リンケージをサポートする既存の Direct3D 10.1 API を拡張します。 Direct3D 11 コンポーネントに加えて、DirectX 11 ランタイムには、Direct3D 11、DXGI 1.1、10level9 機能レベル、WARP10 ソフトウェア レンダリング デバイス、Direct2D、DirectWrite、および 10level9 および WARP10 をサポートする更新された Direct3D 10.1 という追加のグラフィックス コンポーネントが含まれています。 これらおよびその他の Windows グラフィックス コンポーネントの詳細については、「 Windows のグラフィックス API」を参照してください。

これらの新しいグラフィックス コンポーネントはすべて、Windows 7 および Windows Server 2008 R2 オペレーティング システムに組み込まれています。 Direct3D 11 API および関連コンポーネントは、Windows Updateからのシステム更新プログラムを使用して Windows Vista にインストールすることもできます。 この更新プログラムには、Windows Vista と Service Pack 2 が必要です。 自動更新が有効になっているエンド ユーザーは、すべての Windows 7 ユーザーと同様に、Direct3D 11 コンポーネントが既にインストールされている可能性があります。

D3D11InstallHelper サンプルは、Direct3D 11 API の検出を簡略化し、エンド ユーザーのコンピューターに該当する場合はシステム更新プログラムを自動的にインストールし、新しい Service Pack が必要な場合は手動でエンド ユーザーに適切なメッセージを提供するように設計されています。

Note

HLSL コンパイラ (D3DCompile*.dll) と Direct3D 11 (D3DX11*.dll) 用の D3DX ユーティリティ ライブラリは、Windows オペレーティング システムのどのバージョンにも組み込まれていませんが、既存の DirectSetup テクノロジを使用してアプリケーションのインストーラーの一部として展開できます。DirectSetup の使用方法の詳細については、「 ゲーム開発者向けの DirectX インストール」を参照してください。 "Effects 11" は、 Direct3D 11 Update の Effects で共有ソース サポート ライブラリとして使用でき、アプリ (DXUT ユーティリティ ライブラリと同様) に直接含めることができます。 したがって、ランタイム再配布の追加要件はありません。

Direct3D 11.3

Windows 10には、Direct3D 11.3 API が組み込まれています。 Direct3D 11.3 API の新機能の一覧については、「Direct3D 11.3 の機能」を参照してください。

Direct3D 11.2

Windows 8.1とWindows Server 2012 R2 には、Direct3D 11.2 API が組み込まれています。 Direct3D 11.2 API の新機能の一覧については、「Direct3D 11.2 の機能」を参照してください。

Direct3D 11.1

Windows 8とWindows Server 2012には、Direct3D 11.1 API が組み込まれています。 Direct3D 11.1 API の部分的なサポートは、Windows 7 用プラットフォーム更新プログラム がインストールされた Windows 7 または Windows Server 2008 R2 で利用できます。 Windows 7 のプラットフォーム更新プログラムの詳細については、「Windows 7 用プラットフォーム更新プログラム」を参照してください。

D3D11InstallHelper.dll

D3D11InstallHelper.dllは、Direct3D 11 コンポーネントを検出し、必要に応じてWindows Update サービスを介してシステム更新を実行するためのコア機能をホストします。 DLL には、メッセージやダイアログ ボックスは直接表示されません。

DLL は、次のエントリ ポイントで構成されます。

CheckDirect3D11Status

この関数は、必要なチェックを実行し、このコンピューターの Direct3D 11 の状態を返します。 この関数には管理者権限は必要ありません。

  • D3D11IH_STATUS_INSTALLEDの状態は、Direct3D 11 がコンピューターに既にインストールされており、使用できる状態であることを示します。
  • D3D11IH_STATUS_NOT_SUPPORTEDは、このバージョンの Windows で Direct3D 11 または関連テクノロジがサポートされていないことを示します。
  • D3D11IH_STATUS_NEED_LATEST_SPの状態は、ユーザーが最新の Windows Vista Service Pack をインストールする必要があることを示します。
  • 最後に、D3D11IH_STATUS_REQUIRES_UPDATEの状態は、システムに Direct3D 11 がインストールされていないが、システム更新プログラムがこのバージョンの Windows に適用されることを示します。

DoUpdateForDirect3D11

この関数は、Windows Update API を使用して、このシステムに Direct3D 11 をインストールするためのシステム更新プログラムを実行します (該当する場合)。 この関数では、Windows Updateを成功させるためにネットワーク接続と管理者権限が必要であることに注意してください。 省略可能な進行状況コールバック関数とユーザー コンテキスト ポインターを受け取り、完了すると最終的な結果コードを返します。

  • D3D11IH_RESULT_SUCCESS結果は、システム更新プログラムが適用され、使用できる状態であることを示します。一方、D3D11IH_RESULT_SUCCESS_REBOOTは、システム更新プログラムが完了する前にコンピューターを再起動する必要があることを示します。 この関数は、システムの再起動をスケジュールしないことに注意してください。
  • D3D11IH_RESULT_NOT_SUPPORTEDは、システム更新プログラムがこのバージョンの Windows に適用されないことを示します。 この結果は、この関数が CheckDirect3D11Status からD3D11IH_STATUS_REQUIRES_UPDATE状態を取得した後にのみ呼び出される場合は発生しません。
  • D3D11IH_RESULT_UPDATE_NOT_FOUNDの結果は、Windows Update サーバーでシステム更新プログラム パッケージが見つからなかったことを示します。
  • Windows Updateのダウンロードまたはインストールが失敗した場合は、結果としてD3D11IH_RESULT_UPDATE_DOWNLOAD_FAILEDまたはD3D11IH_RESULT_UPDATE_INSTALL_FAILEDが返されます。
  • Windows Update API からネットワーク接続エラーが返された場合、D3D11IH_RESULT_WU_SERVICE_ERROR結果が返され、問題が断続的であるか、ネットワーク構成またはファイアウォール設定に関連している可能性があることを示します。 更新関数をもう一度試しても成功する可能性があります。

Windows Update API の詳細については、「Windows Update エージェント API」を参照してください。

D3D11Install.exe

Note

D3D11Install.exeを実行するにはD3D11InstallHelper.dllが必要です。

D3D11Install.exeは、D3D11InstallHelper.dllを UI メッセージとエンド ユーザー メッセージを含むスタンドアロン インストーラーとして使用し、DLL を適切に使用するための例として機能するためのツールです。 Direct3D 11 が既にインストールされている場合、システム更新プログラムがシステムの再起動を必要とせずに正常に適用された場合、Service Pack のインストールが必要な場合、または Direct3D 11 がこのコンピューターでサポートされていない場合、プロセスは 0 で終了します。 システム更新が正常に適用され、システムの再起動が完了する必要がある場合は、1 が返されます。 他のエラー条件に対して 2 が返されます。 この実行可能ファイルを実行するには管理者権限が必要であり、UAC が有効になっている Windows Vista または Windows 7 で実行するときに昇格を要求するマニフェストがあることに注意してください。 D3D11Install.exeは、Direct3D 11 更新プログラムを展開するためのスタンドアロン ツールとして使用することも、インストーラーによって直接使用することもできます。

次のコマンド ライン スイッチがサポートされています。

/静か

メッセージ、プロンプト、進行状況ダイアログ ボックス、またはエラー メッセージを表示しません。

/パッシブ

メッセージ、プロンプト、またはエラー メッセージは表示されませんが、進行状況ダイアログ ボックスが表示されます。

/最小限

最小限のプロンプトのみを表示します。

/Y

必要に応じて、標準インストールと最小インストールの更新プログラムのインストールを確認するように求めるメッセージが表示されないようにします。

/langid decimal

エンド ユーザー メッセージとダイアログ ボックス リソースを表示するときに使用する言語識別子コードを強制します。 既定値は 1024 で、システムの既定の言語設定が使用されます。

/呉

マネージド サーバーまたはその他の標準以外の構成で実行されているWindows Server Update Services (WSUS) である可能性がある、システムの既定値ではなく、Windows Updateを強制的に使用します。

インストール・プログラムへの統合

Windows 版ゲームのサポートの簡単なインストール、 技術的要件 3.1 に準拠するには、インストール プロセスの早い段階でエンド ユーザープロンプトが表示されるように注意し、UAC 関連の昇格プロンプトが複数ないように注意する必要があります。 この目標を達成するには、次の 3 つの基本的な選択肢があります。

  1. 最も基本的な方法は、コマンド ライン スイッチ /minimal を使用してD3D11Install.exeを実行することです。 これはインストーラー Q&A の早い段階で行う必要があり、インストールでは戻り値 1 を使用して、インストールの終了時に再起動をスケジュールする必要があることを示す必要があります。 プログラムを実行するには管理者権限が必要です。
  2. D3D11InstallHelper.dllを直接使用して、更新の必要性を検出し、状態D3D11IH_STATUS_NEED_LATEST_SPに必要なすべてのエンド ユーザー メッセージを提供します。この場合、解決には手動でのユーザー操作が必要です。 D3D11IH_STATUS_NOT_SUPPORTEDの状態の結果を使用して、Direct3D 11 関連の資産のインストールを制御したり、Direct3D 11 専用アプリケーションのエラー条件として使用したりできますが、それ以外の場合は有用なエンド ユーザー メッセージであるとは限りません。 状態D3D11IH_STATUS_REQUIRES_UPDATEの場合、インストーラーは DLL エントリ ポイント DoUpdateForDirect3D11 を直接使用して更新を実行し、結果として得られるさまざまなエンド ユーザー メッセージを処理できます。 標準メッセージの例は、[D3D11Install.exe] ダイアログ ボックスと文字列テーブル リソースを調べることで確認できます。 更新エントリ ポイントには管理者権限が必要です。
  3. ハイブリッドアプローチでは、D3D11InstallHelper.dllを使用して状態をチェックし、状態コードD3D11IH_STATUS_NEED_LATEST_SPまたはD3D11IH_STATUS_REQUIRES_UPDATEの場合は、スイッチ /minimal/y を使用してD3D11Install.exeを実行して、ダイアログ ボックスを表示したり、必要に応じて更新を実行したりできます。 これらの手順は、インストール プロセスの早い段階 (通常は Q&A の直後) に実行する必要があり、実行可能ファイルを実行するには管理者権限が必要です。

InstallShield への統合

InstallShield の InstallScript からの Direct3D 11 展開の処理は、D3D11InstallHelper サンプルを使用して簡単に行うことができます。 InstallScript を使用して InstallShield と統合するために必要な手順は次のとおりです (前のセクションで説明した方法 3 を使用)。

  1. InstallShield エディターで InstallScript プロジェクトを開きます。

  2. D3D11InstallHelper.dllとD3D11Install.exeを サポート ファイルのプロジェクトに追加します。

    InstallShield プロジェクトにファイルを追加するには

    1. [インストール Designer] タブで、左側のナビゲーション ウィンドウの [動作とロジック] の下にある [ファイル/ビルボードのサポート] をクリックします。
    2. [ 言語に依存しない] をクリックし、[ ファイル ] ウィンドウで右クリックし、[ ファイルの挿入] を選択します。 参照してD3D11InstallHelper.dllとD3D11Install.exeを追加します。 これらのファイルの既定の場所は、SDK root\Samples\C++\Misc\Bin\x86 です。
  3. InstallScript エクスプローラーで、左側のナビゲーション ウィンドウの [ 動作とロジック ] の下にある DLL または実行可能ファイルを呼び出す InstallScript ファイル (通常は Setup.rul) をクリックします。

  4. 次の InstallScript を上部付近のファイルに貼り付けます。

#define D3D11IH_STATUS_INSTALLED 0 #define D3D11IH_STATUS_NOT_SUPPORTED 1 #define D3D11IH_STATUS_REQUIRES_UPDATE 2 #define D3D11IH_STATUS_NEED_LATEST_SP 3 #define D3D11IH_STATUS_ERROR -1 プロトタイプ NUMBER D3D11InstallHelper.CheckDirect3D11StatusIS();

#define D3D11IH_RESULT_SUCCESS 0 #define D3D11IH_RESULT_SUCCESS_REBOOT 1 #define D3D11IH_RESULT_NOT_SUPPORTED 2 #define D3D11IH_RESULT_UPDATE_NOT_FOUND 3 #define D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED 4 #define D3D11IH_RESULT_UPDATE_INSTALL_FAILED 5 #define D3D11IH_RESULT_WU_SERVICE_ERROR 6 #define D3D11IH_RESULT_ERROR -1 プロトタイプ NUMBER D3D11InstallHelper.DoUpdateForDirect3D11IS(BOOL);```

  1. OnFirstUIBefore 関数のファイルに、戻り値 0 の直前に次の InstallScript を貼り付けます。

    Dlg_D3D11:
        UseDLL( SUPPORTDIR ^ "D3D11InstallHelper.DLL" );
        nResult = D3D11InstallHelper.CheckDirect3D11StatusIS();   
        UnUseDLL( SUPPORTDIR ^ "D3D11InstallHelper.DLL" );
    
        if ( nResult = D3D11IH_STATUS_REQUIRES_UPDATE
             || nResult = D3D11IH_STATUS_NEED_LATEST_SP) then
            nResult = LaunchAppAndWait(
    SUPPORTDIR^"D3D11Install.exe",
    "/minimal /y", WAIT);
            if ( nResult < 0 ) then
                MessageBox("Unable to launch D3D11Install.exe",
     SEVERE);
            elseif ( nResult == 1 ) then
                BATCH_INSTALL = 1;
            endif;          
        endif;
    

MSI パッケージへの統合

MSI カスタム アクションを使用して Direct3D 11 展開を統合するために必要な手順の概要を次に示します (このトピックで前述した方法 3 を使用)。

  1. インストール時にD3D11Install.exeとD3D11InstallHelper.dllへの相対パスを含む RelativePathToD3D11IH という名前の MSI Property テーブルにプロパティを追加します (これは通常、メディア イメージ内にあります)。 これにより、MSI プロパティD3D11IH_STATUS CheckDirect3D11Status によって返される状態 (列挙記号または "ERROR" と等しい文字列プロパティ) も設定されます。
  2. CostFinalize アクションの後、D3D11InstallHelper.dll関数 SetD3D11InstallMSIProperties を 即時カスタム アクションとして呼び出して、他のカスタム アクションに適切な MSI プロパティを設定します。
  3. インストール時に、D3D11InstallHelper.dll関数 DoD3D11InstallUsingMSI を呼び出す InstallFiles アクションの後に、遅延カスタム アクションをトリガーします。 カスタム アクションでは、昇格されたコンテキストで実行される msidbCustomActionTypeNoImpersonate フラグを設定する必要があります。
  4. InstallFinalize アクションの後、必要に応じて、再起動要求の結果コードの成功を処理する即時カスタム アクションとして、 D3D11InstallHelper.dll関数 FinishD3D11InstallUsingMSI を呼び出します。

この手順については、次の手順で詳しく説明します。この手順では、 Orca エディターなどの MSI エディターを使用して実行できるプロセスについて説明します。 一部の MSI エディターには、これらの構成手順の一部を簡略化するウィザードがあります。

D3D11InstallHelper.dllと統合するために MSI パッケージを構成するには

  1. Orca で MSI パッケージを開きます。

  2. 次の表に示す行を、MSI パッケージの Binary テーブルに追加します。

    名前 Data
    D3D11IH DLL\D3D11InstallHelper.dllへのファイル パス

     

    Note

    このファイルは MSI パッケージに埋め込まれるので、D3D11InstallHelper.dll再コンパイルするたびにこの手順を実行する必要があります。

     

  3. 次の表に示す行を、MSI パッケージの CustomAction テーブルに追加します。

    アクション Type source 移行先
    Direct3D11SetProps msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH SetD3D11InstallMSIProperties
    Direct3D11DoInstall msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 D3D11IH DoD3D11InstallUsingMSI
    Direct3D11Finish msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH FinishD3D11InstallUsingMSI

     

  4. 次の表の Action、Condition、Sequence に表示される値を、MSI パッケージの InstallExecuteSequence テーブルに追加します。

    アクション 条件 シーケンス メモ
    Direct3D11SetProps 1016 シーケンス番号は、CostFinalize の直後にアクションを配置します。
    Direct3D11DoInstall NOT Installed 4004 このカスタム アクションは、すべてのユーザーの新しいインストール中にのみ行われます。 シーケンス番号は、InstallFiles の後とロールバック後にアクションを配置します。
    Direct3D11Finish 6615 シーケンス番号は、InstallFinalize の直後にアクションを配置します。

     

  5. 次の表に示す行を、MSI パッケージの Property テーブルに追加します。

    プロパティ
    RelativePathToD3D11IH D3D11Install.exeとD3D11InstallHelper.dllを含む相対ファイル パス

     

    Note

    パスで指定された場所は、インストール パスで指定された場所 ("redist\" など) に対する相対位置です。

     

  6. MSI パッケージを保存します。 MSI パッケージと Windows インストーラーの詳細については、「 Windows インストーラー」を参照してください。

デバッグのヒント

D3D11InstallHelper.dllとD3D11Install.exeの両方を Visual Studio のデバッグ構成でビルドできます。これらのバージョンでは、標準の Windows デバッグ出力メカニズムにメッセージが出力されます。

企業用の設定

D3D11InstallHelper サンプルは、コンシューマーによるゲームのインストールに最も一般的なシナリオである、Windows Updateを使用した標準的な展開用に設計されています。 ただし、パブリッシャーや開発スタジオで作業する多くのゲーム開発者は、Windows Server Update Services (WSUS) テクノロジを使用してソフトウェア更新プログラムを提供するローカル管理サーバーを持つエンタープライズ設定で行います。 この種類の環境では、ローカルの IT 管理者は、企業ネットワーク内のコンピューターで使用できる更新プログラムを承認制御でき、標準のコンシューマー バージョンの更新プログラム KB 971644は使用できません。

企業/エンタープライズ設定で DirectX 11 を展開するための 3 つの基本的なソリューションがあります。

  • 一部の構成では、ローカルで管理されている WSUS サーバーを使用するのではなく、直接チェック Windows Updateできます。 このため、D3D11InstallHelper では /wu コマンド ライン スイッチがサポートされています。 ただし、すべての企業ネットワークでパブリック Microsoft サーバーへの接続が許可されているわけではありません。
  • ローカル IT 管理者は、DIRECT3D 11 API を含む、WSUS から展開されたエンタープライズでサポートされる更新プログラムである KB 971512を承認できます。 これは、標準ユーザーが完全にロックダウンされている環境で Direct3D 11 更新プログラムを取得するための唯一のオプションです。
  • または、 KB 971512 を手動でインストールすることもできます。

ゲーマーのコンピューターがローカルで管理されている WSUS サーバーからのみ更新プログラムを取得できることは非常にまれであり、このような環境にある可能性が高いのは大規模な組織の開発者のみです。

ゲーム開発者向けの Windows ファイアウォール

ゲーム開発者向けの Windows ゲーム エクスプローラー