Estabilização de holograma – MRTK2

Desempenho

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

Acompanhamento de ambiente

A renderização holográfica estável depende muito do acompanhamento de pose de cabeça pela plataforma & dispositivo. 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 o HoloLens, em que os usuários podem relacionar hologramas virtuais ao mundo real. O desempenho é significativo para o acompanhamento de cabeça 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 especificações 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 das principais ferramentas 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, onde 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 de estágio tardio

No final da renderização de um quadro, a plataforma Windows Mixed Reality usa a cor & destinos de renderização de profundidade produzidos pelo aplicativo e transforma a saída da tela final para levar em conta 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 cerca de 16.667ms para renderizar um quadro. Embora isso possa parecer uma quantidade mínima de tempo, a posição e a orientação da cabeça do usuário mudarão, 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.

LSR por pixel versus plano de estabilização

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 Reprojection 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 de 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 tiver inclinado ligeiramente a cabeça. A reprojeção por pixel levará em conta essa diferença de distância em cada pixel para uma 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 no plano desejado receberão a estabilização máxima de hardware. O ponto e o normal para o plano podem ser fornecidos para a plataforma por meio da API HolographicSettings.SetFocusPointForFramefornecida pelo Unity.

Formato de buffer de profundidade

Se estiver direcionando o 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 muito no desempenho, embora os valores de profundidade tenham menos precisão. Para compensar a precisão mais baixa e evitar o z-fighting, é recomendável reduzir o plano de recorte 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 a LSR baseada em profundidade, há duas etapas importantes que os desenvolvedores precisam executar.

  1. Em Editar>Configurações do Projeto Configurações> doPlayer>XR Configurações>SDKs> de Realidade Virtual Habilitar Compartilhamento de Buffer de Profundidade
    1. Se estiver direcionando o HoloLens, também será recomendável selecionar o formato de profundidade de 16 bits .
  2. Ao renderizar a cor na tela, renderize a profundidade também

GameObjects opacos no Unity geralmente serão gravados em profundidade automaticamente. No entanto, objetos de texto transparentes & geralmente não gravarão em profundidade por padrão. Se estiver utilizando o Sombreador Padrão do MRTK ou o Text Mesh Pro, isso poderá ser facilmente remediado.

Observação

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

Sombreador padrão transparente do MRTK

Para materiais transparentes usando o sombreador Padrão do MRTK, 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

Buffer de profundidade antes de corrigir o sombreador padrão do MRTK

After (após)

Sombreador padrão mrtk fixo do buffer de profundidade

Text Mesh Pro

Para objetos Text Mesh Pro, selecione o GameObject TMP para exibi-lo no inspetor. No componente material, alterne o sombreador para que o material atribuído use o sombreador TextMeshPro do MRTK.

Correção do buffer de profundidade pro da malha de texto

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), será 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 texto & painel será estabilizado pela plataforma, pois seus valores z estão tão próximos uns dos outros.

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 o WorldAnchors em GameObjects que precisam permanecer em um só lugar. Um WorldAnchor é um componente adicionado a um GameObject que assume controle absoluto sobre a transformação desse objeto.

Dispositivos como o HoloLens estão constantemente verificando e aprendendo sobre o ambiente. Assim, à medida que o HoloLens rastreia o movimento & posição no espaço, suas estimativas serão atualizadas e o sistema de coordenadas do Unity será ajustado. Por exemplo, se um GameObject for colocado a 1m da câmera no início, à medida que o HoloLens rastreia o ambiente, ele poderá perceber que o ponto físico em que o GameObject está localizado está, na verdade, a 1,1 m de distância. Isso resultaria no 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,1m de distância em vez de 1m no runtime). Para persistir o WorldAnchors entre sessões de aplicativo, os desenvolvedores podem empregar a WorldAnchorStore para salvar e carregar WorldAnchors.

Observação

Depois que um componente WorldAnchor tiver sido adicionado a um GameObject, não será 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, marcar o Microsoft World Locking Tools.

Veja também