Câmera
Para garantir que o conteúdo renderizado local e remotamente possa ser composto perfeitamente, várias propriedades da câmera precisam permanecer em sincronia entre o servidor e o cliente. Especialmente a projeção e a transformação da câmera. Por exemplo, o conteúdo renderizado localmente deve usar a mesma projeção e transformação da câmera usada ao renderizar o quadro remoto mais recente.
Na imagem acima, a câmera local foi movida em comparação com o quadro remoto enviado pelo servidor. Como resultado, o conteúdo local precisa ser renderizado da mesma perspectiva que o quadro remoto e, por fim, a imagem resultante é reprojetada no espaço da câmera local, o que é explicado em detalhes na reprojeção de fase tardia.
O atraso entre a renderização remota e local significa que qualquer alteração nessas configurações será aplicada com atraso. Portanto, qualquer novo valor não pode ser usado imediatamente no mesmo quadro.
As distâncias de plano próximo e distante podem ser definidas nas configurações da câmera. No HoloLens 2, os dados restantes de transformação e projeção são definidos pelo hardware. Ao usar a simulação da área de trabalho, eles são definidos através da entrada de sua função Update
.
Os valores alterados podem ser usados localmente assim que o primeiro quadro remoto renderizado com eles chegar. No HoloLens 2, os dados a serem usados para renderização são fornecidos pelo HolographicFrame, assim como em qualquer outro aplicativo holográfico. Na simulação da área de trabalho, eles são recuperados através da saída da função Update
.
Configurações da câmera
As propriedades a seguir podem ser alteradas nas configurações da câmera:
Plano próximo e distante:
Para garantir que nenhum intervalo inválido possa ser definido, as propriedades NearPlane e FarPlane são somente leitura, e existe uma função separada SetNearAndFarPlane para alterar o intervalo. Esses dados serão enviados ao servidor no final do quadro. Ao definir esses valores, NearPlane precisa ser menor que FarPlane. Caso contrário, ocorrerá um erro.
Importante
No Unity, isso é identificado automaticamente ao alterar os planos próximo e distante da câmera principal.
EnableDepth:
Às vezes, é útil desabilitar a gravação do buffer de profundidade da imagem remota para fins de depuração. A desabilitação da profundidade também impedirá que o servidor envie dados de profundidade, reduzindo, assim, a largura de banda.
Dica
No Unity, é fornecido um componente de depuração chamado EnableDepthComponent, que pode ser usado para alternar esse recurso na interface do usuário do editor.
InverseDepth:
Observação
Essa configuração só será importante se EnableDepth
for definido como true
. Caso contrário, essa configuração não terá nenhum impacto.
Buffers de profundidade normalmente registram valores z em um intervalo de ponto flutuante de [0;1], com 0 indicando a profundidade do plano próximo, e 1 indicando a profundidade do plano distante. Também é possível inverter esse intervalo e registrar valores de profundidade no intervalo [1;0], ou seja, a profundidade do plano próximo se torna 1 e a profundidade do plano distante se torna 0. Em geral, a última opção melhora a distribuição da precisão de ponto flutuante no intervalo z não linear.
Aviso
Uma abordagem comum é inverter os valores do plano próximo e distante nos objetos da câmera. Isso irá falhar no Azure Remote Rendering, com um erro ao tentar isso no CameraSettings
.
A API do Azure Remote Rendering precisa saber sobre a convenção de buffer de profundidade do seu renderizador local para compor corretamente a profundidade remota no buffer de profundidade local. Se o intervalo do buffer de profundidade for [0;1], esse sinalizador deve ser igual a false
. Se você usar um buffer de profundidade invertido com um intervalo de [1;0], defina o sinalizador InverseDepth
como true
.
Observação
Para o Unity, a configuração correta já é aplicada pelo RenderingConnection
, portanto, não há necessidade de intervenção manual.
A alteração das configurações da câmera pode ser feita da seguinte maneira:
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);
}
Documentação da API
- C# CameraSettings
- C++ CameraSettings
- C# GraphicsBindingSimD3d11.Update function
- C++ GraphicsBindingSimD3d11::Update function