Compartilhar via


Buffers de profundidade (Direct3D 9)

Um buffer de profundidade, geralmente chamado de buffer z ou w-buffer, é uma propriedade do dispositivo que armazena informações de profundidade a serem usadas pelo Direct3D. Quando o Direct3D renderiza uma cena para uma superfície de destino, ele pode usar a memória em uma superfície de buffer de profundidade associada como um workspace 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 para o qual os valores de cor final 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 – 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 buffer z e um que usa valores w é chamado de buffer w. Cada tipo de buffer de profundidade tem vantagens e desvantagens, que sã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 da tela 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 isso acontecer, o valor de profundidade - que será a coordenada z em um buffer z e a coordenada w em um buffer w - no ponto atual será testado para ver se ele é menor do que o valor de profundidade armazenado no buffer de profundidade. Se a profundidade do valor do polígono for menor, ela será armazenada 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 da lista será testado. Esse processo é mostrado no diagrama a seguir.

diagrama de valores de profundidade de teste

Nota

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. Para fazer isso, altere o valor do estado de renderização D3DRS_ZFUNC. Em algum hardware, alterar a função compare pode desabilitar o teste z hierárquico.

 

Quase todos os aceleradores no mercado dão suporte ao buffer z, tornando os buffers z o tipo mais comum de buffer de profundidade atualmente. Por mais onipresente que seja, os buffers z têm suas desvantagens. Devido à matemática envolvida, os valores z gerados em um buffer z tendem a não ser distribuídos uniformemente pelo intervalo de buffer z (normalmente 0,0 a 1,0, inclusive). Especificamente, a proporção entre os planos de recorte distante e próximo afeta fortemente o quão irregularmente os valores z são distribuídos. Usando uma distância de plano distante para uma taxa de distância de plano próximo de 100, 90% do intervalo de buffers de profundidade é gasto nos primeiros 10% do intervalo de profundidade da cena. Aplicativos típicos para simulações visuais ou de entretenimento com cenas externas geralmente exigem proporções de plano distante/plano próximo de qualquer lugar entre 1.000 e 10.000. A uma taxa de 1.000, 98% do intervalo é gasto nos primeiros 2% do intervalo de profundidade, e a distribuição fica pior com taxas 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 bit com mais suporte.

Um buffer de profundidade baseado em w, por outro lado, geralmente é distribuído mais uniformemente entre os planos de clipe próximos e distantes do que um buffer z. O principal benefício é que a proporção de distâncias para os planos de recorte distantes e próximos não é mais um problema. Isso permite que os aplicativos ofereçam suporte a grandes intervalos máximos, enquanto ainda têm um buffer de profundidade relativamente preciso perto do ponto ocular. 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 para a abordagem em buffer w está relacionada ao suporte de hardware: o buffer w não tem suporte tão amplo no hardware quanto o buffer z.

Usar um buffer z requer sobrecarga durante a renderização. Várias técnicas podem ser usadas para otimizar a renderização ao usar buffers z. Para obter detalhes, consulte de desempenho do buffer Z.

Nota

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

 

Esta seção apresenta informações sobre como usar buffers de profundidade para remoção oculta de linha e superfície oculta.

de renderização Direct3D