Djupförskjutning
Polygoner som är coplanar i 3D-utrymme kan fås att verka som om de inte är coplanar genom att lägga till en z-bias (eller djupförskjutning) till var och en.
Det här är en teknik som ofta används för att säkerställa att skuggor i en scen visas korrekt. Till exempel kommer en skugga på en vägg sannolikt att ha samma djupvärde som väggen. Om ett program renderar en vägg först och sedan en skugga kanske skuggan inte visas, eller så kan djupartefakter vara synliga.
Ett program kan hjälpa till att se till att coplanarpolygoner återges korrekt genom att lägga till bias (från DepthBias medlem i D3D11_RASTERIZER_DESC1) till de z-värden som systemet använder vid återgivning av uppsättningar av coplanarpolygoner. Polygoner med ett större z-värde ritas framför polygoner med ett mindre z-värde.
Det finns två alternativ för att beräkna djupförskjutning.
Om djupbufferten som för närvarande är bunden till utdatasammanslagningssteget har ett UNORM- format eller om ingen djupbuffert är bunden beräknas biasvärdet så här:
Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
där r är det minsta representerande värdet > 0 i djupbuffertformatet som konverterats till float32. Värdena DepthBias och SlopeScaledDepthBias är D3D11_RASTERIZER_DESC1 strukturmedlemmar. Värdet MaxDepthSlope är det maximala värdet för djupvärdets vågräta och lodräta lutningar vid pixeln.
Om en flyttalsdjupbuffert är bunden till utdatasammanslagningsfasen beräknas biasvärdet så här:
Bias = (float)DepthBias * 2**(exponent(max z in primitive) - r) + SlopeScaledDepthBias * MaxDepthSlope;
där r är antalet mantissabitar i flyttalsrepresentationen (exklusive den dolda biten); till exempel 23 för float32.
Bias-värdet kläms sedan så här:
if(DepthBiasClamp > 0)
Bias = min(DepthBiasClamp, Bias)
else if(DepthBiasClamp < 0)
Bias = max(DepthBiasClamp, Bias)
Bias-värdet används sedan för att beräkna pixeldjupet.
if ( (DepthBias != 0) || (SlopeScaledDepthBias != 0) )
z = z + Bias
Djup-bias åtgärder sker på hörn efter urklipp, därför har djup-bias ingen effekt på geometriska urklipp. Bias-värdet är konstant för en viss primitiv och läggs till i z-värdet för varje hörn före interpolatorkonfigurationen. När du använder funktionsnivåer 10,0 och högre utförs alla biasberäkningar med hjälp av 32-bitars flyttalsaritmetik. Bias tillämpas inte på någon punkt- eller linjeprimiter, förutom linjer som ritats i trådramsläge.
En av artefakterna med skuggbuffertbaserade skuggor är skuggakak, eller en yta som skuggar sig själv på grund av mindre skillnader mellan djupberäkningen i en skuggning och djupet på samma yta i skuggbufferten. Ett sätt att lindra detta är att använda DepthBias och SlopeScaledDepthBias när du återger en skuggbuffert. Tanken är att trycka ut ytor tillräckligt samtidigt som en skuggbuffert återges så att jämförelseresultatet (mellan skuggbufferten z och skuggningen z) är konsekvent över ytan och undviker lokal självskuggning.
Men med hjälp av DepthBias och SlopeScaledDepthBias kan introducera nya renderingsproblem när en polygon som ses i en extremt skarp vinkel gör att biasekvationen genererar ett mycket stort z-värde. Detta i praktiken driver polygonen extremt långt bort från den ursprungliga ytan i skuggkartan. Ett sätt att hjälpa till att lindra detta specifika problem är att använda DepthBiasClamp, som ger en övre gräns (positiv eller negativ) på storleken på z bias beräknat.
Not
För funktionsnivåer 9.1, 9.2, 9.3 DepthBiasClamp stöds inte.
Relaterade ämnen