Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Буфер трафарета используется для маскирования пикселей в изображении, чтобы создавать специальные эффекты. Маска определяет, рисуется ли пиксель. Эти специальные эффекты включают композитинг, декалинг, растворения, исчезновения и протяжки, контуры и силуэты и двусторонний трафарет. Ниже показаны некоторые из наиболее распространенных эффектов.
Трафаретный буфер включает или отключает возможность рисования на поверхности рендеринга на пиксельной основе. На самом базовом уровне это позволяет приложениям маскировать разделы отрисованного изображения, чтобы они не отображались. Приложения часто используют трафаретные буферы для специальных эффектов, таких как растворение, декалирование и обведение.
Сведения о трафаретном буфере внедрены в данные z-буфера.
Как работает стенцильный буфер
Direct3D выполняет тест на содержимое трафаретного буфера пиксель за пикселем. Для каждого пикселя в целевой поверхности выполняется тест с использованием соответствующего значения в трафаретном буфере, ссылочного значения трафарета и значения маски трафарета. Если тест проходит, Direct3D выполняет действие. Тест выполняется с помощью следующих действий.
- Выполните побитовую операцию AND значения ссылки на набор элементов с маской набора элементов.
- Выполните побитовую операцию AND значения стенсильного буфера для текущего пикселя с стенсильной маской.
- Сравните результат шага 1 с результатом шага 2 с помощью функции сравнения.
Приведенные выше шаги показаны в следующей строке кода:
(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
- StencilRef представляет значение эталона для трафарета.
- Маска трафарета представляет значение маски.
- CompFunc — это функция сравнения.
- StencilBufferValue — это содержимое трафаретного буфера для текущего пикселя.
- Символ ampersand (&) представляет побитовую операцию AND.
Текущий пиксель записывается на целевую поверхность, если тест трафарета проходит, и игнорируется в противном случае. Поведение сравнения по умолчанию заключается в том, чтобы записывать пиксель независимо от результата каждой побитовой операции. Это поведение можно изменить, изменив значение перечисляемого типа, чтобы указать нужную функцию сравнения.
Ваше приложение может настроить работу буфера трафарета. Он может задать функцию сравнения, маску трафарета и эталонное значение трафарета. Он также может управлять действием, которое Direct3D выполняет, когда тест трафарета проходит или проваливается.
Композитинг
Ваше приложение может использовать трафаретный буфер для наложения 2D или трехмерных изображений на 3D сцену. Маска в буфере трафарета используется для затенения области поверхности, на которую выполняется рендеринг. Сохраненные 2D-данные, такие как текст или растровые изображения, затем можно записать в скрытую область. В качестве альтернативы, ваше приложение может отображать дополнительные трехмерные примитивы на заштрихованной области поверхности целевого объекта отрисовки. Он может даже отобразить всю сцену.
Игры часто объединяют несколько трехмерных сцен. Например, в играх для вождения обычно отображается зеркало заднего вида. Зеркало содержит изображение трехмерной сцены за водителем. По сути, это вторая трехмерная сцена, совмещенная с передним обзором водителя.
нанесение декалей
Приложения Direct3D используют декалинг для управления тем, какие пиксели из определенного примитивного изображения рисуются на целевую поверхность отрисовки. Приложения применяют декали к изображениям примитивов, чтобы обеспечить корректное отображение копланарных многоугольников.
Например, при нанесении следов шин и желтых линий на дорогу разметка должна отображаться непосредственно на поверхности дороги. Однако значения z маркировки и дороги одинаковы. Таким образом, буфер глубины может не производить чистое разделение между двумя. Некоторые пиксели в заднем примитиве могут отображаться поверх переднего примитива и наоборот. Полученный образ, как представляется, сияет от кадра к кадру. Этот эффект называется z-перебои или мерцание.
Чтобы решить эту проблему, используйте трафарет, чтобы закрыть область заднего примитива, где будет отображаться декаль. Отключите z-буферизацию и выполните отрисовку изображения переднего примитива в маскированную область поверхности целевого объекта.
Хотя для решения этой проблемы можно использовать несколько смешивания текстур, это ограничивает количество других специальных эффектов, которые может производить ваше приложение. Использование трафаретного буфера для нанесения декалей освобождает этапы смешивания текстур для других эффектов.
Растворяется, исчезает и смахивает
Все чаще в приложениях используются эффекты, часто применяемые в фильмах и видео, такие как диссолвы, прокрутки и исчезания.
В растворе один образ постепенно заменяется другим в гладкой последовательности кадров. Хотя Direct3D предоставляет методы использования многократного смешивания текстур для достижения того же эффекта, приложения, использующие трафаретный буфер для растворений, могут использовать возможности смешивания текстур для других эффектов во время их растворения.
Когда приложение выполняет растворение, оно должно отображать два разных изображения. Он использует трафаретный буфер для управления тем, какие пиксели из каждого изображения рисуются на целевой поверхности. Можно определить ряд масок трафаретов и скопировать их в буфер трафаретов на последовательных кадрах. В качестве альтернативы, можно определить базовую трафаретную маску для первого кадра и изменить её постепенно.
В начале плавного перехода ваше приложение задает трафаретную функцию и трафаретную маску так, чтобы большинство пикселей из начального изображения прошли тест трафарета. Большая часть пикселей из конечного изображения должна не пройти тест трафарета. На последовательных кадрах трафаретная маска обновляется таким образом, чтобы все меньше и меньше пикселей в исходном изображении проходили тест. По мере того как кадры сменяют друг друга, все меньше и меньше пикселей в конечном изображении не проходят тест. Таким образом, приложение может выполнять растворение с помощью любого произвольного шаблона растворения.
Появление или исчезновение является особым случаем эффекта растворения. При проявлении изображения буфер трафарета используется для плавного перехода от черного или белого изображения к отрисовке трехмерной сцены. Исчезание — это противоположный эффект, когда ваше приложение начинает с отображения трехмерной сцены и исчезает в черный или белый цвет. Угасание можно выполнить с помощью любого произвольного шаблона, который вы хотите использовать.
Приложения Direct3D используют аналогичную технику для переходов. Например, когда приложение выполняет свайп слева направо, конечное изображение плавно скользит поверх начального изображения слева направо. Как при эффекте растворения, необходимо определить ряд трафаретных масок, которые загружаются в трафаретный буфер на последовательных кадрах, или последовательно изменять начальную трафаретную маску. Трафаретные маски используются для отключения записи пикселей из начального изображения и разрешения записи пикселей из конечного изображения.
Свайп-переход несколько сложнее, чем растворение, потому что приложение должно считывать пиксели из конечного изображения в обратном порядке свайпа. То есть, если проводите пальцем слева направо, приложение должно считывать пиксели из конечного изображения справа налево.
Контуры и силуэты
Трафаретный буфер можно использовать для более абстрактных эффектов, таких как обводка и создание силуэтов.
Если приложение применяет трафаретную маску к изображению примитива, который имеет ту же форму, но немного меньше, результирующее изображение содержит только контур примитива. Затем приложение может заполнить маскированную область изображения сплошным цветом, что придаст примитиву рельефный вид.
Если трафаретная маска совпадает по размеру и форме с примитивом, который вы отрисовываете, результатирующее изображение содержит отверстие на месте примитива. Затем приложение может заполнить отверстие черным, чтобы создать силуэт примитива.
двухсторонний трафарет
Теневые объемы используются для рисования теней с трафаретным буфером. Приложение вычисляет теневые объемы, создаваемые геометрией, вычисляя края силуэта и протягивая их от источника света, формируя набор трехмерных объемов. Затем эти объемы отрисовываются дважды в трафаретный буфер.
Первая отрисовка рисует полигоны, обращенные вперед, и увеличивает значения трафаретного буфера. Вторая отрисовка отрисовывает обратные к просмотру многоугольники теневого объема и уменьшает значения трафаретного буфера. Как правило, все инкрементированные и декрементированные значения отменяют друг друга. Однако сцена уже была отрисована с нормальной геометрией, что приводит к сбою теста z-буфера при отрисовке объема теней. Значения, оставшиеся в трафаретном буфере, соответствуют пикселям, находящимся в тени. Это оставшееся содержимое буфера трафаретов используется в качестве маски, чтобы альфа-смешиванием добавить в сцену большой черный квадрат, покрывающий её всю. При использовании трафаретного буфера в качестве маски результатом является затемнение пикселей, которые находятся в тени.
Это означает, что теневая геометрия генерируется дважды для каждого источника света, следовательно, создается нагрузка на вершинную пропускную способность GPU. Двухсторонняя особенность трафарета разработана для смягчения этой ситуации. В этом подходе существуют два набора состояния трафарета (именуемых ниже): один набор для передних треугольников и другой для задних треугольников. Таким образом, выполняется только один проход для каждого теневого тома и для каждого источника света.
Связанные разделы
Буферы глубины и трафаретные буферы