相機
為了確保本機和遠端轉譯的內容可以順暢地複合,各種相機屬性必須在伺服器和用戶端之間保持同步。 最值得注意的是相機轉換和投影。 例如,本機轉譯的內容必須使用與最近遠端畫面轉譯相同的相機轉換和投影。
在上圖中,相較于伺服器傳送的遠端畫面,本機相機已移動。 因此,本機內容必須從與遠端畫面相同的檢視方塊轉譯,最後產生的影像會重新投影到本機相機空間,這會在後期重現 中 詳細說明。
遠端和本機轉譯之間的延遲表示這些設定的任何變更會套用延遲。 因此,任何新的值都不能立即使用相同的框架。
您可以在相機設定上設定近遠平面距離。 在 HoloLens 2 上,剩餘的轉換和投影資料是由硬體所定義。 使用 桌面模擬 時,會透過其 Update
函式的輸入來設定它們。
一旦第一個遠端畫面到達時,就可以在本機使用變更的值。 在 HoloLens 2 上,要用於轉譯的資料是由 HolographicFrame 提供 ,就像任何其他全像攝影應用程式中一樣。 在桌面模擬 上 ,會透過函 Update
式的輸出擷取它們。
相機設定
相機設定上可以變更下列屬性:
近遠平面:
為了確保無法設定不正確範圍,NearPlane 和 FarPlane 屬性是唯讀的, 而且有個別 的函式 SetNearAndFarPlane 可以變更範圍。 此資料將會傳送至框架結尾的伺服器。 設定這些值時, NearPlane 必須小於 FarPlane 。 否則會發生錯誤。
重要
在 Unity 中,變更靠近和遠端平面的主相機時,會自動處理此動作。
EnableDepth :
有時候,為了偵錯目的,停用遠端映射的深度緩衝區寫入會很有説明。 停用深度也會阻止伺服器傳送深度資料,因而降低頻寬。
提示
在 Unity 中,提供名為 EnableDepthComponent 的偵錯元件,可用來在編輯器 UI 中切換此功能。
InverseDepth :
注意
只有當 設定為 true
時 EnableDepth
,這個設定才重要。 否則,此設定不會有任何影響。
深度緩衝區通常會在 [0] 的浮點範圍中記錄 z 值;1],0 表示近平面深度,1 表示遠平面深度。 您也可以反轉此範圍,並將深度值記錄在範圍 [1;0],也就是說,近平面深度會變成 1,遠平面深度會變成 0。 一般而言,後者可改善在非線性 z 範圍之間浮點精確度的分佈。
警告
常見的方法是反轉相機物件上的近平面和遠平面值。 在 上 CameraSettings
嘗試此作業時,Azure 遠端轉譯會失敗併發生錯誤。
Azure 遠端轉譯 API 必須知道本機轉譯器的深度緩衝區慣例,才能正確撰寫遠端深度到本機深度緩衝區。 如果您的深度緩衝區範圍是 [0;1] 將此旗標保留為 false
。 如果您使用反向深度緩衝區搭配 [1;0] 範圍,將 InverseDepth
旗標設定為 true
。
注意
針對 Unity,已套用正確的設定, RenderingConnection
因此不需要手動介入。
您可以變更相機設定,如下所示:
void ChangeCameraSetting(RenderingSession session)
{
CameraSettings settings = session.Connection.CameraSettings;
settings.SetNearAndFarPlane(0.1f, 20.0f);
settings.EnableDepth = false;
settings.InverseDepth = false;
}
void ChangeCameraSetting(ApiHandle<RenderingSession> session)
{
ApiHandle<CameraSettings> settings = session->Connection()->GetCameraSettings();
settings->SetNearAndFarPlane(0.1f, 20.0f);
settings->SetEnableDepth(false);
settings->SetInverseDepth(false);
}