Compartilhar via


Buffers de profundidade

Um buffer de profundidade, ou z-buffer, armazena informações de profundidade para controlar quais áreas de polígonos são renderizadas em vez de ocultas da exibição.

Visão geral

Um buffer de profundidade, geralmente chamado de buffer z ou buffer w, é uma propriedade do dispositivo que armazena informações de profundidade a serem usadas pelo Direct3D. Quando o Direct3D renderiza uma cena em uma superfície de destino, ele pode usar a memória em uma superfície de buffer de profundidade associada como um espaço de trabalho para determinar como os pixels de polígonos rasterizados ocluem uns aos outros. O Direct3D usa uma superfície Direct3D fora da tela como o destino no qual os valores de cor finais são gravados. A superfície de buffer de profundidade associada à superfície de destino de renderização é usada para armazenar informações de profundidade que informam ao Direct3D a profundidade de cada pixel visível na cena.

Quando uma cena é rasterizada com buffer de profundidade habilitado, cada ponto na superfície de renderização é testado. Os valores no buffer de profundidade podem ser a coordenada z de um ponto ou sua coordenada w homogênea - a partir da localização do ponto (x,y,z,w) no espaço de projeção. Um buffer de profundidade que usa valores z geralmente é chamado de z-buffer, e um que usa valores w é chamado de w-buffer. Cada tipo de buffer de profundidade tem vantagens e desvantagens, que serão discutidas posteriormente.

No início do teste, o valor de profundidade no buffer de profundidade é definido como o maior valor possível para a cena. O valor de cor na superfície de renderização é definido como o valor da cor do plano de fundo ou o valor da cor da textura do plano de fundo nesse ponto. Cada polígono na cena é testado para ver se ele se cruza com a coordenada atual (x,y) na superfície de renderização.

Se ele se cruzar, o valor de profundidade - que será a coordenada z em um buffer z e a coordenada w em um buffer w - no ponto atual é testado para ver se é menor que o valor de profundidade armazenado no buffer de profundidade. Se a profundidade do valor do polígono for menor, ele será armazenado no buffer de profundidade e o valor de cor do polígono será gravado no ponto atual na superfície de renderização. Se o valor de profundidade do polígono nesse ponto for maior, o próximo polígono na lista será testado. Esse processo é mostrado no diagrama a seguir.

Diagrama de valores de profundidade de teste

Técnicas de buffer

Embora a maioria dos aplicativos não use esse recurso, você pode alterar a comparação que o Direct3D usa para determinar quais valores são colocados no buffer de profundidade e, posteriormente, na superfície de destino de renderização. Em alguns hardwares, alterar a função de comparação pode desabilitar o teste z hierárquico.

Quase todos os aceleradores no mercado suportam z-buffering, tornando os z-buffers o tipo mais comum de buffer de profundidade atualmente. Por mais onipresentes que sejam, os z-buffers têm suas desvantagens. Devido à matemática envolvida, os valores z gerados em um buffer z tendem a não ser distribuídos uniformemente na faixa do buffer z (normalmente 0,0 a 1,0, inclusive).

Especificamente, a proporção entre os planos de recorte distante e próximo afeta fortemente a distribuição desigual dos valores z. Usando uma proporção de distância de plano distante para distância de plano próximo de 100, 90% da faixa de buffer de profundidade é gasta nos primeiros 10% da faixa de profundidade da cena. Aplicações típicas para entretenimento ou simulações visuais com cenas externas geralmente exigem proporções de plano distante/plano próximo entre 1.000 e 10.000. Em uma proporção de 1.000, 98% do intervalo é gasto nos primeiros 2% da faixa de profundidade, e a distribuição piora com proporções mais altas. Isso pode causar artefatos de superfície ocultos em objetos distantes, especialmente ao usar buffers de profundidade de 16 bits, a profundidade de bits mais comumente suportada.

Um buffer de profundidade baseado em w, por outro lado, geralmente é distribuído de maneira mais uniforme entre os planos de clipe próximo e distante do que um buffer z. O principal benefício é que a proporção de distâncias para os planos de corte distantes e próximos não é mais um problema. Isso permite que os aplicativos suportem grandes faixas máximas, ao mesmo tempo em que obtêm buffer de profundidade relativamente preciso próximo ao ponto de visão. Um buffer de profundidade baseado em w não é perfeito e, às vezes, pode exibir artefatos de superfície ocultos para objetos próximos. Outra desvantagem da abordagem w-buffered está relacionada ao suporte de hardware: o w-buffering não é suportado tão amplamente no hardware quanto o z-buffering.

O uso de um buffer z requer sobrecarga durante a renderização. Várias técnicas podem ser usadas para otimizar a renderização ao usar z-buffers. Os aplicativos podem aumentar o desempenho ao usar z-buffering e texturização, garantindo que as cenas sejam renderizadas da frente para trás. Primitivos texturizados com buffer z são pré-testados em relação ao buffer z em uma base de linha de varredura. Se uma linha de varredura estiver oculta por um polígono renderizado anteriormente, o sistema a rejeitará de forma rápida e eficiente. O buffer Z pode melhorar o desempenho, mas a técnica é mais útil quando uma cena desenha os mesmos pixels mais de uma vez. Isso é difícil de calcular exatamente, mas muitas vezes você pode fazer uma aproximação. Se os mesmos pixels forem desenhados menos de duas vezes, você poderá obter o melhor desempenho desativando o z-buffering e renderizando a cena de trás para frente.

A interpretação real de um valor de profundidade é específica para o renderizador.

Buffers de profundidade e estêncil