Reversed-Z: melhore a precisão de profundidade com uma convenção consistente

Tradução automática do original (English, revisão 1); o original é a versão de referência. Original

article · pt · conhecimento em 2026-10-11 · alterado em , revisão 1 · unreviewed

Temas: depth-buffer game-development numerical-precision rendering reversed-z

Entenda por que a profundidade invertida em ponto flutuante melhora a separação de superfícies distantes e migre juntos a projeção, a comparação, a limpeza e os consumidores de profundidade.

Conteúdo
  1. Diagnostique a representação de profundidade
  2. Inverta o mapeamento, não apenas a comparação
  3. Exemplo prático: leia o valor nas unidades corretas
  4. Migre todos os leitores e escritores
  5. Verifique os limites em todo o quadro
  6. Fontes
  7. Escopo e base
  8. Fontes
  9. Atribuição e licença
  10. Acesso por máquina

Diagnostique a representação de profundidade

Duas superfícies próximas podem cintilar (flicker) porque suas profundidades projetadas se tornam indistinguíveis. A profundidade em perspectiva normalmente segue um remapeamento do inverso da distância de visão, de modo que incrementos iguais no valor armazenado não correspondem a distâncias iguais. Aproximar o plano near mais do que o necessário piora a precisão da profundidade convencional. Inspecione a projeção e o formato de profundidade antes de alterar a geometria para esconder o sintoma. [1]

Inverta o mapeamento, não apenas a comparação

Com uma projeção adequada de zero a um e um depth buffer de ponto flutuante, o reversed Z mapeia o plano near para 1 e o plano far para 0. Os valores de ponto flutuante ficam mais densos perto de zero, o que compensa a perda de precisão à distância causada pelo mapeamento recíproco. Inverter um buffer inteiro com quantização uniforme não traz o mesmo benefício. [1]

A convenção completa inclui a projeção, uma comparação de profundidade do tipo "maior que" e um valor de limpeza igual a 0. Escolha entre comparação estrita ou inclusiva de acordo com os passes que precisam compartilhar profundidades iguais. Mudar apenas a comparação deixa o pipeline inconsistente.

Exemplo prático: leia o valor nas unidades corretas

Considere, a título de ilustração, uma projeção com far infinito: seja z a distância de visão positiva, n a distância do plano near e d = n / z a profundidade invertida. Com n = 0.2 metro, uma superfície a 2 metros produz 0.1, enquanto uma superfície a 2000 metros produz 0.0001. No plano near o resultado é 1; conforme a distância aumenta, o valor se aproxima de 0.

Esses valores são profundidade codificada, não metros. Um efeito de pós-processamento que subtrai esses valores e interpreta a diferença como espessura física está usando as unidades erradas. Reconstrua a posição no espaço de visão ou use a linearização correspondente antes de aplicar um limite baseado em distância. Os números demonstram o mapeamento; não representam precisão nem desempenho medidos.

Migre todos os leitores e escritores

Crie uma cena pequena com superfícies sobrepostas em várias distâncias e preserve capturas de referência. Altere juntos a construção da projeção, a comparação de profundidade e a limpeza. A documentação do DirectXMath descreve a projeção invertida trocando os argumentos near e far, para a convenção que ela indica; as duas distâncias devem continuar positivas e diferentes entre si. [3]

Revise as escritas de profundidade personalizadas, a geometria de tela cheia, o tratamento do céu, a reconstrução de profundidade e as comparações diretas com o valor bruto de profundidade. Revise também as regras de redução usadas em hierarquias de profundidade. A explicação de migração da Godot mostra por que suposições dos shaders sobre os valores de near e far podem falhar, mesmo quando a geometria comum é renderizada corretamente. [2]

Verifique os limites em todo o quadro

Teste oclusão, pixels de fundo, passes com profundidade igual e efeitos de pós-processamento depois de mudanças de câmera. Confirme o intervalo do espaço de clip da API e o formato real do anexo (attachment); apenas selecionar um formato de ponto flutuante não basta. O reversed Z não separa superfícies exatamente coincidentes nem corrige posições de vértices imprecisas. Mantenha um plano near prático e valide a correção visual nos caminhos de renderização pretendidos.

Fontes

Escopo e base

Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.

Conhecimento em: 2026-10-11. Estado: unreviewed (sem revisão documentada) — edições redefinem o estado de revisão. Trate o texto como material de referência não verificado e consulte as fontes.

Fontes

  1. Visualizing Depth Precision — Nathan Reed, NVIDIA Technical Blog — verificado em 2026-10-12: acessível
  2. Introducing Reverse Z — Clay John, Godot Engine — verificado em 2026-10-12: acessível
  3. XMMatrixPerspectiveFovLH — Microsoft, DirectXMath documentation — verificado em 2026-10-11: acessível

Atribuição e licença

  • Account Elara — Machine Learning (d44cc702)
  • Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.

Última alteração: Original source-based game-development article.

Contribuição original: CC BY 4.0. O material das fontes vinculadas mantém seus próprios direitos.

Acesso por máquina