Estabilização do holograma

Desempenho

Para que a plataforma de realidade misturada subjacente e o dispositivo produzam os melhores resultados, é importante obter taxas de quadros de desempenho. A taxa de quadros de destino (ex: 60 FPS ou 90 FPS) variará entre plataformas e dispositivos. No entanto, a taxa de quadros de reunião de aplicativos de realidade misturada terá hologramas estáveis, bem como controle de cabeça eficiente, acompanhamento manual e muito mais.

Acompanhamento de ambiente

A renderização holográfica estável depende muito do acompanhamento de pose de cabeça pelo dispositivo de plataforma & . O Unity renderizará a cena a cada quadro da pose da câmera estimada e fornecida pela plataforma subjacente. Se esse acompanhamento não seguir corretamente o movimento real da cabeça, os hologramas parecerão visualmente imprecisos. Isso é especialmente evidente e importante para dispositivos AR como HoloLens em que os usuários podem relacionar hologramas virtuais ao mundo real. O desempenho é significativo para o acompanhamento de cabeçalho confiável, mas também pode haver outros recursos importantes. Os tipos de elementos de ambiente que afetam a experiência do usuário dependerão das especificidades da plataforma de destino.

Windows Mixed Reality

A plataforma Windows Mixed Reality fornece algum material de referência para estabilizar hologramas na plataforma. Há algumas ferramentas importantes que os desenvolvedores podem utilizar para melhorar a experiência visual do holograma para os usuários.

Compartilhamento de buffer de profundidade

Os desenvolvedores do Unity têm a opção de compartilhar o buffer de profundidade do aplicativo com a plataforma. Isso fornece informações, em que os hologramas existem para um quadro atual, que a plataforma pode utilizar para estabilizar hologramas por meio de um processo assistido por hardware conhecido como Late-Stage Reprojection.

Reprojeção em estágio final

No final da renderização de um quadro, a plataforma Windows Mixed Reality usa os destinos de renderização de profundidade de cor & produzidos pelo aplicativo e transforma a saída da tela final para considerar qualquer leve movimentação da cabeça desde a última previsão de pose de cabeçalho. O loop de jogo de um aplicativo leva tempo para ser executado. Por exemplo, a 60 FPS, isso significa que o aplicativo está levando ~16.667ms para renderizar um quadro. Embora isso possa parecer uma quantidade minúscula de tempo, a posição do usuário e a orientação de sua cabeça serão alteradas, resultando em novas matrizes de projeção para a câmera na renderização. A reprojeção em estágio final transforma os pixels na imagem final para considerar essa nova perspectiva.

Por pixel versus plano de estabilização LSR

Dependendo do ponto de extremidade do dispositivo e da versão do sistema operacional em execução em um dispositivo Windows Mixed Reality, o algoritmo Late-Stage Reprojeção será executado por pixel ou por meio de um plano de estabilização.

Baseado em profundidade por pixel

A reprojeção baseada em profundidade por pixel envolve a utilização do buffer de profundidade para modificar a saída da imagem por pixel e, portanto, estabilizar hologramas a várias distâncias. Por exemplo, uma esfera a 1m de distância pode estar na frente de um pilar que está a 10m de distância. Os pixels que representam a esfera terão uma transformação diferente dos pixels distantes que representam o pilar se o usuário inclinar ligeiramente a cabeça. A reprojeção por pixel levará em conta essa diferença de distância em cada pixel para reprojeção mais precisa.

Plano de estabilização

Se não for possível criar um buffer de profundidade preciso para compartilhar com a plataforma, outra forma de LSR utilizará um plano de estabilização. Todos os hologramas em uma cena receberão alguma estabilização, mas os hologramas deitados no plano desejado receberão a estabilização máxima de hardware. O ponto e o normal para o plano podem ser fornecidos à plataforma por meio do HolographicSettings.SetFocusPointForFrameAPIfornecido pelo Unity.

Formato de buffer de profundidade

Se o direcionamento HoloLens para desenvolvimento, é altamente recomendável utilizar o formato de buffer de profundidade de 16 bits em comparação com 24 bits. Isso pode economizar tremendamente no desempenho, embora os valores de profundidade tenham menos precisão. Para compensar a precisão inferior e evitar o combate z, é recomendável reduzir o plano de clipe distante do valor padrão de 1000m definido pelo Unity.

Observação

Se estiver usando o formato de profundidade de 16 bits, os efeitos necessários do buffer de estêncil não funcionarão porque o Unity não cria um buffer de estêncil nessa configuração. Selecionar o formato de profundidade de 24 bits por outro lado geralmente criará um buffer de estêncil de 8 bits, se aplicável na plataforma de gráficos do ponto de extremidade.

Compartilhamento de buffer de profundidade no Unity

Para utilizar o LSR baseado em profundidade, há duas etapas importantes que os desenvolvedores precisam executar.

  1. Em Editar>Project Configurações>PlayerXR> Configurações > DKs > de realidadevirtual habilitam o compartilhamento de buffer de profundidade
    1. Se estiver direcionando HoloLens, também é recomendável selecionar o formato de profundidade de 16 bits.
  2. Ao renderizar a cor na tela, a profundidade de renderização também

GameObjects opacos no Unity geralmente gravarão em profundidade automaticamente. No entanto, objetos de texto transparente & geralmente não gravarão em profundidade por padrão. Se utilizar o sombreador padrão mrtk ou Mesh Pro de texto, isso poderá ser facilmente remediado.

Observação

Para determinar rapidamente quais objetos em uma cena não gravam visualmente no buffer de profundidade, é possível usar o utilitário Buffer de Profundidade de Renderização no editor Configurações no perfil de Configuração do MRTK.

Sombreador Transparente MRTK Standard

Para materiais transparentes usando o sombreador MRTK Standard, selecione o material para exibi-lo na janela Inspetor . Em seguida, clique no botão Corrigir Agora para converter o material para gravar em profundidade (ou seja, Z-Write On).

Antes

Depth Buffer Before Fix MRTK Standard Shader

After (após)

Depth Buffer Fixed MRTK Standard Shader

Mesh Pro de texto

Para objetos Mesh Pro texto, selecione o GameObject do TMP para exibi-lo no inspetor. No componente material, alterne o sombreador para o material atribuído para usar o sombreador TEXTMeshPro do MRTK.

Text Mesh Pro Depth Buffer Fix

Sombreador personalizado

Se estiver escrevendo um sombreador personalizado, adicione o sinalizador ZWrite à parte superior da definição de bloco pass para configurar o sombreador a ser gravado no buffer de profundidade.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Backups opacos

Se os métodos acima não funcionarem para um determinado cenário (ou seja, usando a interface do usuário do Unity), é possível que outro objeto seja gravado no buffer de profundidade. Um exemplo comum é usar o Texto da Interface do Usuário do Unity em um painel flutuante em uma cena. Ao tornar o painel opaco ou pelo menos gravar em profundidade, o painel & será estabilizado pela plataforma, pois seus valores z estão tão próximos um do outro.

WorldAnchors (HoloLens)

Além de garantir que as configurações corretas sejam atendidas para garantir a estabilidade visual, é importante garantir que os hologramas permaneçam estáveis em seus locais físicos corretos. Para informar a plataforma sobre locais importantes em um espaço físico, os desenvolvedores podem aproveitar WorldAnchors em GameObjects que precisam ficar em um só lugar. Um WorldAnchor é um componente adicionado a um GameObject que assume o controle absoluto sobre a transformação desse objeto.

Dispositivos como HoloLens estão constantemente verificando e aprendendo sobre o ambiente. Assim, como o HoloLens controla a posição de movimentação & no espaço, suas estimativas serão atualizadas e o sistema de coordenadas do Unity ajustado. Por exemplo, se um GameObject for colocado a 1m da câmera no início, como o HoloLens acompanha o ambiente, ele poderá perceber que o ponto físico em que o GameObject está localizado está realmente a 1,1 m de distância. Isso resultaria na descompasso do holograma. Aplicar um WorldAnchor a um GameObject permitirá que a âncora controle a transformação do objeto para que o objeto permaneça no local físico correto (ou seja, atualize para 1,1 m de distância em vez de 1m no runtime). Para persistir o WorldAnchors em sessões de aplicativo, os desenvolvedores podem empregar o WorldAnchorStore para salvar e carregar WorldAnchors.

Observação

Depois que um componente WorldAnchor tiver sido adicionado a um GameObject, não é possível modificar a transformação do GameObject (ou seja, transform.position = x). Um desenvolvedor deve remover o WorldAnchor para editar a transformação.

WorldAnchor m_anchor;

public void AddAnchor()
{
    this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}

public void RemoveAnchor()
{
    DestroyImmediate(m_anchor);
}

Se você quiser uma alternativa para trabalhar manualmente com Âncoras, confira as Ferramentas de Bloqueio do Microsoft World.

Veja também