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 suele usar para asegurarse de que las sombras de una escena se muestran correctamente. Por ejemplo, una sombra en una pared probablemente tendrá el mismo valor de profundidad que la pared. Si una aplicación representa primero un muro y, a continuación, una sombra, es posible que la sombra no sea visible o que los artefactos de profundidad sean visibles.
Una aplicación puede ayudar a garantizar que los polígonos coplanares se representan correctamente agregando el sesgo (de la DepthBias miembro de D3D11_RASTERIZER_DESC1) a los valores z que usa el sistema 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.
Si el búfer de profundidad enlazado actualmente a la fase de fusión de salida tiene un formato de UNORM o ningún búfer de profundidad está enlazado, el valor de sesgo se calcula de la siguiente manera:
Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
donde r es el valor mínimo que se puede representar > 0 en el formato de búfer de profundidad convertido a float32. Los valores de DepthBias y SlopeScaledDepthBias son miembros de estructura D3D11_RASTERIZER_DESC1. El valor de MaxDepthSlope es el máximo de las pendientes horizontales y verticales del valor de profundidad en el píxel.
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. Al usar niveles de características 10,0 y versiones posteriores, todos los cálculos de sesgo se realizan con 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 sombras 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 suficientes mientras se representa un búfer de sombras para que el resultado de la comparación (entre el búfer de sombra 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 niveles de características 9.1, 9.2, 9.3, depthBiasClamp no se admite.
Temas relacionados
-
fase deOutput-Merger