Смещение глубины

Многоугольников, которые являются копланарными в трехмерном пространстве, можно сделать так, чтобы они выглядели как не копланарные, добавив z-смещение (или смещение глубины) к каждому из них.

Это метод, который обычно используется для обеспечения правильного отображения теней в сцене. Например, тень на стене, скорее всего, будет иметь то же значение глубины, что и стена. Если приложение сначала отображает стену, а затем тень, тень может быть невидимой или артефакты глубины.

Приложение может помочь обеспечить правильную отрисовку копланарных многоугольников, добавив смещение (от элемента DepthBiasD3D11_RASTERIZER_DESC1) к z-значениям, которые система использует при отрисовке наборов сопланарных многоугольников. Многоугольник с большим значением z будет нарисован перед многоугольниками с меньшим значением z.

Существует два варианта вычисления смещения глубины.

  1. Если буфер глубины, в настоящее время привязанный к этапу слияния вывода, имеет формат UNORM или буфер глубины не привязан, значение смещения вычисляется следующим образом:

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

    где r — минимальное представляемое значение > 0 в формате буфера глубины, преобразованное в float32. Значения DepthBias и SlopeScaledDepthBias являются D3D11_RASTERIZER_DESC1 элементами структуры. Значение MaxDepthSlope — это максимум горизонтальных и вертикальных наклонов значения глубины в пикселе.

  2. Если буфер глубины с плавающей запятой привязан к этапу вывода и слияния, значение смещения вычисляется следующим образом:

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

    где r — количество битов мантиссы в представлении с плавающей запятой (за исключением скрытого бита); например, 23 для float32.

Затем значение смещения зажимается следующим образом:

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

Затем значение смещения используется для вычисления глубины пикселей.

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

Операции смещения глубины происходят на вершинах после обрезки, поэтому смещение глубины не влияет на геометрическую обрезку. Значение смещения является константой для заданного примитива и добавляется к значению z для каждой вершины перед настройкой интерполятора. При использовании уровней компонентов 10.0 и выше все вычисления смещения выполняются с использованием 32-разрядной арифметики с плавающей запятой. Смещение не применяется к примитивам точек или линий, за исключением линий, нарисованных в режиме проволочной рамки.

Одним из артефактов с теневыми тенями на основе буфера тени является теневая акне или сама затенение поверхности из-за незначительных различий между вычислением глубины в шейдере и глубиной одной и той же поверхности в буфере теней. Один из способов устранить эту проблему — использовать DepthBias и SlopeScaledDepthBias при отрисовке буфера теней. Идея заключается в том, чтобы выталкивать поверхности достаточно при отрисовке буфера теней, чтобы результат сравнения (между буфером тени z и шейдером z) был согласованным по всей поверхности и избегал локального самозатенения.

Однако использование DepthBias и SlopeScaledDepthBias может привести к возникновению новых проблем отрисовки, когда многоугольник, просматриваемый под чрезвычайно острым углом, приводит к тому, что уравнение смещения создает очень большое значение z. Это фактически толкает многоугольник очень далеко от исходной поверхности на карте теней. Одним из способов решения этой конкретной проблемы является использование DepthBiasClamp, который обеспечивает верхнюю границу (положительную или отрицательную) на величину вычисленного смещения z.

Примечание

Для уровней функций 9.1, 9.2, 9.3 DepthBiasClamp не поддерживается.

 

Стадия средства слияния вывода