建立全像攝影 DirectX 專案
注意
本文與舊版 WinRT 原生 API 相關。 針對新的原生應用程式專案,我們建議使用 OpenXR API。
您為 HoloLens 建立的全像攝影應用程式將會是通用 Windows 平臺 (UWP) 應用程式。 如果以桌面Windows Mixed Reality頭戴式裝置為目標,您可以建立 UWP 應用程式或 Win32 應用程式。
DirectX 11 全像攝影 UWP 應用程式範本與 DirectX 11 UWP 應用程式範本非常類似。 此範本包含程式迴圈、用來管理 Direct3D 裝置和內容的 DeviceResources 類別,以及簡化的內容轉譯器類別。 它也有 IFrameworkView,就像任何其他 UWP 應用程式一樣。
不過,混合實境應用程式有一些不會出現在一般 Direct3D UWP app 中的其他功能。 Windows Mixed Reality應用程式範本可以:
- 處理與全像攝影機相關聯的 Direct3D 裝置資源。
- 從系統擷取相機背景緩衝區。 在 Direct3D12 的情況下,建立全像攝影背景緩衝區資源並管理資源存留期。
- 處理 注視 輸入,並辨識 手勢。
- 進入全螢幕身歷聲轉譯模式。
如何開始使用?
請先安裝工具,遵循下載 Visual Studio 2019 和Windows Mixed Reality應用程式範本的指示。 混合實境應用程式範本可在 Visual Studio Marketplace 上以 Web 下載的形式提供,或透過 Visual Studio UI 將它們安裝為延伸模組。
現在您已準備好建立 DirectX 11 Windows Mixed Reality應用程式! 請注意,若要移除範例內容,請在pch.h中批註化DRAW_SAMPLE_CONTENT預處理器指示詞。
建立 UWP 專案
安裝工具之後,您就可以建立全像攝影 DirectX UWP 專案。
若要在 Visual Studio 2019 中建立新專案:
- 啟動 Visual Studio。
- 在右側的 [ 開始使用 ] 區段中,選取 [ 建立新專案]。
- 在 [建立新專案] 對話方塊的下拉式功能表中,選取[C++]、[Windows Mixed Reality] 和[UWP]。
- 選取 [全像攝影 DirectX 11 應用程式 (通用 Windows) (C++/WinRT) ]。
Visual Studio 2019 中的全像攝影 DirectX 11 C++/WinRT UWP 應用程式專案範本重要
請確定專案範本的名稱包含 「 (C++/WinRT) 」。 如果沒有,您已安裝舊版的全像攝影專案範本。 若要取得最新的專案範本, 請將其安裝 為 Visual Studio 2019 的延伸模組。
- 選取 [下一步] 。
- 填寫 [專案名稱 ] 和 [ 位置] 文字方塊,然後選取或點選 [ 建立]。 會建立全像攝影應用程式專案。
- 針對僅限HoloLens 2的開發目標,請確定[目標版本] 和 [最低版本] 設定為Windows 10 1903版。 如果您也以 HoloLens (第 1 代) 或桌面Windows Mixed Reality頭戴式裝置為目標,您可以將[最低版本] 設定為[Windows 10 版本 1809]。 當您使用HoloLens 2的新功能時,這需要程式碼中的一些版本調適型檢查。
將Windows 10版本 1903設定為目標和最低版本重要
如果您沒有看到Windows 10版本 1903作為選項,則未安裝最新的Windows 10 SDK。 若要取得此選項,請安裝 10.0.18362.0 版或更新版本的 Windows 10 SDK。
若要在 Visual Studio 2017 中建立新專案:
- 啟動 Visual Studio。
- 從 [ 檔案] 功能表中,指向 [ 新增 ],然後從操作功能表中選取 [ 專案 ]。 [新增專案] 對話方塊隨即開啟。
- 展開左側的 [已安裝] ,然後展開 [Visual C++ 語言] 節點。
- 流覽至 [Windows 通用 > 全像攝影 ] 節點,然後選取 [ 全像攝影 DirectX 11 應用程式 (通用 Windows) (C++/WinRT) 。
Visual Studio 2017 中的全像攝影 DirectX 11 C++/WinRT UWP app 專案範本重要
請確定專案範本的名稱包含 「 (C++/WinRT) 」。 如果沒有,您已安裝舊版的全像攝影專案範本。 若要取得最新的專案範本, 請將其安裝 為 Visual Studio 2017 的延伸模組。
- 填寫 [ 名稱 ] 和 [ 位置] 文字方塊,然後選取或點選 [ 確定]。 會建立全像攝影應用程式專案。
- 針對僅限HoloLens 2的開發目標,請確定[目標版本] 和 [最低版本] 設定為Windows 10 1903版。 如果您也以 HoloLens (第 1 代) 或桌面Windows Mixed Reality頭戴式裝置為目標,您可以將[最低版本] 設定為[Windows 10 版本 1809]。 當您使用HoloLens 2的新功能時,這需要程式碼中的一些版本調適型檢查。
將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 公尺的世界鎖定 Cube。 使用者可以 空中點 選或按下控制器上的按鈕,將 Cube 放在使用者 注視所指定的不同位置。 您可以修改此專案來建立任何混合實境應用程式。
您也可以使用以 SharpDX 為基礎的 Visual C# 全像攝影專案範本來建立新專案。 如果您的全像攝影 C# 專案不是從 Windows Holographic 應用程式範本開始,您必須從 Windows Mixed Reality C# 範本專案複製 ms.fxcompile.targets 檔案,並將它匯入 your.csproj 檔案中,以編譯您新增至專案的 HLSL 檔案。 Visual Studio Windows Mixed Reality應用程式範本延伸模組中也會提供 Direct3D 12 範本。
如需有關如何建置範例並將其部署至 HoloLens、已連結沉浸式裝置的電腦或模擬器的相關資訊,請參閱 使用 Visual Studio 部署和 偵錯。
下列其餘指示會假設您使用 C++ 來建置應用程式。
UWP app 進入點
您的全像攝影 UWP app 會在 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 公尺的世界鎖定 Cube。 使用者可以按下控制器上的按鈕,將 Cube 放在使用者 注視所指定的不同位置。 您可以修改此專案來建立任何混合實境應用程式。
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。
轉譯全像攝影內容
專案的 Content 資料夾包含類別,用於在 全像攝影空間中轉譯全像投影。 範本中的預設全像投影是旋轉立方體,其距離使用者距離 2 公尺。 繪製此 Cube 是在 SpinningCubeRenderer.cpp中實作的,其中包含下列索引鍵方法:
方法 | 說明 |
---|---|
CreateDeviceDependentResources |
載入著色器並建立 Cube 網格。 |
PositionHologram |
將全像投影放在所提供 SpatialPointerPose所指定的位置。 |
Update |
旋轉立方體,並設定模型矩陣。 |
Render |
使用頂點和圖元著色器呈現框架。 |
著色器子資料夾包含四個預設著色器實作:
著色器 | 說明 |
---|---|
GeometryShader.hlsl |
傳遞,讓幾何保持未修改。 |
PixelShader.hlsl |
通過色彩資料。 色彩資料會在點陣化步驟中插入並指派給圖元。 |
VertexShader.hlsl |
在 GPU 上執行頂點處理的簡單著色器。 |
VPRTVertexShader.hlsl |
在 GPU 上執行頂點處理的簡單著色器,已針對Windows Mixed Reality身歷聲轉譯進行優化。 |
VertexShaderShared.hlsl
包含 與 VPRTVertexShader.hlsl
之間 VertexShader.hlsl
共用的通用程式碼。
注意:Direct3D 12 應用程式範本也包含 ViewInstancingVertexShader.hlsl
。 此變體會使用 D3D12 選擇性功能,更有效率地轉譯身歷聲影像。
著色器會在建置專案時編譯,並在 SpinningCubeRenderer::CreateDeviceDependentResources 方法中載入。
與您的全像投影互動
在 SpatialInputHandler 類別中會處理使用者輸入,這會取得 SpatialInteractionManager 實例並訂閱 SourcePressed 事件。 這可讓您偵測空中點選手勢和其他空間輸入事件。
更新全像攝影內容
您的混合實境應用程式會在遊戲迴圈中更新,預設會在 的 AppMain.cpp
Update方法中實作。
Update方法會更新場景物件,例如旋轉 Cube,並傳回HolographicFrame物件,用來取得最新的檢視和投影矩陣,以及呈現交換鏈結。
中的 AppMain.cpp
Render方法會採用HolographicFrame,並根據目前的應用程式和空間定位狀態,將目前畫面呈現至每個全像攝影機。
備註
Windows Mixed Reality應用程式範本現在支援使用已啟用 Spectre 風險降低旗標的編譯, (/Qspectre) 。 在編譯已啟用 Spectre 風險降低功能的設定之前,請務必先安裝可降低Microsoft Visual C++ (MSVC) 執行時間程式庫的 Spectre 風險降低版本。 若要安裝 Spectre 緩和 C++ 程式庫,請啟動Visual Studio 安裝程式,然後選取 [修改]。 流覽至 [個別元件 ],並搜尋 「spectre」。 選取對應至您需要編譯 Spectre 緩和程式碼的目標平臺和 MSVC 版本的方塊,然後按一下 [ 修改 ] 開始安裝。