Поделиться через


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

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

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

Приложение может помочь обеспечить правильное отображение совместного многоугольника путем добавления предвзятости (от элемента DepthBias члена D3D11_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 — это количество битов mantissa в представлении с плавающей запятой (за исключением скрытого бита); например, 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 не поддерживается.

 

этап Output-Merger