ホログラフィック DirectX プロジェクトを作成する

Note

この記事は、従来のWinRTネイティブAPIに関連します。 新しいネイティブ アプリ プロジェクトでは、OpenXR API を使用することをお勧めします。

HoloLens 用に作成するホログラフィック アプリは、ユニバーサル Windows プラットフォーム (UWP) アプリです。 デスクトップの Windows Mixed Reality ヘッドセットを対象とする場合は、UWP アプリまたは Win32 アプリを作成できます。

DirectX 11 ホログラフィック UWP アプリ テンプレートは、DirectX 11 UWP アプリ テンプレートによく似ています。 このテンプレートには、プログラム ループ、Direct3D デバイスとコンテキストを管理するための DeviceResources クラス、簡略化されたコンテンツ レンダラー クラスが含まれています。 また、他の UWP アプリと同じように、IFrameworkView も含まれています。

とはいえ Mixed Reality アプリには、通常の Direct3D UWP アプリにはない他の機能も含まれています。 Windows Mixed Reality アプリ テンプレートを使用すると、次のことが可能になります。

  • ホログラフィック カメラと関連付けられている Direct3D デバイス リソースを扱う。
  • カメラのバック バッファーをシステムから取得する。 Direct3D12 の場合は、ホログラフィック バック バッファー リソースを作成し、リソースの有効期間を管理する。
  • 視線入力を処理し、手ぶりを認識する。
  • 全画面ステレオ レンダリング モードに移行する。

開始するには?

Visual Studio 2019 と Windows Mixed Reality アプリ テンプレートのダウンロードについての手順に従って、まずツールをインストールします。 Mixed Reality アプリ テンプレートは、Visual Studio マーケットプレースから ダウンロードするか、Visual Studio UI から拡張機能としてインストールできます。

これで DirectX 11 Windows Mixed Reality アプリを作成する準備が整いました。 サンプル コンテンツを削除するには、"pch.h" の DRAW_SAMPLE_CONTENT プリプロセッサ ディレクティブをコメント アウトします。

UWP プロジェクトの作成

ツールが インストールされたら、ホログラフィック DirectX UWP プロジェクトを作成できます。

Visual Studio 2019 で新しいプロジェクトを作成する方法:

  1. Visual Studio を起動します。
  2. 右側の [作業の開始] セクションで、[新しいプロジェクトの作成] を選択します。
  3. [新しいプロジェクトの作成] ダイアログのドロップダウン メニューで、[C++][Windows Mixed Reality][UWP] を選択します。
  4. [Holographic DirectX 11 App (Universal Windows) (C++/WinRT)](ホログラフィック DirectX 11 アプリ (ユニバーサル Windows) (C++/WinRT)) を選択します。 Visual Studio 2019 の Holographic DirectX 11 C++/WinRT UWP アプリ プロジェクト テンプレートのスクリーンショット
    Visual Studio 2019 のホログラフィック DirectX 11 C++/WinRT UWP アプリ プロジェクト テンプレート

    重要

    プロジェクト テンプレート名に "(C++/WinRT)" が含まれていることを確認してください。 含まれていない場合、古いバージョンのホログラフィック プロジェクト テンプレートがインストールされています。 最新のプロジェクトを入手するには、Visual Studio 2019 の拡張機能として テンプレートをインストールしてください。

  5. [次へ] を選択します。
  6. [プロジェクト名][場所] テキスト ボックスに入力して、[作成] を選択またはクリックします。 ホログラフィック プロジェクトが作成されます。
  7. HoloLens 2 だけを対象としている開発者は、[ターゲット バージョン][最小バージョン][Windows 10、バージョン 1903] に設定されていることを確認してください。 HoloLens (第 1 世代) またはデスクトップの Windows Mixed Reality ヘッドセットも対象とする場合は、[最小バージョン][Windows 10、バージョン 1809] に設定します。 その場合は、HoloLens 2 の新しい機能を使用する際にコードでいくつかのバージョン アダプティブ チェックが必要になります。 ターゲットと最小バージョンとしてバージョン 1903 Windows 10を設定するスクリーンショット
    ターゲットおよび最小バージョンとして Windows 10、バージョン 1903 を設定する

    重要

    選択肢に[Windows 10、バージョン 1903] がない場合、最新の Windows 10 SDK がインストールされていません。 選択肢が表示されるようにするには、バージョン 10.0.18362.0 以降の Windows 10 SDK をインストールしてください。

Visual Studio 2017 で新しいプロジェクトを作成する方法:

  1. Visual Studio を起動します。
  2. [ファイル] メニューで、[新規] をポイントし、コンテキスト メニューから [プロジェクト] を選択します。 [新しいプロジェクト] ダイアログ ボックスが開きます。
  3. 左側で [インストール済み] を展開し、[Visual C++] 言語ノードを展開します。
  4. [Windows ユニバーサル] > [ホログラフィック] ノードに移動して、[ホログラフィック DirectX 11 アプリ (ユニバーサル Windows) (C++/WinRT)] を選択します。 Visual Studio 2017 の Holographic DirectX 11 C++/WinRT UWP アプリ プロジェクト テンプレートのスクリーンショット
    Visual Studio 2017 のホログラフィック DirectX 11 C++/WinRT UWP アプリ プロジェクト テンプレート

    重要

    プロジェクト テンプレート名に "(C++/WinRT)" が含まれていることを確認してください。 含まれていない場合、古いバージョンのホログラフィック プロジェクト テンプレートがインストールされています。 最新のプロジェクトを入手するには、Visual Studio 2017 の拡張機能として テンプレートをインストールしてください。

  5. [名前][場所] テキスト ボックスに入力して、[OK] を選択またはクリックします。 ホログラフィック プロジェクトが作成されます。
  6. HoloLens 2 だけを対象としている開発者は、[ターゲット バージョン][最小バージョン][Windows 10、バージョン 1903] に設定されていることを確認してください。 HoloLens (第 1 世代) またはデスクトップの Windows Mixed Reality ヘッドセットも対象とする場合は、[最小バージョン][Windows 10、バージョン 1809] に設定します。 その場合は、HoloLens 2 の新しい機能を使用する際にコードでいくつかのバージョン アダプティブ チェックが必要になります。 ターゲットと最小バージョンとしてバージョン 1903 Windows 10を設定するスクリーンショット
    ターゲットおよび最小バージョンとして Windows 10、バージョン 1903 を設定する

    重要

    選択肢に[Windows 10、バージョン 1903] がない場合、最新の Windows 10 SDK がインストールされていません。 選択肢が表示されるようにするには、バージョン 10.0.18362.0 以降の Windows 10 SDK をインストールしてください。

このテンプレートは、C++/WinRT を使用してプロジェクトを生成します。これは、標準に準拠した C++17 コンパイラーをサポートする、Windows ランタイム API の C++17 言語プロジェクションです。 プロジェクトでは、ユーザーから 2 メートル離れた所に配置される、World-Locked キューブを作成する方法が表示されます。 ユーザーは、エア タップするかコントローラーのボタンを押すことで、ユーザーの視線入力によって指定される別の場所にキューブを配置できます。 このプロジェクトを変更して、任意の Mixed Reality アプリを作成することができます。

また、SharpDX に基づく Visual C# ホログラフィック プロジェクト テンプレートを使用して新しいプロジェクトを作成することもできます。 ホログラフィック C# プロジェクトを Windows Holographic アプリ テンプレートから開始しなかった場合、ms.fxcompile.targets ファイルを Windows Mixed Reality C# テンプレート プロジェクトからコピーして your.csproj ファイルにインポートすることにより、プロジェクトに追加する HLSL ファイルをコンパイルする必要があります。 Direct3D 12 テンプレートも、Visual Studio への Windows Mixed Reality アプリ テンプレート拡張機能で提供されます。

サンプルを構築して HoloLens、イマーシブ デバイスが接続された PC、エミュレーターにデプロイする方法については、「Visual Studio を使用した配置とデバッグ」を復習してください。

以下の手順の残りの部分は、アプリの構築に C++ を使用していることを前提としています。

UWP アプリのエントリ ポイント

ホログラフィック UWP アプリは、AppView.cpp の wWinMain 関数から開始します。 wWinMain 関数はアプリの IFrameworkView を作成し、それを使用して CoreApplication を開始します。

AppView.cpp からの抜粋:

// The main function bootstraps into the IFrameworkView.
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
    winrt::init_apartment();
    CoreApplication::Run(AppViewSource());
    return 0;
}

これ以降、AppView クラスは Windows の基本的な入力イベント、CoreWindow イベント、メッセージングなどとのやり取りを処理します。 また、アプリが使用する HolographicSpace も作成します。

Win32 プロジェクトを作成する

Win32 ホログラフィック プロジェクトの構築を開始する最も簡単な方法は、BasicHologram Win32 サンプルを調整することです。

この Win32 のサンプルは C++/WinRT を使用します。これは、標準に準拠した C++17 コンパイラーをサポートする、Windows ランタイム API の C++17 言語プロジェクションです。 プロジェクトでは、ユーザーから 2 メートル離れた所に配置される、World-Locked キューブを作成する方法が表示されます。 ユーザーは、コントローラーのボタンを押すことで、ユーザーの視線入力によって指定される別の場所にキューブを配置できます。 このプロジェクトを変更して、任意の Mixed Reality アプリを作成することができます。

Win32 アプリのエントリ ポイント

ホログラフィック Win32 アプリは、AppMain.cpp の wWinMain 関数から開始します。 wWinMain 関数はアプリの HWND を作成し、そのメッセージ ループを開始します。

AppMain.cpp の抜粋:

int APIENTRY wWinMain(
    _In_     HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_     LPWSTR    lpCmdLine,
    _In_     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    winrt::init_apartment();

    App app;

    // Initialize global strings, and perform application initialization.
    app.Initialize(hInstance);

    // Create the HWND and the HolographicSpace.
    app.CreateWindowAndHolographicSpace(hInstance, nCmdShow);

    // Main message loop:
    app.Run(hInstance);

    // Perform application teardown.
    app.Uninitialize();

    return 0;
}

これ以降、AppMain クラスは基本のウィンドウ メッセージなどとのやり取りを処理します。 また、アプリが使用する HolographicSpace も作成します。

ホログラフィック コンテンツをレンダリングする

プロジェクトの [コンテンツ] フォルダーには、ホログラフィック空間のホログラムをレンダリングするクラスが含まれています。 テンプレートの既定のホログラムは、ユーザーから 2 メートル離れた所に配置される、回転するキューブです。 このキューブの描画は SpinningCubeRenderer.cpp で実装されており、次の主要なメソッドが含まれています。

メソッド 説明
CreateDeviceDependentResources シェーダーを読み込み、キューブ メッシュを作成します。
PositionHologram ホログラムを、SpatialPointerPose で指定された場所に配置します。
Update キューブを回転させ、モデル マトリックスを設定します。
Render 頂点とピクセル シェーダーを使用して、フレームをレンダリングします。

[シェーダー] サブフォルダーには、4 つの既定のシェーダーの実装が含まれています。

シェーダー 説明
GeometryShader.hlsl ジオメトリを変更せずに残すパススルーです。
PixelShader.hlsl カラー データをパス スルーします。 カラー データは補間され、ラスター化ステップでピクセルに割り当てられます。
VertexShader.hlsl GPU で頂点処理を行うための簡単なシェーダーです。
VPRTVertexShader.hlsl GPU で頂点処理を行うための簡単なシェーダーで、Windows Mixed Reality ステレオ レンダリングに対して最適化されています。

VertexShaderShared.hlsl には、VertexShader.hlslVPRTVertexShader.hlsl で共有される共通のコードが含まれています。

注: Direct3D 12 アプリ テンプレートには ViewInstancingVertexShader.hlsl も含まれています。 このバリアントは D3D12 のオプション機能を使用して、ステレオ画像をより効率的にレンダリングします。

シェーダーはプロジェクトがビルドされるときにコンパイルされ、SpinningCubeRenderer::CreateDeviceDependentResources メソッドに読み込まれます。

ホログラムを操作する

ユーザー入力は SpatialInputHandler クラスで処理されます。このクラスは SpatialInteractionManager インスタンスを取得し、SourcePressed イベントにサブスクライブします。 これにより、エアタップ ジェスチャと他の空間入力イベントの検出が有効になります。

ホログラフィック コンテンツを更新する

Mixed Reality アプリは、ゲーム ループで更新されます。既定では、この挙動は AppMain.cppUpdate メソッドで実装されます。 Update メソッドは、回転キューブなどのシーン オブジェクトを更新します。また、最新のビューおよびプロジェクション マトリックスを取得してスワップ チェーンを提示するために使用される、HolographicFrame オブジェクトを返します。

AppMain.cppRender メソッドは、HolographicFrame を取得して、その時点でのアプリの状態と空間での配置の状態に基づいて、それぞれのホログラフィック カメラに対して現在のフレームをレンダリングします。

メモ

Windows Mixed Reality アプリ テンプレートでは、Spectre 軽減策フラグ (/Qspectre) を有効にしたコンパイルがサポートされるようになりました。 Spectre 軽減策を有効にした構成をコンパイルする前に、Spectre 軽減策が適用されたバージョンの Microsoft Visual C++ (MSVC) ランタイム ライブラリをインストールしてください。 Spectre 軽減策が適用された C++ ライブラリをインストールするには、Visual Studio インストーラーを起動して [変更] を選択します。 [個々のコンポーネント] に移動して、"spectre" を検索します。 Spectre 軽減策コードをコンパイルする必要がある、ターゲット プラットフォームと MSVC バージョンを選択して、[変更] をクリックしてインストールを開始します。

関連項目