Sesgo de profundidad

Los polígonos que son coplanares en el espacio 3D se pueden hacer para que aparezcan como si no fueran coplanar agregando un sesgo z (o sesgo de profundidad) a cada uno.

Se trata de una técnica que se usa normalmente para garantizar que las sombras de una escena se muestren correctamente. Por ejemplo, una sombra en una pared probablemente tendrá el mismo valor de profundidad que la pared. Si una aplicación representa primero una pared y, a continuación, una sombra, es posible que la sombra no sea visible o que los artefactos de profundidad estén visibles.

Una aplicación puede ayudar a garantizar que los polígonos coplanares se representan correctamente agregando el sesgo (del miembro DepthBias de D3D11_RASTERIZER_DESC1) a los valores z que el sistema usa al representar los conjuntos de polígonos coplanares. Los polígonos con un valor z mayor se dibujarán delante de polígonos con un valor z más pequeño.

Hay dos opciones para calcular el sesgo de profundidad.

  1. Si el búfer de profundidad enlazado actualmente a la fase de fusión de salida tiene un formato UNORM o no hay ningún búfer de profundidad enlazado, el valor de sesgo se calcula de la siguiente manera:

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

    donde r es el valor > mínimo representable 0 en el formato de búfer de profundidad convertido a float32. Los valores DepthBias y SlopeScaledDepthBias son miembros de estructura D3D11_RASTERIZER_DESC1 . El valor MaxDepthSlope es el máximo de las pendientes horizontales y verticales del valor de profundidad en el píxel.

  2. Si un búfer de profundidad de punto flotante está enlazado a la fase de fusión de salida, el valor de sesgo se calcula de la siguiente manera:

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

    donde r es el número de bits de mantisa en la representación de punto flotante (excepto el bit oculto); por ejemplo, 23 para float32.

A continuación, el valor de sesgo se fija de la siguiente manera:

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

A continuación, el valor de sesgo se usa para calcular la profundidad del píxel.

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

Las operaciones de sesgo de profundidad se producen en vértices después del recorte, por lo tanto, el sesgo de profundidad no tiene ningún efecto en el recorte geométrico. El valor de sesgo es constante para un primitivo determinado y se agrega al valor z de cada vértice antes de la configuración del interpolador. Cuando se usan los niveles de características 10.0 y superiores, todos los cálculos de sesgo se realizan mediante aritmética de punto flotante de 32 bits. El sesgo no se aplica a ningún primitivo de punto o línea, excepto las líneas dibujadas en modo de trama de alambre.

Uno de los artefactos con sombras basadas en el búfer de sombras es el acné de sombra, o una sombra de superficie debido a pequeñas diferencias entre el cálculo de profundidad en un sombreador, y la profundidad de la misma superficie en el búfer de sombras. Una manera de aliviar esto es usar DepthBias y SlopeScaledDepthBias al representar un búfer de sombras. La idea es insertar superficies lo suficiente mientras se representa un búfer de sombras para que el resultado de la comparación (entre el búfer de sombras z y el sombreador z) sea coherente en toda la superficie y evite el sombreado local.

Sin embargo, el uso de DepthBias y SlopeScaledDepthBias puede introducir nuevos problemas de representación cuando un polígono visto en un ángulo extremadamente agudo hace que la ecuación de sesgo genere un valor z muy grande. Esto, en efecto, empuja el polígono muy lejos de la superficie original en el mapa de sombras. Una manera de ayudar a aliviar este problema en particular es usar DepthBiasClamp, que proporciona un límite superior (positivo o negativo) sobre la magnitud del sesgo z calculado.

Nota:

Para los niveles de características 9.1, 9.2, 9.3, DepthBiasClamp no se admite.

 

Fase de fusión de salida