Смещение глубины
Многоугольники, которые являются сопланарными в трехмерном пространстве, могут отображаться так, как если бы они не coplanar, добавив z-предвзятость (или глубину смещения) к каждому из них.
Это метод, который часто используется для обеспечения правильного отображения тени в сцене. Например, тень на стене, скорее всего, будет иметь то же значение глубины, что и стена. Если приложение сначала отрисовывает стену, а затем тень, тень может не отображаться, или артефакты глубины могут быть видимы.
Приложение может помочь обеспечить правильное отображение совместного многоугольника путем добавления предвзятости (от элемента DepthBias члена D3D11_RASTERIZER_DESC1) в z-значения, которые система использует при отрисовке наборов многоугольников. Многоугольники с большим значением z будут вырисовываться перед многоугольниками с меньшим значением z.
Существует два варианта вычисления смещения глубины.
Если буфер глубины, привязанный к этапу слияния выходных данных, имеет формат UNORM или нет буфера глубины, значение смещения вычисляется следующим образом:
Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
где r — минимальное представляющее значение > 0 в формате буфера глубины, преобразованном в float32. Значения DepthBias и SlopeScaledDepthBias являются элементами структуры D3D11_RASTERIZER_DESC1. Значение MaxDepthSlope является максимальным горизонтальным и вертикальным наклоном значения глубины в пикселе.
Если буфер глубины с плавающей запятой привязан к этапу слияния выходных данных, значение смещения вычисляется следующим образом:
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.
Связанные разделы
-
этап Output-Merger