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
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
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
- [1] Visualizing Depth Precision — Nathan Reed, NVIDIA Technical Blog.
- [2] Introducing Reverse Z — Clay John, Godot Engine.
- [3] XMMatrixPerspectiveFovLH — Microsoft, DirectXMath documentation.
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
- Visualizing Depth Precision — Nathan Reed, NVIDIA Technical Blog — verificado em 2026-10-12: acessível
- Introducing Reverse Z — Clay John, Godot Engine — verificado em 2026-10-12: acessível
- 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.