Práticas recomendadas do aplicativo OpenXR

Você pode ver um exemplo das práticas recomendadas abaixo no arquivo OpenXRProgram.cpp do BasicXrApp. A função Run() no início captura um fluxo de código de aplicativo OpenXR típico da inicialização para o evento e o loop de renderização.

Práticas recomendadas para qualidade visual e estabilidade

As práticas recomendadas nesta seção descrevem como obter a melhor qualidade visual e estabilidade em qualquer aplicativo OpenXR.

Para obter mais recomendações de desempenho específicas para HoloLens 2, consulte a seção Práticas recomendadas para desempenho em HoloLens 2 abaixo.

Renderização de gama correta

É necessário ter cuidado para garantir que o pipeline de renderização esteja correto em gama. Ao renderizar para uma cadeia de troca, o formato de exibição de destino de renderização deve corresponder ao formato swapchain. Por exemplo, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB para o formato swapchain e a exibição de destino de renderização. Há uma exceção se o pipeline de renderização do aplicativo fizer uma conversão sRGB manual no código do sombreador. O aplicativo deve solicitar um formato de cadeia de troca sRGB, mas usar o formato linear para a exibição de destino de renderização. Por exemplo, solicite DXGI_FORMAT_B8G8R8A8_UNORM_SRGB como o formato swapchain, mas use DXGI_FORMAT_B8G8R8A8_UNORM como a exibição de destino de renderização para impedir que o conteúdo seja corrigido de gama dupla.

Enviar buffer de profundidade para camadas de projeção

Sempre use XR_KHR_composition_layer_depth a extensão e envie o buffer de profundidade junto com a camada de projeção ao enviar um quadro para xrEndFrame. Habilitar a reprojeção de profundidade de hardware em HoloLens 2 melhora a estabilidade do holograma.

Escolher um intervalo de profundidade razoável

Prefira um intervalo de profundidade mais estreito para definir o escopo do conteúdo virtual para ajudar a estabilidade do holograma no HoloLens. Por exemplo, o exemplo OpenXrProgram.cpp está usando 0,1 metro a 20 metros. Use reversed-Z para uma resolução de profundidade mais uniforme. Em HoloLens 2, usar o formato de profundidade preferencial DXGI_FORMAT_D16_UNORM ajudará a obter melhor taxa de quadros e desempenho, embora buffers de profundidade de 16 bits forneçam menos resolução de profundidade do que buffers de profundidade de 24 bits. Seguir essas práticas recomendadas para fazer o melhor uso da resolução de profundidade torna-se mais importante.

Preparar para diferentes modos de combinação de ambiente

Se o aplicativo também for executado em headsets imersivos que bloqueiam completamente o mundo, enumere os modos de combinação de ambiente com suporte usando xrEnumerateEnvironmentBlendModes a API e prepare o conteúdo de renderização corretamente. Por exemplo, para um sistema com XR_ENVIRONMENT_BLEND_MODE_ADDITIVE como o HoloLens, o aplicativo deve usar transparente como a cor clara, enquanto para um sistema com XR_ENVIRONMENT_BLEND_MODE_OPAQUE, o aplicativo deve renderizar alguma cor opaca ou alguma sala virtual em segundo plano.

Escolher espaço de referência não associado como espaço raiz do aplicativo

Os aplicativos normalmente estabelecem algum espaço de coordenadas do mundo raiz para conectar exibições, ações e hologramas juntos. Use XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT quando houver suporte para a extensão para estabelecer um sistema de coordenadas de escala mundial, permitindo que seu aplicativo evite descompasso de holograma indesejado quando o usuário se mover para longe (por exemplo, 5 metros de distância) de onde o aplicativo é iniciado. Use XR_REFERENCE_SPACE_TYPE_LOCAL como um fallback se a extensão de espaço não associado não existir.

Associar holograma à âncora espacial

Ao usar um espaço de referência não associado, os hologramas colocados diretamente nesse espaço de referência podem descompassar à medida que o usuário caminha para salas distantes e, em seguida, volta. Para usuários de holograma colocados em um local discreto no mundo, crie uma âncora espacial usando a xrCreateSpatialAnchorSpaceMSFT função de extensão e posicione o holograma em sua origem. Isso manterá esse holograma independentemente estável ao longo do tempo.

Suporte à captura de realidade misturada

Embora a exibição primária do HoloLens 2 use a combinação de ambiente aditivo, quando o usuário iniciar a captura de realidade misturada, o conteúdo de renderização do aplicativo será misturado com o fluxo de vídeo do ambiente. Para obter a melhor qualidade visual em vídeos de captura de realidade misturada, é melhor definir o XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT na camada de projeção.layerFlags

Práticas recomendadas para desempenho em HoloLens 2

Como um dispositivo móvel com suporte à reprojeção de hardware, HoloLens 2 tem requisitos mais rigorosos para o desempenho ideal. Há várias maneiras de enviar dados de composição, o que resulta em pós-processamento com uma penalidade de desempenho perceptível.

Selecionar um formato de conjunto de trocas

Sempre enumere formatos de pixel com suporte usando xrEnumerateSwapchainFormatse escolha o primeiro formato de pixel de cor e profundidade no runtime compatível com o aplicativo, pois é isso que o runtime prefere para obter o desempenho ideal. Observe que, em HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB e DXGI_FORMAT_D16_UNORM normalmente é a primeira opção para obter um melhor desempenho de renderização. Essa preferência pode ser diferente em headsets VR em execução em um computador desktop, em que buffers de profundidade de 24 bits têm menos impacto no desempenho.

Aviso de desempenho: O uso de um formato diferente do formato de cor de swapchain primário resultará em pós-processamento de runtime, o que ocorre em uma penalidade significativa de desempenho.

Sempre renderize com a largura/altura da configuração de exibição recomendada (recommendedImageRectWidth e recommendedImageRectHeight de XrViewConfigurationView), e sempre use xrLocateViews a API para consultar a pose de exibição recomendada, FOV e outros parâmetros de renderização antes de renderizar. Sempre use o XrFrameEndInfo.predictedDisplayTime da chamada mais recente xrWaitFrame ao consultar poses e exibições. Isso permite que o HoloLens ajuste a renderização e otimize a qualidade visual da pessoa que está usando o HoloLens.

Usar uma única camada de projeção

HoloLens 2 tem potência de GPU limitada para renderizar conteúdo e um compositor de hardware otimizado para uma única camada de projeção. Sempre usar uma única camada de projeção pode ajudar a taxa de quadros do aplicativo, a estabilidade do holograma e a qualidade visual.

Aviso de desempenho: Enviar qualquer coisa, menos uma única camada de proteção, resultará em pós-processamento de runtime, o que ocorre em uma penalidade significativa de desempenho.

Renderizar com matriz de textura e VPRT

Crie um xrSwapchain para o olho esquerdo e direito usando arraySize=2 para troca de cor e um para profundidade. Renderize o olho esquerdo em fatia 0 e o olho direito na fatia 1. Use um sombreador com VPRT e chamadas de desenho em instâncias para renderização estereoscópica para minimizar a carga de GPU. Isso também permite que a otimização do runtime obtenha o melhor desempenho em HoloLens 2. Alternativas ao uso de uma matriz de textura, como renderização de largura dupla ou uma troca separada por olho, resultarão em pós-processamento de runtime, que vem com uma penalidade significativa de desempenho.

Evitar camadas quádruplas

Em vez de enviar camadas quádruplas como camadas de composição com XrCompositionLayerQuad, renderize o conteúdo quad diretamente na cadeia de troca de projeção.

Aviso de desempenho: Fornecer camadas adicionais além de uma única camada de projeção, como camadas quádruplas, resultará em pós-processamento de runtime, o que ocorre em uma penalidade significativa de desempenho.