Buffers de profundidade (Direct3D 9)
Um buffer de profundidade, geralmente chamado de z-buffer ou w-buffer, é 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 se 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 o 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 é frequentemente 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 mais adiante.
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 da 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 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 é testado para ver se é menor do 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 da lista será testado. Este processo é mostrado no diagrama a seguir.
Observação
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 para o estado de renderização D3DRS_ZFUNC. Em alguns hardwares, alterar a função de comparação pode desativar o teste z hierárquico.
Quase todos os aceleradores no mercado suportam z-buffering, tornando 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 z-buffer tendem a não ser distribuídos uniformemente ao longo da faixa z-buffer (tipicamente 0,0 a 1,0, inclusive). Especificamente, a razão entre os planos de corte distante e próximo afeta fortemente a forma como os valores z são distribuídos de forma desigual. Usando uma relação 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 relações de plano distante/plano próximo de qualquer lugar 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 se torna pior 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, é frequentemente distribuído de forma mais uniforme entre os planos de clipe próximos e distantes do que um buffer z. O principal benefício é que a relaçã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 intervalos máximos, enquanto ainda obtêm buffering de profundidade relativamente preciso perto do ponto do olho. 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: w-buffering não é suportado tão amplamente em hardware quanto z-buffering.
Usar um z-buffer requer sobrecarga durante a renderização. Várias técnicas podem ser usadas para otimizar a renderização ao usar z-buffers. Para obter detalhes, consulte de desempenho do Z-Buffer .
Observação
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 de linhas ocultas e superfícies ocultas.
- Consultando suporte a buffer de profundidade (Direct3D 9)
- Criando um buffer de profundidade (Direct3D 9)
- Ativando o buffer de profundidade (Direct3D 9)
- Recuperando um buffer de profundidade (Direct3D 9)
- Limpar buffers de profundidade (Direct3D 9)
- Alterando o acesso de gravação do buffer de profundidade (Direct3D 9)
- Alterando funções de comparação de buffer de profundidade (Direct3D 9)
Tópicos relacionados