Настройка функции трафарета глубины

В этом разделе приводится пошаговая инструкция по настройке буфера трафарета глубины и рассматривается состояние трафарета глубины для стадии слияния вывода.

Узнав, как использовать буфер трафарета глубины и соответствующее состояние трафарета глубины, приступайте к изучению сложных техник работы с трафаретами.

Создание состояния Depth-Stencil

Состояние трафарета глубины сообщает стадии средства слияния вывода способ выполнения проверки трафарета глубины. Проверка трафарета глубины позволяет определить, нужно ли рисовать тот или иной пиксель.

Привязка данных трафарета глубины к стадии средства слияния вывода

Привязка состояния трафарета глубины.

Привязка ресурса трафарета глубины с использованием представления.

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

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

  • Одновременно можно связать до 8 однобуферных прорисовок.
  • Все целевые объекты отрисовки должны иметь одинаковый размер во всех измерениях (ширина и высота и глубина для трехмерных объектов или размер массива для *Типов массивов).
  • Каждая однобуферная прорисовка может иметь свой формат данных.
  • Маски записи контролируют, какие данные записываются в однобуферную прорисовку. Маски записи вывода контролируют, какие данные записываются в однобуферные прорисовки на уровне однобуферных прорисовок и компонентов.

Расширенные методы набора элементов

Трафаретная часть буфера трафарета глубины может использоваться для создания эффектов отрисовки, таких как компоновка, переводные картинки и структурирование.

Композиции

Ваше приложение может использовать буфер трафарета для создания двух- или трехмерных изображений в трехмерной сцене. Маска в буфере трафарета используется для ограждения области, которая является поверхностью однобуферной прорисовки. Сохраненную двухмерную информацию, такую как текст или точечные рисунки, затем можно записать в огороженную область. Кроме того, ваше приложение может отрисовывать дополнительные трехмерные примитивы в замаскированный трафаретом регион поверхности однобуферной прорисовки. Приложение даже может отрисовывать всю сцену.

Игры часто предполагают компоновку нескольких трехмерных сцен. Так, в симуляторах вождения, как правило, показано отражение в зеркале заднего вида. В нем отражается происходящее за водителем в трехмерном формате. Это вторая трехмерная сцена, скомпонованная с передним обзором водителя.

Декольтирование

В приложениях Direct3D пользователи с помощью переводных картинок контролируют, какие пиксели из определенного изображения-примитива рисуются на поверхность однобуферной прорисовки. Приложения применяют переводные картинки к изображениям примитивов для правильной отрисовки многоугольников.

Например, следы шин и желтая дорожная разметка должны отображаться непосредственно на поверхности дороги. Однако значения разметки и дорожной поверхности по оси Z совпадают. Поэтому велика вероятность нечеткого разделения этих сущностей буфером глубины. Некоторые пиксели в примитиве заднего вида могут отображаться поверх пикселей в примитиве переднего вида, и наоборот. В результате изображение может дрожать при смене кадра. Этот эффект называется Z-буферизация или "мерцание".

Чтобы решить эту проблему, используйте трафарет для маскировки раздела примитива заднего вида, в котором будет отображаться переводная картинка. Выключите Z-буферизацию и отрисуйте изображение примитива переднего обзора в замаскированной области поверхности однобуферной прорисовки.

Для решения этой проблемы можно использовать наложение нескольких текстур.

Контуры и силуэты

Буфер трафарета можно использовать и для более абстрактных эффектов, таких как создание структур и силуэтов.

Если ваше приложение выполняет два прохода отрисовки (один — чтобы создать маску трафарета, а второй — чтобы применить маску трафарета к изображению, однако во втором проходе используются несколько более мелкие примитивы), получившееся изображение будет содержать только структуру примитива. Затем приложение может заполнить замаскированную трафаретом область изображения сплошным цветом, создавая для примитива эффект приподнятости.

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

Двусторонний набор элементов

Теневые тома используются для рисования теней с использованием буфера трафарета. Приложение вычисляет теневые тома, переданные геометрией ограждения, вычисляя края силуэта и вытягивая их от света в набор трехмерных томов. Затем эти тома дважды отрисовываются в буфер трафарета.

В ходе первой отрисовки рисуются многоугольники переднего обзора и увеличиваются значения буфера трафарета. В ходе второй отрисовки рисуются многоугольники заднего вида, относящиеся к теневому тому, а значения буфера трафарета уменьшаются.

Как правило, значения увеличения и уменьшения уравновешивают друг друга. Однако сцена уже была отрисована с нормальной геометрией, из-за чего некоторые пиксели не прошли проверку Z-буфера при отрисовке теневого тома. Значения, оставшиеся в буфере трафарета, соответствуют пикселям в тени. Оставшееся содержимое буфера трафарета используется в качестве маски, чтобы выполнить альфа-смешение крупного, всеобъемлющего черного квартета со сценой. Если буфер трафарета используется в качестве маски, в результате затеняются пиксели, которые находятся в тени.

Это означает, что теневая геометрия рисуется дважды для каждого источника света, оказывая давление на пропускную способность вершин графического процессора. Для устранения этого эффекта разработана функция двустороннего трафарета. При таком подходе существует два набора состояний трафарета (они указаны ниже): один — для треугольников переднего обзора, другой — для треугольников заднего вида. В этом случае для каждого теневого тома рисуется по одному проходу на источник освещения.

Чтение буфера Depth-Stencil в виде текстуры

Неактивный буфер трафарета глубины может считываться шейдером как текстура. Приложение, считывающее буфер трафарета глубины как текстуру, отрисовывается за два прохода: первый проход выполняет запись в буфер трафарета глубины, а второй — чтение из этого буфера. Это позволяет шейдеру сравнить значения глубины или трафарета, ранее записанные в буфер, со значением для отрисовываемого в настоящее время пикселя. Результат сравнения может использоваться для создания эффектов, таких как сопоставление теней или мягкие частицы в системе частиц.

Этап слияния и вывода (OM)

Графический конвейер

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