Biais de profondeur
Les polygones coplanaires dans l’espace 3D peuvent apparaître comme s’ils ne sont pas coplanaires en ajoutant un biais z (ou biais de profondeur) à chacun d’eux.
Il s’agit d’une technique couramment utilisée pour s’assurer que les ombres d’une scène sont correctement affichées. Pour instance, une ombre sur un mur aura probablement la même valeur de profondeur que le mur. Si une application restitue d’abord un mur, puis une ombre, l’ombre peut ne pas être visible ou les artefacts de profondeur peuvent être visibles.
Une application peut aider à s’assurer que les polygones coplanaires sont restitués correctement en ajoutant le biais (du membre DepthBias de D3D11_RASTERIZER_DESC1) aux valeurs z que le système utilise lors du rendu des jeux de polygones coplanaires. Les polygones avec une valeur z plus grande sont dessinés devant les polygones avec une valeur z plus petite.
Il existe deux options pour calculer le biais de profondeur.
Si la mémoire tampon de profondeur actuellement liée à l’étape de fusion de sortie a un format UNORM ou si aucune mémoire tampon de profondeur n’est liée, la valeur de biais est calculée comme suit :
Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
où r est la valeur > minimale représentable 0 dans le format de mémoire tampon de profondeur converti en float32. Les valeurs DepthBias et SlopeScaledDepthBias sont D3D11_RASTERIZER_DESC1 membres de la structure. La valeur MaxDepthSlope est la valeur maximale des pentes horizontales et verticales de la valeur de profondeur au pixel.
Si une mémoire tampon de profondeur à virgule flottante est liée à l’étape de fusion de sortie, la valeur de biais est calculée comme suit :
Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) + SlopeScaledDepthBias * MaxDepthSlope;
où r est le nombre de bits de mantisse dans la représentation à virgule flottante (à l’exclusion du bit masqué) ; par exemple, 23 pour float32.
La valeur de biais est ensuite limitée comme suit :
if(DepthBiasClamp > 0)
Bias = min(DepthBiasClamp, Bias)
else if(DepthBiasClamp < 0)
Bias = max(DepthBiasClamp, Bias)
La valeur de biais est ensuite utilisée pour calculer la profondeur des pixels.
if ( (DepthBias != 0) || (SlopeScaledDepthBias != 0) )
z = z + Bias
Les opérations de biais de profondeur se produisent sur les sommets après le découpage. Par conséquent, le biais de profondeur n’a aucun effet sur le découpage géométrique. La valeur de biais est constante pour une primitive donnée et est ajoutée à la valeur z de chaque sommet avant la configuration de l’interpolateur. Lorsque vous utilisez les niveaux de fonctionnalité 10.0 et supérieurs, tous les calculs de biais sont effectués à l’aide de l’arithmétique à virgule flottante 32 bits. Le biais n’est appliqué à aucune primitive de point ou de ligne, à l’exception des lignes dessinées en mode filaire.
L’un des artefacts avec des ombres basées sur la mémoire tampon d’ombre est l’acné d’ombre, ou une ombre de surface elle-même en raison de différences mineures entre le calcul de profondeur dans un nuanceur et la profondeur de la même surface dans la mémoire tampon d’ombre. Une façon d’atténuer ce problème consiste à utiliser DepthBias et SlopeScaledDepthBias lors du rendu d’une mémoire tampon d’ombre. L’idée est de pousser suffisamment les surfaces vers l’extérieur lors du rendu d’une mémoire tampon d’ombre afin que le résultat de comparaison (entre la mémoire tampon d’ombre z et le nuanceur z) soit cohérent sur l’ensemble de la surface, et d’éviter l’ombre automatique locale.
Toutefois, l’utilisation de DepthBias et de SlopeScaledDepthBias peut introduire de nouveaux problèmes de rendu lorsqu’un polygone affiché à un angle extrêmement net provoque la génération d’une très grande valeur z par l’équation de biais. Cela pousse en effet le polygone extrêmement loin de la surface d’origine dans la carte d’ombres. Une façon d’atténuer ce problème particulier consiste à utiliser DepthBiasClamp, qui fournit une limite supérieure (positive ou négative) sur l’ampleur du biais z calculé.
Notes
Pour les niveaux de fonctionnalité 9.1, 9.2, 9.3, DepthBiasClamp n’est pas pris en charge.
Rubriques connexes