Splatting Gaussiano 3D (3D Gaussian Splatting)

Visão geral

Splatting Gaussiano 3D (3D Gaussian Splatting, 3DGS) é uma representação explícita de cena 3D e um método rápido de renderização diferenciável (differentiable rendering) projetado para síntese de novas vistas (novel-view synthesis) de alta qualidade. Em vez de representar uma cena com uma rede neural (neural network) que precisa ser consultada muitas vezes por pixel (como em muitas Representações Neurais Implícitas (Implicit Neural Representations)), o 3DGS representa uma cena como um conjunto de Gaussianas 3D anisotrópicas (anisotropic 3D Gaussians) (“splats”) que podem ser rasterizadas de forma eficiente na GPU.

Em alto nível:

  • Modelo de cena: milhares a milhões de Gaussianas 3D, cada uma com uma posição, covariância 3D (forma/orientação), opacidade e cor (frequentemente dependente da vista via harmônicos esféricos).
  • Treinamento: otimiza esses parâmetros Gaussianos para corresponder a um conjunto de imagens com pose (normalmente de um pipeline de SfM como o COLMAP), usando otimização baseada em gradientes.
  • Renderização: projeta Gaussianas na imagem e compõe alfa suas contribuições em ordem de profundidade, produzindo imagens nítidas e fotorrealistas em taxas em tempo real ou quase em tempo real em GPUs de consumo.

O 3DGS se insere no ecossistema mais amplo de Renderização Neural (Neural Rendering) e está intimamente conectado à geometria clássica de múltiplas vistas (poses de câmera, projeção e ordenação por profundidade), à formação de imagem diferenciável e à otimização (ver Descida do Gradiente (Gradient Descent) e Retropropagação (Backpropagation)).

Por que “Gaussian splatting”?

O termo splatting vem da renderização baseada em pontos (point-based rendering): em vez de renderizar triângulos, você renderiza muitas primitivas pequenas (pontos/discos/elipses) e “espalha” (splat) suas pegadas no buffer de quadro (framebuffer). No 3DGS, a primitiva é uma densidade Gaussiana 3D (3D Gaussian density). Quando vista por uma câmera, cada Gaussiana 3D se torna uma Gaussiana 2D elíptica (elliptical 2D Gaussian) no plano da imagem. A imagem renderizada é produzida por acumular essas contribuições elípticas.

Isso oferece um equilíbrio prático:

  • Representação explícita (fácil de inspecionar e frequentemente mais fácil de exportar do que campos implícitos)
  • Renderização eficiente (rasterização e composição amigáveis para GPU)
  • Alta qualidade (bordas nítidas e detalhes finos, especialmente em comparação com nuvens de pontos mais antigas)

Representação de cena: Gaussianas 3D anisotrópicas

Um único “splat” Gaussiano normalmente carrega parâmetros como:

  • Média / posição: (\mu \in \mathbb{R}^3)
  • Covariância: (\Sigma \in \mathbb{R}^{3\times 3}), simétrica definida positiva
    Frequentemente parametrizada por estabilidade como rotação + escala, por exemplo (R \in SO(3)), (s \in \mathbb{R}^3_{>0}) com (\Sigma = R ,\mathrm{diag}(s^2), R^\top)
  • Opacidade: (\alpha \in [0, 1]) (ou um valor não restrito passado por uma sigmoide (sigmoid))
  • Cor: pode ser
    • RGB independente da vista, ou
    • cor dependente da vista usando coeficientes de harmônicos esféricos (spherical harmonics, SH) (comum em 3DGS), permitindo efeitos leves semelhantes a especular.

Intuição para a anisotropia

Uma Gaussiana anisotrópica pode se alongar e rotacionar em 3D. Isso importa porque:

  • Estruturas finas (fios, folhas, bordas) podem ser representadas de forma mais compacta por Gaussianas alongadas.
  • A pegada projetada se torna uma elipse, que pode se alinhar a características da imagem e reduzir borrão.

Comparada a “bolhas” isotrópicas, a anisotropia melhora o detalhe com menos primitivas, mas também torna a otimização mais sensível (mais graus de liberdade).

De Gaussianas 3D a pixels: renderização diferenciável por splats

A renderização em 3DGS é frequentemente descrita como rasterização diferenciável (differentiable rasterization) de Gaussianas mais composição alfa (alpha compositing).

Etapa 1: Projetar Gaussianas no plano da imagem

Dadas intrínsecas/extrínsecas da câmera (ver Calibração de Câmera (Camera Calibration) e Estimativa de Pose (Pose Estimation)), cada média (\mu) é transformada para o espaço da câmera e projetada no plano da imagem. A covariância 3D (\Sigma) também é transformada e projetada para uma covariância 2D (\Sigma_{2D}). O resultado é uma pegada Gaussiana 2D elíptica em coordenadas de pixel.

Conceitualmente:

  • Densidade Gaussiana 3D: (G(x) \propto \exp\left(-\tfrac{1}{2}(x-\mu)^\top \Sigma^{-1}(x-\mu)\right))
  • Após a projeção, você obtém uma elipse no espaço de tela (screen-space ellipse) descrevendo onde esse splat contribui.

Implementações usam matemática cuidadosa (e salvaguardas numéricas) para calcular a elipse no espaço de tela de forma eficiente e estável.

Etapa 2: Avaliar contribuições dentro de uma elipse

Para cada Gaussiana, você calcula quais pixels ela afeta (frequentemente via uma caixa delimitadora ao redor da elipse) e avalia o peso da Gaussiana 2D nesses pixels.

Etapa 3: Composição alfa em ordem de profundidade

A renderização normalmente usa composição da frente para trás (front-to-back). Se um pixel recebe contribuições de splats ordenados por profundidade, você acumula a cor assim:

  • Mantém a transmitância (T) (quanto de luz ainda passa)
  • Para cada splat (i) naquele pixel:
    • Calcula sua contribuição de opacidade (a_i) (com base em (\alpha) e no peso da Gaussiana)
    • Adiciona (T \cdot a_i \cdot c_i) à cor do pixel
    • Atualiza (T \leftarrow T \cdot (1 - a_i))
    • Encerra cedo se (T) ficar muito pequeno

Isso é semelhante em espírito à renderização volumétrica (volume rendering) usada por Campos de Radiância Neurais (Neural Radiance Fields, NeRFs), mas as “amostras” são primitivas explícitas (explicit primitives) em vez de muitas consultas à rede ao longo de um raio (ray).

Pseudocódigo mínimo (conceitual)

def render_pixel(sorted_splats, background):
    C = 0.0
    T = 1.0
    for splat in sorted_splats:  # sorted front-to-back for this pixel
        a = splat.opacity_at_pixel  # includes Gaussian footprint weight
        c = splat.color_at_view     # RGB or SH-evaluated RGB
        C += T * a * c
        T *= (1.0 - a)
        if T < 1e-3:
            break
    return C + T * background

Na prática, renderizadores são massivamente paralelos e usam divisão em blocos (tiling)/agrupamento (binning) para que cada bloco de threads (thread block) da GPU lide com splats relevantes para um bloco da tela.

Otimização: ajustando Gaussianas a partir de imagens com pose

O 3DGS é tipicamente otimizado a partir de um conjunto de imagens com parâmetros de câmera conhecidos. Essas câmeras geralmente são obtidas via Estrutura a partir do Movimento (Structure-from-Motion, SfM) e refinadas com Ajuste de Feixe (Bundle Adjustment).

Pipeline típico

  1. Capture imagens de uma cena estática com boa cobertura e sobreposição.
  2. Estime poses de câmera + pontos esparsos usando SfM (por exemplo, COLMAP).
  3. Inicialize Gaussianas
    • Muitas vezes a partir da nuvem de pontos do SfM: cada ponto vira uma média Gaussiana.
    • Escala/covariância iniciais definidas com base no espaçamento local de pontos ou heurísticas.
  4. Otimize parâmetros Gaussianos para minimizar o erro fotométrico entre imagens renderizadas e observadas.

Funções de perda

Objetivos comuns incluem:

  • Perda fotométrica (photometric loss): L1/L2 entre pixels renderizados e de referência
  • Perdas perceptuais (perceptual losses): por exemplo, termos do tipo SSIM para incentivar similaridade perceptual mais nítida
  • Regularização (regularization): desencorajando covariâncias degeneradas, splats excessivamente grandes ou opacidade ruidosa

Um exemplo simplificado:

[ \mathcal{L} = \lambda_1 |I_{\text{render}} - I_{\text{gt}}|1 + \lambda_2 (1-\mathrm{SSIM}(I{\text{render}}, I_{\text{gt}})) + \mathcal{R}(\Sigma, \alpha) ]

Como o renderizador é diferenciável, você pode calcular gradientes dessa perda em relação a (\mu, \Sigma, \alpha,) e parâmetros de cor e atualizá-los via descida do gradiente.

Densificação, divisão e poda

Um ingrediente prático chave no treinamento de 3DGS é que o conjunto de Gaussianas não é fixo:

  • Densificação (densification) / divisão (splitting): se uma região está sub-reconstruída (alto erro, detalhe insuficiente), divida uma Gaussiana em múltiplas Gaussianas menores ou adicione novas Gaussianas.
  • Poda (pruning): remova Gaussianas com opacidade muito baixa ou que contribuem pouco.
  • Refinamento adaptativo (adaptive refinement): aloque mais primitivas onde a cena tem detalhe de alta frequência (texto, folhagem, bordas).

Esse “crescimento do modelo” dinâmico é um dos principais motivos pelos quais o 3DGS alcança forte qualidade sem precisar de uma rede neural enorme ou de amostras excessivas ao longo do raio.

Exemplo prático: o que muda durante a otimização?

Imagine reconstruir uma pequena estátua:

  • Iterações iniciais: alguns milhares de Gaussianas aproximam a forma geral, mas as bordas parecem “emboladas”.
  • Após a densificação: a silhueta e os traços faciais da estátua ficam nítidos à medida que Gaussianas se dividem ao longo de regiões de alto gradiente.
  • Após o ajuste de cor dependente da vista (harmônicos esféricos): realces em partes brilhantes ficam mais consistentes entre pontos de vista (embora ainda não seja um reiluminamento fisicamente correto).

Como o 3DGS se compara a NeRFs: principais trade-offs

O 3DGS é frequentemente contrastado com campos de radiância (radiance fields) no estilo NeRF (um exemplo canônico de Representações Neurais Implícitas). Ambos visam síntese de novas vistas, mas os trade-offs diferem substancialmente.

Velocidade (treinamento e renderização)

  • Velocidade de renderização
    • 3DGS: tipicamente em tempo real ou quase em tempo real, porque rasteriza primitivas explícitas.
    • NeRFs: historicamente mais lentas devido a muitas amostras por raio e avaliações de rede (embora acelerações modernas ajudem).
  • Velocidade de treinamento
    • 3DGS: muitas vezes converge rapidamente para alta qualidade porque otimiza diretamente parâmetros explícitos e usa renderização eficiente.
    • NeRFs: podem ser mais lentas dependendo da arquitetura e da estratégia de amostragem.

Em aplicações interativas (visualizadores, AR/VR), o 3DGS é frequentemente favorecido porque a renderização rápida já vem embutida.

Qualidade

  • Pontos fortes do 3DGS
    • Detalhe muito nítido e bom antisserrilhamento (anti-aliasing) quando os splats estão bem otimizados.
    • Lida razoavelmente bem com aparência complexa com cor dependente da vista (harmônicos esféricos).
  • Pontos fortes das NeRFs
    • Podem modelar efeitos volumétricos suaves e campos de radiância dependentes da vista complexos com menos “artefatos explícitos”.
    • Frequentemente mais robustas a certas ambiguidades porque a representação é contínua e aprendida.

Na prática, ambas podem ser excelentes; diferenças de qualidade muitas vezes se resumem à qualidade da captura, à precisão das poses e às variantes do método.

Uso de memória

  • 3DGS: armazena muitas primitivas com múltiplos parâmetros cada (posição, covariância, coeficientes de harmônicos esféricos, opacidade). Cenas de alta qualidade podem exigir muita memória de GPU, especialmente sem compressão.
  • NeRFs: armazenam pesos da rede mais estruturas de aceleração; a memória pode ser menor ou maior dependendo do método, mas pode ser mais compacta para algumas cenas.

A memória do 3DGS pode ser mitigada por meio de:

  • quantização e compressão de parâmetros
  • poda
  • limitação do grau de harmônicos esféricos
  • esquemas multi-resolução ou de streaming

Limitações de edição e reiluminação

Este é um dos alertas práticos mais importantes.

  • Edição
    • O 3DGS é explícito: você pode deletar Gaussianas, movê-las ou mascarar regiões de maneira relativamente direta.
    • Mas a edição semântica (por exemplo, “trocar o material da parede para tijolo”) não é nativa — não há um conceito explícito de material ou superfície geométrica.
  • Reiluminação (relighting)
    • O 3DGS padrão armazena aparência embutida (baked appearance) (cores atreladas à iluminação capturada), às vezes com leve dependência de vista via harmônicos esféricos.
    • Ele não representa nativamente materiais fisicamente baseados, fontes de luz ou sombras projetadas.
    • Alterar a iluminação tipicamente parece errado: realces e sombreamento estão “pintados”, não recalculados.

Variantes de NeRF também podem ter dificuldades com reiluminação, a menos que sejam explicitamente projetadas para isso, mas o problema central é semelhante: a maioria dos métodos de síntese de novas vistas otimiza para corresponder a imagens sob iluminação fixa, não para inferir uma física desacoplada.

Aplicações práticas

Visualizadores de novas vistas em tempo real

Um padrão comum de implantação é:

  1. Treinar um modelo 3DGS a partir de um conjunto de fotos.
  2. Exportar os parâmetros Gaussianos.
  3. Executar um renderizador em tempo real em um visualizador desktop ou web para navegação livre.

Isso é especialmente atraente para:

  • tours virtuais
  • digitalização de patrimônio cultural
  • pré-visualização para cinema/VFX
  • vitrines de produtos

AR/VR e telepresença

Rasterização rápida e primitivas explícitas são bem adequadas para:

  • mudanças de ponto de vista de baixa latência (requisito de conforto em VR)
  • pipelines de renderização foveada (foveated rendering)
  • sistemas de streaming e nível de detalhe (level-of-detail, LOD) (área ativa de pesquisa/engenharia)

Robótica e mapeamento (com ressalvas)

O 3DGS pode servir como uma representação densa de cena para visualização ou localização, mas a robótica tipicamente precisa de:

  • geometria métrica
  • modelagem de incerteza
  • tratamento de cenas dinâmicas

Embora Gaussianas possam codificar uma dispersão semelhante a incerteza, pipelines padrão de 3DGS são otimizados principalmente para renderização fotorrealista, não necessariamente para reconstrução métrica precisa.

Notas de implementação e considerações de engenharia

A qualidade da câmera é crítica

Como o 3DGS depende de projetar Gaussianas nas imagens, erros nos parâmetros da câmera (intrínsecos/extrínsecos) levam a borrão, imagens fantasma (ghosting) ou “superfícies duplas”. Um bom SfM e o refinamento via Ajuste de Feixe frequentemente são decisivos para a qualidade final.

Transparência e estruturas finas

Gaussianas com mistura alfa podem representar efeitos semitransparentes, mas isso não é o mesmo que materiais verdadeiramente refrativos/transparentes. Geometria fina pode ficar excelente quando splats se alinham bem, mas também pode produzir:

  • floaters (pequenos splats desconectados de superfícies)
  • halos ao redor de bordas se opacidade/covariância não forem bem regularizadas

Ordenação e desempenho

A composição alfa correta requer ordenação por profundidade. Renderizadores eficientes evitam ordenação global por meio de:

  • agrupar splats em blocos de tela
  • ordenar por bloco (ou usar estratégias aproximadas)
  • término antecipado usando limiares de transmitância

Esses detalhes importam tanto para velocidade quanto para correção.

Exportação e interoperabilidade

Como o 3DGS é explícito, é mais fácil do que campos implícitos:

  • inspecionar parâmetros
  • converter para formatos baseados em pontos
  • potencialmente gerar malha (embora gerar malha a partir de splats não seja trivial e geralmente exija processamento adicional)

Se seu objetivo é uma malha para pipelines gráficos padrão, você ainda pode preferir abordagens baseadas em campos de distância com sinal (ver Funções de Distância com Sinal (Signed Distance Functions, SDFs)) ou métodos dedicados de reconstrução de superfície.

Exemplo trabalhado: quando escolher 3DGS vs um método tipo NeRF

Cenário: uma digitalização interativa de museu

  • Requisitos: navegação em tempo real, alto detalhe, iluminação estática é aceitável.
  • Recomendação: Splatting Gaussiano 3D
    • Renderização rápida
    • Alta qualidade visual
    • Integração direta com visualizadores

Cenário: pesquisa em cenas editáveis e reilumináveis

  • Requisitos: mudar direção da luz, alterar materiais, calcular propriedades fisicamente significativas.
  • Recomendação: considere métodos explicitamente projetados para reiluminação/materiais (frequentemente além de NeRF/3DGS de base)
    • O 3DGS de base provavelmente falhará em reiluminação real porque a aparência está embutida.

Cenário: memória de GPU limitada no dispositivo

  • Requisitos: implantação móvel com memória restrita.
  • Recomendação: depende da disponibilidade de compressão/streaming
    • O 3DGS pode precisar de compressão agressiva e LOD.
    • Alguns métodos implícitos podem ser mais leves dependendo da arquitetura, mas podem renderizar mais lentamente.

Limitações e modos de falha comuns

  • Iluminação embutida: comportamento ruim em reiluminação; alterar iluminação não tem base física.
  • Cenas dinâmicas: a formulação de base assume cenas estáticas; objetos em movimento causam artefatos a menos que se estenda o método.
  • Sensibilidade a pose/captura: cobertura esparsa, desfoque de movimento, obturador rolante (rolling shutter) ou poses imprecisas degradam resultados.
  • Escalonamento de memória: cenas de alta fidelidade podem exigir muitas Gaussianas e grande armazenamento de parâmetros.
  • Ambiguidade geométrica: ótimas imagens não necessariamente implicam superfícies limpas; splats podem “trapacear” com comportamento tipo billboard em regiões pouco observadas.

Conexões com tópicos relacionados

Direções atuais (pesquisa e prática)

Embora o 3DGS de base já seja impactante, áreas ativas incluem:

  • Compressão e streaming: tornar cenas grandes práticas em dispositivos com memória limitada.
  • Modelos melhores de material/iluminação: migrar da “dependência de vista” via harmônicos esféricos para representações desacopladas e reilumináveis.
  • Gaussianas dinâmicas e deformáveis: lidar com cenas não rígidas e conteúdo variável no tempo.
  • Representações híbridas: combinar Gaussianas com malhas ou campos implícitos para melhor editabilidade ou física.

Resumo

O Splatting Gaussiano 3D é uma abordagem poderosa para síntese de novas vistas que representa cenas explicitamente como Gaussianas 3D anisotrópicas e as renderiza via splatting diferenciável eficiente e composição alfa. Ele é especialmente atraente quando você precisa de renderização rápida e de alta qualidade e pode tolerar iluminação embutida e editabilidade física limitada. Em comparação com campos de radiância implícitos no estilo NeRF, o 3DGS frequentemente vence em velocidade de renderização e interatividade prática, ao custo de trade-offs em uso de memória e fidelidade de reiluminação/edição.

Se você está construindo um visualizador 3D interativo a partir de fotos sob iluminação fixa, o 3DGS frequentemente é uma das escolhas de alta qualidade mais práticas disponíveis hoje.