Estabilização de holograma – MRTK2

Desempenho

Para que a plataforma e o dispositivo de realidade misturada subjacentes produzam os melhores resultados, é importante obter taxas de quadros com 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ão 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çalho 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 aparecerã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á um punhado de ferramentas principais 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 existem hologramas para um quadro atual, que a plataforma pode utilizar para estabilizar hologramas por meio de um processo assistido por hardware conhecido como Late-Stage Reprojeção.

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 de tela final para considerar qualquer leve movimentação de cabeçalho 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á tomando ~16.667ms para renderizar um quadro. Embora isso possa parecer uma quantidade minúscula de tempo, a posição e a orientação do usuário 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 LSR do 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 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 a cabeça ligeiramente. 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 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 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 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>Player>XR Configurações> DKs > de RealidadeVirtual habilitam o compartilhamento de buffer de profundidade
    1. Se o destino HoloLens, é recomendável selecionar também o formato de profundidade de 16 bits.
  2. Ao renderizar a cor na tela, renderize a profundidade 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 pode ser facilmente corrigido.

Observação

Para determinar rapidamente quais objetos em uma cena não gravam no buffer de profundidade visualmente, é 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 que usam 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 de Texto, selecione o TMP GameObject 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 de passagem 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 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 HoloLens estão constantemente verificando e aprendendo sobre o ambiente. Assim, à medida que o HoloLens rastreia a posição de movimento & 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, como o HoloLens acompanha o ambiente, ele poderá perceber que o ponto físico onde o GameObject está localizado está realmente a 1,1m de distância. Isso resultaria na deriva 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 em sessões de aplicativo, os desenvolvedores podem empregar o WorldAnchorStore para salvar e carregar WorldAnchors.

Observação

Depois que um componente WorldAnchor for 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