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.
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.
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 .
Tópicos relacionados