Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wielokąty, które są współpłatne w przestrzeni 3D, mogą być wyświetlane tak, jakby nie były coplanar, dodając stronniczy z (lub stronniczy głębokość) do każdego z nich.
Jest to technika często używana w celu zapewnienia prawidłowego wyświetlania cieni w scenie. Na przykład cień na ścianie prawdopodobnie będzie miał taką samą wartość głębokości jak ściana. Jeśli aplikacja najpierw renderuje ścianę, a następnie cień, cień może nie być widoczny lub artefakty głębokości mogą być widoczne.
Aplikacja może pomóc w zapewnieniu prawidłowego renderowania wielokątów coplanarnych przez dodanie stronniczości (z elementu DepthBias elementu członkowskiego D3D11_RASTERIZER_DESC1) do wartości z używanych przez system podczas renderowania zestawów wielokątów współpłatnych. Wielokąty o większej wartości z będą rysowane przed wielokątami o mniejszej wartości z.
Istnieją dwie opcje obliczania stronniczych głębokości.
Jeśli bufor głębokości obecnie powiązany z etapem fuzji danych wyjściowych ma format UNORM lub nie ma powiązanego buforu głębokości, wartość stronnicza jest obliczana w następujący sposób:
Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;gdzie r jest minimalną wartością godną reprezentowania > 0 w formacie buforu głębokości przekonwertowanym na float32. Wartości DepthBias i SlopeScaledDepthBias są D3D11_RASTERIZER_DESC1 składowymi struktury. Wartość MaxDepthSlope jest maksymalną wartością poziomą i pionową wartości głębokości w pikselu.
Jeśli bufor głębokości zmiennoprzecinkowej jest powiązany z etapem fuzji danych wyjściowych, wartość stronnicza jest obliczana w następujący sposób:
Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) + SlopeScaledDepthBias * MaxDepthSlope;gdzie r jest liczbą bitów mantissa w reprezentacji zmiennoprzecinkowych (z wyłączeniem ukrytego bitu); na przykład 23 dla float32.
Wartość stronnicza jest następnie zaciśnięta w następujący sposób:
if(DepthBiasClamp > 0)
Bias = min(DepthBiasClamp, Bias)
else if(DepthBiasClamp < 0)
Bias = max(DepthBiasClamp, Bias)
Wartość stronnicza jest następnie używana do obliczania głębokości pikseli.
if ( (DepthBias != 0) || (SlopeScaledDepthBias != 0) )
z = z + Bias
Operacje stronniczość głębokości występują na wierzchołkach po wycięcie, dlatego stronniczość głębokości nie ma wpływu na geometryczne wycinki. Wartość stronnicza jest stała dla danego elementu pierwotnego i jest dodawana do wartości z dla każdego wierzchołka przed konfiguracją interpolatora. W przypadku używania poziomów funkcji 10.0 i nowszych wszystkie obliczenia stronniczych są wykonywane przy użyciu 32-bitowej arytmetyki zmiennoprzecinkowych. Stronniczy nie jest stosowany do żadnego punktu ani linii pierwotnych, z wyjątkiem linii rysowanych w trybie szkieletowym.
Jednym z artefaktów z cieniem na podstawie buforu cienia jest trądzik cienia lub cieniowanie powierzchni z powodu drobnych różnic między obliczeniami głębokości w cieniowaniu, a głębokością tej samej powierzchni w buforze cienia. Jednym ze sposobów złagodzenia tego jest użycie DepthBias i SlopeScaledDepthBias podczas renderowania buforu w tle. Chodzi o to, aby wypchnąć powierzchnie wystarczająco dużo podczas renderowania buforu cienia, tak aby wynik porównania (między buforem cieniowania z i cieniowaniem z) był spójny na powierzchni i unikał lokalnego cieniowania.
Jednak użycie DepthBias i SlopeScaledDepthBias może wprowadzić nowe problemy renderowania, gdy wielokąt wyświetlany pod bardzo ostrym kątem powoduje równanie stronniczości w celu wygenerowania bardzo dużej wartości z. To w efekcie pcha wielokąt bardzo daleko od oryginalnej powierzchni na mapie cienia. Jednym ze sposobów ułatwienia złagodzenia tego konkretnego problemu jest użycie DepthBiasClamp, który zapewnia górną granicę (dodatnią lub ujemną) na podstawie wielkości obliczonej stronniczości z.
Nuta
W przypadku poziomów funkcji 9.1, 9.2, 9.3, DepthBiasClamp nie jest obsługiwana.
Tematy pokrewne
-
etapuOutput-Merger