全像投影防震 — MRTK2
效能
為了讓基礎混合實境平臺和裝置產生最佳結果,請務必達到執行幀速率。 目標幀速率(例如:60 FPS 或 90 FPS)會因平臺和裝置而異。 不過,混合實境應用程式會議幀速率會有穩定的全像投影,以及有效率的頭部追蹤、手部追蹤等。
環境追蹤
穩定的全像攝影轉譯嚴重依賴平臺和裝置的頭部姿勢追蹤。 Unity 會呈現基礎平台所估計和提供之相機中每個畫面的場景。 如果此追蹤未正確遵循實際的頭部移動,則全像投影看起來會呈現不正確。 對於 HoloLens 這類 AR 裝置來說,這特別明顯且重要,用戶可以將虛擬全像投影與真實世界產生關聯。 效能對於可靠的頭部追蹤而言相當重要,但也有 其他重要的功能。 影響用戶體驗的環境元素類型將取決於目標平台細節。
Windows Mixed Reality
Windows Mixed Reality 平臺提供一些 參考數據 ,以穩定平臺上的全像投影。 不過,開發人員可以使用少數重要工具來改善使用者的全像投影視覺體驗。
深度緩衝區共用
Unity 開發人員可以選擇與平臺共用應用程式的深度緩衝區。 這會提供目前框架的全像投影存在的信息,平臺可透過稱為「晚期重新投影」的硬體輔助程式,利用這個資訊來穩定全像投影。
晚期重新投影
在轉譯框架結束時,Windows Mixed Reality 平臺會採用應用程式所產生的色彩和深度轉譯目標,並將最終螢幕輸出轉換成考慮自最後一個頭部姿勢預測之後的任何輕微頭部移動。 應用程式的遊戲迴圈需要執行時間。 例如,在 60 FPS 時,這表示應用程式會採用 ~16.667 毫秒來轉譯畫面。 即使這似乎是微不足道的時間量,用戶頭部的位置和方向也會改變,導致相機在轉譯時產生新的投影矩陣。 晚期重新投影會轉換最終影像中的圖元,以考慮這個新檢視方塊。
每像素與防震平面 LSR
根據在 Windows Mixed Reality 裝置上執行的裝置端點和 OS 版本,「晚期重新剖析」演算法將會透過 穩定平面執行。
以每圖元深度為基礎
以每圖元深度為基礎的重現涉及利用深度緩衝區來修改每個圖元的影像輸出,從而在各種距離穩定全像投影。 例如,距離 1 米的球體可能位於距離 10 米遠的柱子前面。 代表球體的圖元會有不同的轉換,如果使用者稍微傾斜頭部,則表示柱形的遠距離圖元。 每個圖元的重新剖析都會考慮到每個圖元的距離差異,以取得更精確的重現。
穩定平面
如果無法建立精確的深度緩衝區來與平台共用,另一種形式的 LSR 會利用穩定平面。 場景中的所有全像投影都會接收一些防震,但所要平面中全像投影將會收到最大硬體防震。 平面的點和標準可以透過 Unity 提供的 HolographicSettings.SetFocusPointForFrame API 提供給平臺。
深度緩衝區格式
如果以 HoloLens 為目標進行開發,強烈建議使用與 24 位相比的 16 位深度緩衝區格式。 雖然深度值會降低精確度,但這可以大幅節省效能。 為了補償較低的精確度並避免 z 戰鬥,建議從 Unity 所設定的 1000m 預設值減少 遠夾平面 。
注意
如果使用16位深度格式,樣板緩衝區所需的效果將無法運作,因為 Unity 不會在此設定中建立樣板緩衝區。 如果端點圖形平臺上適用,則選取 24 位深度格式通常會建立 8 位樣板緩衝區。
Unity 中的深度緩衝區共用
為了利用深度型 LSR,開發人員需要採取兩個重要步驟。
- 在 [編輯>項目設定>] 下的 [播放>程式 XR 設定>] [虛擬現實 SDK] 下>,啟用深度緩衝區共用
- 如果以 HoloLens 為目標,建議選取 16 位深度格式 。
- 在畫面上呈現色彩時,也會轉譯深度
Unity 中的不透明 GameObject 通常會自動寫入深度。 不過,透明和文字物件通常預設不會寫入深度。 如果利用 MRTK 標準著色器或文字網格 Pro,這可以輕鬆地修正。
注意
若要快速判斷場景中哪些物件不會以視覺方式寫入深度緩衝區,您可以在 MRTK 組態配置檔的 [編輯器設定] 下使用 [轉譯深度緩衝區] 公用程式。
透明 MRTK 標準著色器
針對使用 MRTK 標準著色器的透明材質,請選取材質以在 偵測器 視窗中檢視。 然後按兩下 [ 立即修正] 按鈕,將材質轉換成深度(即 Z-Write On)。
之前
之後
文字網格專業版
針對 Text Mesh Pro 物件,選取 TMP GameObject 以在偵測器中檢視它。 在材質元件下,將指派材質的著色器切換為使用 MRTK TextMeshPro 著色器。
自定義著色器
如果撰寫自定義著色器,請將 ZWrite 旗標新增至 Pass 區塊定義頂端,以設定著色器寫入深度緩衝區。
Shader "Custom/MyShader"
{
SubShader
{
Pass
{
...
ZWrite On
...
}
}
}
不透明備份
如果上述方法不適用於指定的案例(也就是使用 Unity UI),則可能會有另一個物件寫入深度緩衝區。 常見的範例是在場景中的浮動面板上使用 Unity UI 文字。 藉由使面板不透明或至少寫入深度,那麼兩個文字和面板都會由平臺穩定,因為它們的 z 值彼此如此接近。
WorldAnchors (HoloLens)
除了確保符合正確的組態以確保視覺穩定性之外,請務必確保全像投影在正確的實體位置保持穩定。 為了在實體空間的重要位置通知平臺,開發人員可以利用 GameObjects 上的 WorldAnchors ,而該位置需要留在一個地方。 WorldAnchor 是新增至 GameObject 的元件,可完全控制該物件的轉換。
HoloLens 之類的裝置會持續掃描及了解環境。 因此,當 HoloLens 追蹤空間中的行動和位置時,其估計值將會更新, 並調整 Unity 座標系統。 例如,如果GameObject從相機開始放置1公尺,當HoloLens追蹤環境時,它可能會意識到GameObject所在的實體點實際上距離1.1公尺遠。 這會導致全像投影漂移。 將 WorldAnchor 套用至 GameObject 可讓錨點控制物件的轉換,讓物件保留在正確的實體位置(也就是在運行時間更新為 1.1m,而不是 1m)。 若要跨應用程式會話保存 WorldAnchors,開發人員可以使用 WorldAnchorStore 來儲存和載入 WorldAnchors。
注意
一旦將 WorldAnchor 元件新增至 GameObject,就無法修改 GameObject 的轉換(也就是 transform.position = x)。 開發人員必須移除 WorldAnchor 才能編輯轉換。
WorldAnchor m_anchor;
public void AddAnchor()
{
this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}
public void RemoveAnchor()
{
DestroyImmediate(m_anchor);
}
如果您想要手動使用 Anchors 的替代方案,請參閱Microsoft世界鎖定工具。