Partilhar via


Câmara

Para garantir que o conteúdo renderizado local e remotamente possa ser composto perfeitamente, várias propriedades da câmera precisam permanecer sincronizadas entre o servidor e o cliente. Mais notavelmente a transformação da câmera e projeção. Por exemplo, o conteúdo renderizado localmente deve usar a mesma transformação de câmera e projeção com a qual o quadro remoto mais recente foi renderizado.

Local and remote camera

Na imagem acima, a câmera local se moveu em comparação com o quadro remoto enviado pelo servidor. Como resultado, o conteúdo local precisa ser renderizado da mesma perspetiva do quadro remoto e, finalmente, a imagem resultante é reprojetada no espaço da câmera local, o que é explicado em detalhes na reprojeção em estágio avançado.

O atraso entre a renderização remota e local significa que qualquer alteração dessas configurações é aplicada com um atraso. Portanto, qualquer novo valor não pode ser usado imediatamente no mesmo quadro.

As distâncias de plano perto e longe podem ser definidas nas configurações da câmera. No HoloLens 2, os dados de transformação e projeção restantes são definidos pelo hardware. Ao usar a simulação de desktop, eles são definidos através da entrada de sua Update função.

Os valores alterados podem ser usados localmente assim que chegar o primeiro quadro remoto que foi renderizado com eles. No HoloLens 2, os dados a serem usados para renderização são fornecidos pelo HolographicFrame como em qualquer outro aplicativo holográfico. Na simulação de desktop, eles são recuperados através da saída da Update função.

Configurações da câmera

As seguintes propriedades podem ser alteradas nas configurações da câmera:

Avião próximo e distante:

Para garantir que nenhum intervalo inválido possa ser definido, as propriedades NearPlane e FarPlane são somente leitura e uma função separada SetNearAndFarPlane existe para alterar o intervalo. Estes dados serão enviados para o servidor no final do quadro. Ao definir esses valores, NearPlane precisa ser menor que FarPlane. Caso contrário, ocorrerá um erro.

Importante

Em Unity isso é tratado automaticamente ao mudar a câmera principal perto e longe planos.

EnableDepth:

Às vezes, é útil desativar a gravação do buffer de profundidade da imagem remota para fins de depuração. A desativação da profundidade também impedirá o servidor de enviar dados de profundidade, reduzindo assim a largura de banda.

Gorjeta

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:

Nota

Essa configuração só é importante se EnableDepth estiver definida como true. Caso contrário, essa configuração não terá impacto.

Os buffers de profundidade normalmente registram valores z em um intervalo de ponto flutuante de [0; 1], com 0 denotando a profundidade do plano próximo e 1 denotando a profundidade do plano distante. Também é possível inverter este intervalo e registar valores de profundidade no intervalo [1; 0], ou seja, a profundidade do plano próximo torna-se 1 e a profundidade do plano distante torna-se 0. Geralmente, este último melhora a distribuição da precisão do ponto flutuante através da faixa z não linear.

Aviso

Uma abordagem comum é inverter os valores de plano próximo e plano distante nos objetos da câmera. Isso falhará para a CameraSettingsRenderização Remota do Azure com um erro ao tentar isso no .

A API de Renderização Remota do Azure precisa saber sobre a convenção de buffer de profundidade do renderizador local para compor corretamente a profundidade remota no buffer de profundidade local. Se o intervalo do buffer de profundidade for [0; 1] deixe esta bandeira como false. Se utilizar uma memória intermédia de profundidade invertida com um [1; 0] intervalo, defina a InverseDepth bandeira como true.

Nota

Para Unity, a configuração correta já é aplicada pelo RenderingConnection portanto, não há necessidade de intervenção manual.

Alterar as configurações da câmera pode ser feito 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

Próximos passos