Desvio 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 viés z (ou viés de profundidade) a cada um deles.

Essa é 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 depois uma sombra, a sombra poderá não estar visível ou artefatos de profundidade poderão estar visíveis.

Um aplicativo pode ajudar a garantir que os polígonos coplanares sejam renderizados corretamente adicionando o desvio (do membro DepthBias de 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 desvio de profundidade.

  1. Se o buffer de profundidade atualmente associado ao estágio de fusão de saída tiver um formato UNORM ou nenhum buffer de profundidade estiver associado, o valor de desvio será calculado da seguinte maneira:

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

    em que r é o valor > mínimo representável 0 no formato de buffer de profundidade convertido em float32. Os valores DepthBias e SlopeScaledDepthBias são D3D11_RASTERIZER_DESC1 membros da estrutura. O valor 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 associado ao estágio de fusão de saída, o valor de desvio será calculado da seguinte maneira:

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

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

Em seguida, o valor de desvio é fixado da seguinte forma:

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

Em seguida, o valor de desvio é usado para calcular a profundidade do pixel.

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

As operações de desvio de profundidade ocorrem em vértices após o recorte, portanto, o desvio de profundidade não tem efeito sobre o recorte geométrico. O valor de desvio é constante para um determinado primitivo e é adicionado ao valor z para cada vértice antes da configuração do interpolador. Quando você usa níveis de recursos 10.0 e superiores, todos os cálculos de desvio são executados usando aritmética de ponto flutuante de 32 bits. O desvio não é aplicado a nenhum ponto ou primitivo de linha, exceto para linhas desenhadas no modo de fio.

Um dos artefatos com sombras baseadas em buffer de sombra é a acne de sombra ou uma superfície sombreada por si só devido a pequenas diferenças entre a computação 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 é enviar superfícies por push o suficiente ao renderizar um buffer de sombra para que o resultado da comparação (entre o buffer de sombra z e o sombreador z) seja consistente na superfície e evite o sombreamento local.

No entanto, o uso de DepthBias e SlopeScaledDepthBias pode introduzir novos problemas de renderização quando um polígono exibido em um ângulo extremamente afiado faz com que a equação de desvio gere um valor z muito grande. Isso, na verdade, empurra o polígono extremamente para longe da superfície original no mapa de sombra. 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 os níveis de recursos 9.1, 9.2, 9.3, Não há suporte para DepthBiasClamp .

 

Estágio de fusão de saída