Kamera
Aby upewnić się, że zawartość lokalnie i zdalnie renderowana może być bezproblemowo złożona, różne właściwości aparatu muszą pozostać zsynchronizowane między serwerem a klientem. Przede wszystkim transformacja i projekcja aparatu. Na przykład zawartość renderowana lokalnie musi używać tej samej transformacji aparatu i projekcji, z którą została renderowana najnowsza ramka zdalna.
Na powyższej ilustracji aparat lokalny został przeniesiony w porównaniu z ramką zdalną wysłaną przez serwer. W związku z tym zawartość lokalna musi być renderowana z tej samej perspektywy co ramka zdalna, a na koniec wynikowy obraz jest ponownie projektowany w lokalnej przestrzeni aparatu, co zostało szczegółowo wyjaśnione w późnym etapie ponownego projektu.
Opóźnienie między zdalnym i lokalnym renderowaniem oznacza, że każda zmiana tych ustawień jest stosowana z opóźnieniem. W związku z tym żadna nowa wartość nie może być używana natychmiast w tej samej ramce.
Odległości bliskiej i dalekiej płaszczyzny można ustawić na ustawieniach aparatu. Na urządzeniu HoloLens 2 pozostałe dane przekształcania i projekcji są definiowane przez sprzęt. W przypadku korzystania z symulacji pulpitu są one ustawiane za pośrednictwem danych wejściowych jego Update
funkcji.
Zmienione wartości można używać lokalnie natychmiast po nadejściu pierwszej ramki zdalnej, która została z nimi renderowana. Na urządzeniu HoloLens 2 dane, które mają być używane do renderowania, są dostarczane przez element HolographicFrame tak samo jak w każdej innej aplikacji holograficznej. W symulacji klasycznej są one pobierane za pośrednictwem danych wyjściowych Update
funkcji.
ustawienia Aparat
W ustawieniach aparatu można zmienić następujące właściwości:
Bliski i daleki samolot:
Aby upewnić się, że nie można ustawić nieprawidłowych zakresów, właściwości NearPlane i FarPlane są tylko do odczytu, a osobna funkcja SetNearAndFarPlane istnieje, aby zmienić zakres. Te dane zostaną wysłane na serwer na końcu ramki. Podczas ustawiania tych wartości parametr NearPlane musi być mniejszy niż FarPlane. W przeciwnym razie wystąpi błąd.
Ważne
W aparacie Unity jest to obsługiwane automatycznie podczas zmieniania głównego aparatu w pobliżu i na dalekich płaszczyznach.
EnableDepth:
Czasami warto wyłączyć zapis buforu głębokości obrazu zdalnego na potrzeby debugowania. Wyłączenie głębokości spowoduje również zatrzymanie wysyłania danych głębokości przez serwer, co zmniejsza przepustowość.
Napiwek
W a unity jest dostarczany składnik debugowania o nazwie EnableDepthComponent , który może służyć do przełączania tej funkcji w interfejsie użytkownika edytora.
Odwrotność:
Uwaga
To ustawienie jest ważne tylko wtedy, gdy EnableDepth
jest ustawione na true
wartość . W przeciwnym razie to ustawienie nie ma wpływu.
Bufory głębokości zwykle rejestrują wartości z w zakresie zmiennoprzecinkowym [0; 1], z 0 oznaczając głębokość bliskiej płaszczyzny i 1 oznaczającą głębokość dalekiej płaszczyzny. Istnieje również możliwość odwrócenia tego zakresu i rekordu wartości głębokości w zakresie [1; 0], czyli głębokość bliskiej płaszczyzny staje się 1, a głębokość dalekiej płaszczyzny staje się 0. Ogólnie rzecz biorąc, ten ostatni poprawia rozkład dokładności zmiennoprzecinkowych w nieliniowym zakresie z.
Ostrzeżenie
Typowym podejściem jest odwrócenie wartości bliskiej płaszczyzny i dalekiej płaszczyzny na obiektach kamery. Nie powiedzie się to w przypadku usługi Azure Remote Rendering z powodu błędu podczas próby w pliku CameraSettings
.
Interfejs API usługi Azure Remote Rendering musi wiedzieć o konwencji buforu głębokości lokalnego modułu renderowania, aby poprawnie utworzyć zdalną głębię w lokalnym buforze głębokości. Jeśli zakres buforu głębokości wynosi [0; 1] pozostaw tę flagę jako false
. Jeśli używasz buforu głębokości odwróconej z [1; 0] zakres, ustaw flagę InverseDepth
na true
.
Uwaga
W przypadku aparatu Unity poprawne ustawienie jest już stosowane przez RenderingConnection
element , więc nie ma potrzeby ręcznej interwencji.
Zmianę ustawień aparatu można wykonać w następujący sposób:
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);
}
Dokumentacja interfejsu API
- AparatUstawienia języka C#
- AparatUstawienia języka C++
- C# GraphicsBindingSimD3d11.Update, funkcja
- C++ GraphicsBindingSimD3d11::Update, funkcja