Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

AR / Passthrough (Passagem de vídeo)

A Realidade Aumentada é suportada por meio de vários métodos, dependendo das capacidades do hardware.

Headsets como o Magic Leap e óculos como o TiltFive mostram o resultado renderizado em telas transparentes, permitindo que o usuário veja o mundo real.

Headsets como o Quest, HTC Elite e Lynx R1 implementam isso por meio de uma técnica chamada passthrough de vídeo, onde câmeras gravam o mundo real e essas imagens são usadas como o fundo sobre o qual nosso resultado renderizado é utilizado.

Nota

O passthrough é implementado de forma muito diferente entre as plataformas.

No Godot 4.3, implementamos uma abordagem unificada explicada nesta página de ajuda para que você não precise se preocupar com essas diferenças; a implementação de XRInterface agora é responsável por aplicar o método correto dependente da plataforma [1].

Para headsets como o Meta Quest e HTC Elite, você precisará usar o plugin de fornecedores do OpenXR v3.0.0 ou posterior para ativar o passthrough de vídeo.

Para compatibilidade com versões anteriores, a antiga API para passthrough ainda está disponível, mas é recomendado seguir as novas instruções abaixo.

Modos de mesclagem de ambiente

A maneira como configuramos a funcionalidade de VR ou AR é definindo o modo de mistura do ambiente (environment blend mode). Este modo determina como o ambiente (mundo real) é misturado com o mundo virtual.

Modos de mesclagem

Modo de mesclagem

Descrição

XR_ENV_BLEND_MODE_OPAQUE

A imagem renderizada é opaca, não vemos o mundo real. Estamos no modo VR. Isso desativará o passthrough se o passthrough de vídeo for usado.

XR_ENV_BLEND_MODE_ADDITIVE

A imagem renderizada é adicionada ao mundo real e parecerá semitransparente. Este modo é geralmente usado com dispositivos transparentes que não conseguem obscurecer o mundo real. Isso ativará o passthrough se o passthrough de vídeo for usado.

XR_ENV_BLEND_MODE_ALPHA_BLEND

A imagem renderizada é misturada via canal alfa (alpha blended) com o mundo real. Em dispositivos transparentes que suportam isso, o alfa controlará a translucidez da ótica. Em dispositivos de passthrough de vídeo, a mistura alfa é aplicada com a imagem de vídeo. O passthrough também será ativado, se aplicável.

Você pode definir o modo de mistura de ambiente para o seu aplicativo por meio da propriedade environment_blend_mode da instância da XRInterface.

Você pode consultar os modos de mistura suportados no hardware usando la propriedade get_supported_environment_blend_modes na mesma instância.

Configurando seu fundo

Ao definir o modo de mistura para XR_ENV_BLEND_MODE_ALPHA_BLEND, você deve definir a propriedade transparent_bg na Viewport para verdadeiro. Ao usar o modo de mistura XR_ENV_BLEND_MODE_ADDITIVE, você deve definir a cor do seu fundo para preto.

Qualquer uma das soluções resultará em a renderização do fundo não contribuir para a iluminação. Portanto, também é recomendado que você ajuste as configurações do seu ambiente de acordo e garanta que haja luz ambiente adequada configurada para iluminar sua cena.

Nota

Alguns SDKs de AR fornecem informações de iluminação ambiente ou até mesmo fornecem um mapa de radiância completo para permitir reflexos do mundo real em seus objetos virtuais. A funcionalidade central de XR do Godot atualmente não possui suporte para isso, no entanto, essa funcionalidade pode ser exposta por meio de plugins.

Específico do OpenXR

No OpenXR, você pode configurar o modo de mistura padrão que deseja usar. O Godot selecionará este modo de mistura na inicialização, se disponível. Se não estiver disponível, o Godot usará por padrão o primeiro modo de mistura suportado fornecido pelo tempo de execução do XR.

../../_images/openxr_default_blend_mode.webp

Para dispositivos de passthrough, o OpenXR exige que configurações adicionais sejam configuradas. Essas configurações são dependentes da plataforma e fornecidas por meio do plugin de fornecedores do OpenXR.

Por exemplo, estas são as configurações necessárias no Meta Quest:

../../_images/openxr_export_passthrough.webp

A configuração Passthrough define se o passthrough é suportado ou até mesmo obrigatório.

O Boundary Mode permite definir se o guardião é necessário; desativar isso totalmente exige que o passthrough esteja ativado o tempo todo.

Juntando tudo

Juntando o acima exposto, podemos usar o seguinte código como base:

@onready var viewport : Viewport = get_viewport()
@onready var environment : Environment = $WorldEnvironment.environment

func switch_to_ar() -> bool:
    var xr_interface: XRInterface = XRServer.primary_interface
    if xr_interface:
        var modes = xr_interface.get_supported_environment_blend_modes()
        if XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND in modes:
            xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND
            viewport.transparent_bg = true
        elif XRInterface.XR_ENV_BLEND_MODE_ADDITIVE in modes:
            xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ADDITIVE
            viewport.transparent_bg = false
    else:
        return false

    environment.background_mode = Environment.BG_COLOR
    environment.background_color = Color(0.0, 0.0, 0.0, 0.0)
    environment.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
    return true

func switch_to_vr() -> bool:
    var xr_interface: XRInterface = XRServer.primary_interface
    if xr_interface:
        var modes = xr_interface.get_supported_environment_blend_modes()
        if XRInterface.XR_ENV_BLEND_MODE_OPAQUE in modes:
            xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_OPAQUE
        else:
            return false

    viewport.transparent_bg = false
    environment.background_mode = Environment.BG_SKY
    environment.ambient_light_source = Environment.AMBIENT_SOURCE_BG
    return true

Sombra para opacidade

Sombra para opacidade (shadow to opacity) é um modo de renderização para os shaders espaciais do Godot que foi introduzido no Godot 3 especificamente para AR. É um modo de renderização especial onde quanto mais uma superfície estiver na sombra, mais opaca ela se torna. Quando uma superfície está totalmente iluminada, ela se torna totalmente transparente e, assim, mostra o mundo real.

No entanto, a superfície é renderizada durante o estado opaco efetivamente. Isso tem duas consequências:

  • Como tanto o buffer de profundidade quanto o buffer de cor são gravados, ocluímos qualquer geometria atrás da nossa superfície, mesmo quando totalmente transparente.

  • Como estamos tornando a superfície opaca se estiver na sombra, podemos fazer com que objetos virtuais projetem sombras em objetos do mundo real [2].

Imagem mostrando sombra para opacidade sendo usada para mostrar a mesa do usuário.

Imagem mostrando sombra para opacidade sendo usada para mostrar a mesa do usuário.

Isso habilitou os seguintes casos de uso:

  • Você pode renderizar uma malha de caixa (box mesh) ao redor de uma mesa do mundo real; isso garante que a mesa permaneça visível mesmo se um objeto virtual for colocado embaixo dela. O objeto virtual será ocluído corretamente. Colocar um objeto virtual em cima da mesa do mundo real resultará em uma sombra sendo projetada na mesa.

  • Você pode usar um shader com este modo de renderização ao renderizar uma malha de mão usando a funcionalidade de rastreamento de mãos, e garantir que suas mãos ocluam corretamente os objetos virtuais.

O seguinte código de shader é uma boa base para esta funcionalidade:

shader_type spatial;
render_mode blend_mix, depth_draw_opaque, cull_back, shadow_to_opacity;

void fragment() {
    ALBEDO = vec3(0.0, 0.0, 0.0);
}