Partilhar via


Viés de profundidade

Polígonos que são coplanares no espaço 3D podem ser feitos para aparecer como se não fossem coplanares, adicionando um z-bias (ou viés de profundidade) a cada um.

Esta é uma técnica comumente usada para garantir que as sombras em uma cena sejam exibidas corretamente. Por exemplo, uma sombra em uma parede provavelmente terá o mesmo valor de profundidade que a parede. Se um aplicativo renderizar uma parede primeiro e, em seguida, uma sombra, a sombra pode não estar visível ou artefatos de profundidade podem estar visíveis.

Um aplicativo pode ajudar a garantir que os polígonos coplanares sejam renderizados corretamente, adicionando o viés (do DepthBias membro do D3D11_RASTERIZER_DESC1) aos valores z que o sistema usa ao renderizar os conjuntos de polígonos coplanares. Polígonos com um valor z maior serão desenhados na frente de polígonos com um valor z menor.

Há duas opções para calcular o viés de profundidade.

  1. Se o buffer de profundidade atualmente vinculado ao estágio de fusão de saída tiver um formato de UNORM ou nenhum buffer de profundidade estiver vinculado, o valor de viés será calculado da seguinte forma:

    Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
    

    onde r é o valor mínimo representável > 0 no formato depth-buffer convertido para float32. Os valores DepthBias e SlopeScaledDepthBias são D3D11_RASTERIZER_DESC1 membros da estrutura. O valor de MaxDepthSlope é o máximo das inclinações horizontais e verticais do valor de profundidade no pixel.

  2. Se um buffer de profundidade de ponto flutuante estiver vinculado ao estágio de fusão de saída, o valor de viés será calculado da seguinte forma:

    Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) +
                SlopeScaledDepthBias * MaxDepthSlope;
    

    onde r é o número de bits mantissa na representação de ponto flutuante (excluindo o bit oculto); por exemplo, 23 para float32.

O valor de viés é então fixado assim:

if(DepthBiasClamp > 0)
    Bias = min(DepthBiasClamp, Bias)
else if(DepthBiasClamp < 0)
    Bias = max(DepthBiasClamp, Bias)

O valor de polarização é então usado para calcular a profundidade do pixel.

if ( (DepthBias != 0) || (SlopeScaledDepthBias != 0) )
    z = z + Bias

Operações de viés de profundidade ocorrem em vértices após o clipping, portanto, o viés de profundidade não tem efeito sobre o recorte geométrico. O valor de polarização é constante para uma determinada primitiva e é adicionado ao valor z para cada vértice antes da configuração do interpolador. Quando você usa níveis de recurso 10.0 e superiores, todos os cálculos de viés são executados usando aritmética de ponto flutuante de 32 bits. O viés não é aplicado a nenhuma primitiva de ponto ou linha, exceto para linhas desenhadas no modo wireframe.

Um dos artefatos com sombras baseadas em buffer de sombra é a acne de sombra, ou um sombreamento de superfície em si devido a pequenas diferenças entre o cálculo de profundidade em um sombreador e a profundidade da mesma superfície no buffer de sombra. Uma maneira de aliviar isso é usar DepthBias e SlopeScaledDepthBias ao renderizar um buffer de sombra. A ideia é empurrar superfícies para fora o suficiente enquanto renderiza um buffer de sombra para que o resultado da comparação (entre o buffer de sombra z e o sombreador z) seja consistente em toda a superfície e evitar o autosombreamento local.

No entanto, usar DepthBias e SlopeScaledDepthBias pode introduzir novos problemas de renderização quando um polígono visto em um ângulo extremamente nítido faz com que a equação de viés gere um valor z muito grande. Isso, na verdade, empurra o polígono extremamente longe da superfície original no mapa de sombras. Uma maneira de ajudar a aliviar esse problema específico é usar DepthBiasClamp, que fornece um limite superior (positivo ou negativo) sobre a magnitude do viés z calculado.

Observação

Para níveis de recurso 9.1, 9.2, 9.3 DepthBiasClamp não é suportado.

 

Output-Merger Estágio