Estabilização do holograma — MRTK2

Desempenho

Para que a plataforma e o dispositivo de realidade mista subjacentes produzam os melhores resultados, é importante alcançar o desempenho das taxas de fotogramas. A taxa de fotogramas de destino (por exemplo: 60 FPS ou 90 FPS) irá variar entre plataformas e dispositivos. No entanto, o framerate de reuniões de aplicações de realidade mista terá hologramas estáveis, bem como controlo de cabeça eficiente, controlo de mãos e muito mais.

Controlo de ambiente

A composição holográfica estável depende fortemente do controlo de pose de cabeça pela plataforma & dispositivo. O Unity irá compor a cena a cada fotograma da pose da câmara estimada e fornecida pela plataforma subjacente. Se este controlo não seguir corretamente o movimento real da cabeça, os hologramas aparecerão visualmente imprecisos. Isto é especialmente evidente e importante para dispositivos AR como o HoloLens, onde os utilizadores podem relacionar hologramas virtuais com o mundo real. O desempenho é significativo para um controlo de cabeça fiável, mas também pode haver outras funcionalidades importantes. Os tipos de elementos de ambiente que afetam a experiência do utilizador 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. No entanto, existem algumas ferramentas-chave que os programadores podem utilizar para melhorar a experiência visual do holograma para os utilizadores.

Partilha de memória intermédia de profundidade

Os programadores do Unity têm a opção de partilhar a memória intermédia de profundidade da aplicação com a plataforma. Isto fornece informações, onde existem hologramas para uma moldura atual, que a plataforma pode utilizar para estabilizar hologramas através de um processo assistido por hardware conhecido como Late-Stage Reprojeção.

Reprojeção em fase tardia

No final da composição de uma moldura, a plataforma de Windows Mixed Reality utiliza a cor & destinos de composição de profundidade produzidos pela aplicação e transforma a saída do ecrã final para contabilizar qualquer movimento ligeiro da cabeça desde a última predição de pose de cabeça. O ciclo de jogo de uma aplicação demora algum tempo a ser executado. Por exemplo, a 60 FPS, isto significa que a aplicação está a demorar ~16,667ms para compor uma moldura. Embora isto possa parecer uma quantidade minúscula de tempo, a posição e a orientação da cabeça do utilizador mudarão, resultando em novas matrizes de projeção para a câmara na composição. A reprojeção em fase tardia transforma os píxeis na imagem final para ter em conta esta nova perspetiva.

LSR por pixel vs. plano de estabilização

Dependendo do ponto final do dispositivo e da versão do SO em execução num dispositivo Windows Mixed Reality, o algoritmo Late-Stage Reprojeção será executado por pixel ou através de um plano de estabilização.

Com base na profundidade por pixel

A reprojeção baseada em profundidade por pixel envolve a utilização da memória intermédia de profundidade para modificar a saída da imagem por pixel e, assim, estabilizar hologramas a várias distâncias. Por exemplo, uma esfera a 1 m de distância pode estar à frente de um pilar que está a 10 m de distância. Os píxeis que representam a esfera terão uma transformação diferente dos píxeis distantes que representam o pilar se o utilizador tiver inclinado ligeiramente a cabeça. A reprojeção por pixel terá em conta esta diferença de distância a cada pixel para uma reprojeção mais precisa.

Plano de estabilização

Se não for possível criar uma memória intermédia de profundidade precisa para partilhar com a plataforma, outra forma de LSR utiliza um plano de estabilização. Todos os hologramas numa cena receberão alguma estabilização, mas os hologramas no plano pretendido receberão a estabilização máxima de hardware. O ponto e o normal para o plano podem ser fornecidos à plataforma através da API HolographicSettings.SetFocusPointForFramefornecida pelo Unity.

Formato de memória intermédia de profundidade

Se direcionar o HoloLens para desenvolvimento, é altamente recomendado utilizar o formato de memória intermédia de profundidade de 16 bits em comparação com 24 bits. Isto pode poupar tremendamente no desempenho, embora os valores de profundidade tenham menos precisão. Para compensar a precisão mais baixa e evitar a luta z, recomenda-se reduzir o plano de recortar distante do valor predefinido de 1000 m definido pelo Unity.

Nota

Se utilizar o formato de profundidade de 16 bits, os efeitos necessários para a memória intermédia de stencil não funcionarão porque o Unity não cria uma memória intermédia de stencil nesta definição. Selecionar o formato de profundidade de 24 bits inversamente irá geralmente criar uma memória intermédia de stencil de 8 bits, se aplicável na plataforma de gráficos de ponto final.

Partilha de memória intermédia de profundidade no Unity

Para utilizar o LSR baseado em profundidade, existem dois passos importantes que os programadores têm de seguir.

  1. Em Editar>Definições do Projeto Definições> doLeitor>XR Definições>SDKs> de Realidade Virtual Ativar Partilha de Memória Intermédia de Profundidade
    1. Se tiver como destino o HoloLens, recomenda-se que selecione também o formato de profundidade de 16 bits .
  2. Ao compor a cor no ecrã, a profundidade da composição também

Os GameObjects opacos no Unity geralmente escrevem em profundidade automaticamente. No entanto, os objetos de texto transparentes & geralmente não escreverão em profundidade por predefinição. Se utilizar o MrTK Standard Shader ou o Text Mesh Pro, isto pode ser facilmente corrigido.

Nota

Para determinar rapidamente que objetos numa cena não escrevem na memória intermédia de profundidade visualmente, pode-se utilizar o utilitário Memória Intermédia de Profundidade de Composição nas Definições do Editor no perfil de Configuração do MRTK.

Sombreado Padrão do MRTK Transparente

Para materiais transparentes que utilizem o sombreado Padrão do MRTK, selecione o material para vê-lo na janela Inspetor . Em seguida, clique no botão Corrigir Agora para converter o material para escrever em profundidade (ou seja, Z-Write On).

Antes

Memória Intermédia de Profundidade Antes de Corrigir o Tom Padrão do MRTK

Depois

Memória Intermédia de Profundidade Corrigido MrTK Standard Shader

Text Mesh Pro

Para objetos Text Mesh Pro, selecione o TMP GameObject para vê-lo no inspetor. Por baixo do componente material, mude o sombreado para o material atribuído para utilizar o sombreador TextMeshPro do MRTK.

Correção da Memória Intermédia de Profundidade do Text Mesh Pro

Sombreado personalizado

Se escrever um sombreado personalizado, adicione o sinalizador ZWrite à parte superior da definição de bloco Pass para configurar o sombreado para escrever na memória intermédia de profundidade.

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

Se os métodos acima não funcionarem para um determinado cenário (ou seja, com a IU do Unity), é possível que outro objeto escreva na memória intermédia de profundidade. Um exemplo comum é a utilização de Texto da IU do Unity num painel flutuante numa cena. Ao tornar o painel opaco ou, pelo menos, escrevendo em profundidade, o texto & painel será estabilizado pela plataforma, uma vez que os respetivos valores z estão tão próximos uns dos outros.

WorldAnchors (HoloLens)

Além de garantir que as configurações corretas são cumpridas para garantir a estabilidade visual, é importante garantir que os hologramas permanecem estáveis nas localizações físicas corretas. Para informar a plataforma sobre localizações importantes num espaço físico, os programadores podem tirar partido dos WorldAnchors em GameObjects que precisam de permanecer num único local. Um WorldAnchor é um componente adicionado a um GameObject que assume controlo absoluto sobre a transformação desse objeto.

Dispositivos como o HoloLens estão constantemente a analisar e a aprender sobre o ambiente. Assim, à medida que o HoloLens monitoriza o movimento & posição no espaço, as estimativas serão atualizadas e o sistema de coordenadas do Unity ajustado. Por exemplo, se um GameObject for colocado a 1 m da câmara no início, uma vez que o HoloLens controla o ambiente, poderá perceber que o ponto físico onde o GameObject está localizado está, na verdade, a 1,1 m de distância. Tal 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 na localização física correta (ou seja, atualizar para 1,1 m de distância em vez de 1 m no runtime). Para manter os WorldAnchors em sessões de aplicações, os programadores podem utilizar a WorldAnchorStore para guardar e carregar WorldAnchors.

Nota

Uma vez adicionado um componente WorldAnchor a um GameObject, não é possível modificar a transformação desse GameObject (ou seja, transform.position = x). Um programador tem de 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 quiser uma alternativa para trabalhar manualmente com Âncoras, consulte As Ferramentas de Bloqueio Do Microsoft World.

Ver também