Введение
Буфер трафарета — это дополнительный буфер данных, помимо буфера цвета и Z-буфера, который присутствует в современном графическом оборудовании. Буфер является буфером на пиксель и работает с целочисленными значениями, обычно с глубиной в один байт на пиксель. Z-буфер и буфер трафарета часто используют одну и ту же область в оперативной памяти графического оборудования. В простейшем случае буфер трафарета используется для ограничения области рендеринга (трафаретная маска). Более продвинутое использование буфера трафарета опирается на тесную связь между Z-буфером и буфером трафарета в конвейере рендеринга. Например, значения трафарета могут автоматически увеличиваться или уменьшаться для каждого пикселя, который не проходит или проходит тест глубины. Простое сочетание теста глубины и модификаторов трафарета позволяет реализовать огромное количество эффектов (таких как объёмные тени трафаретом, двусторонний трафарет, композитинг, декали, растворение, затухание, переходы, силуэты, отрисовка контуров или выделение пересечений между сложными примитивами), хотя они часто требуют нескольких проходов рендеринга и, следовательно, могут создавать значительную нагрузку на графическое оборудование. Наиболее типичное применение по-прежнему заключается в добавлении теней в 3D-приложениях. Он также используется для плоских отражений. Другие методы рендеринга, такие как рендеринг через порталы, используют буфер трафарета иными способами; например, его можно использовать для определения области экрана, скрытой порталом, и повторного рендеринга этих пикселей корректно. Буфер трафарета и его модификаторы доступны в компьютерной графике через API, такие как OpenGL, Direct3D или Vulkan.
Архитектура
Буфер трафарета обычно использует то же пространство памяти, что и Z-буфер, и обычно соотношение составляет 24 бита для Z-буфера + 8 битов для буфера трафарета или, ранее, 15 битов для Z-буфера + 1 бит для буфера трафарета. Другой вариант – 4 + 24, при котором используется 28 из 32 бит, а 4 игнорируются. Буферы трафарета и Z-буфер являются частью буфера кадра и связаны с буфером цвета. Первым чипом, получившим широкое распространение, была Permedia II от 3Dlabs, поддерживающая однобитный буфер трафарета. Биты, выделенные буферу трафарета, могут использоваться для представления числовых значений в диапазоне [0, 2^n - 1], а также в качестве булевой матрицы (где n – количество выделенных битов), каждый элемент которой может использоваться для управления определенной частью сцены. Любая комбинация этих двух способов использования доступной памяти также возможна.
Бойцы Z
Из-за недостаточной точности буфера глубины (Z-буфера), сопланарные полигоны, находящиеся на близком расстоянии или перекрывающиеся, могут отображаться как единая плоскость с множеством нерегулярных сечений. Эти сечения могут меняться в зависимости от положения камеры и других параметров и изменяются очень быстро. Это явление называется Z-конфликтом. Существует несколько способов решения этой проблемы:
Приблизить дальнюю плоскость отсечения, чтобы ограничить глубину сцены, тем самым повысив точность Z-буфера, или уменьшить расстояние, на котором объекты видны в сцене. Увеличить количество битов, выделенных Z-буферу, что возможно за счет уменьшения объема памяти, выделенного буферу трафарета. Расположить полигоны на большем расстоянии друг от друга, что ограничивает возможности художника по созданию детализированной сцены. Все эти подходы могут лишь снизить вероятность возникновения Z-конфликта, но не гарантируют его полного устранения в общем случае. Решение с использованием буфера трафарета основано на знании того, какой полигон должен быть перед другими. Силуэт переднего полигона записывается в буфер трафарета. После этого остальная часть сцены отрисовывается только в тех областях, где значение в буфере трафарета отрицательное, что предотвращает конфликт с передним полигоном.
Объем тени
Теневой объем — это техника, используемая в 3D-компьютерной графике для добавления теней в отрендеренную сцену. Она была впервые предложена Фрэнком Кроу в 1977 году как геометрия, описывающая трехмерную форму области, затененной от источника света. Теневой объем разделяет виртуальный мир на две области: находящиеся в тени и освещенные. Реализация теневых объемов с использованием буфера глубины обычно считается одним из наиболее практичных универсальных методов создания теней в реальном времени для современного 3D-графического оборудования. Эта техника получила широкое распространение благодаря видеоигре Doom 3, а конкретный вариант, использованный в этой игре, стал известен как Carmack's Reverse.
Пространственные тени
Реализация пространственных теней с использованием буфера трафарета – это любая тень от геометрического объекта, объем которого включает в себя часть сцены, находящуюся внутри него. Если какая-либо часть сцены попадает в этот объем, она не освещается, в противном случае – освещается. Эта проблема усугубляется увеличением количества источников света, но не зависит от количества поверхностей, на которые падают тени. Существует несколько решений этой проблемы, но мы использовали следующий алгоритм:
1. Draw a scene without light
2. Lock the Z buffer and color buffer, so that the two can not make changes For each light 1. Using in depth information about the scene (Z buffer) to fill the stencil buffer only on parts of the scene where volume shadow does not exist or are not visible from the existing buildings. 2. Unlock buffer for color, and adjust the function of the Z buffer to allow amendments only where the depth value equal to an existing
3. Draw the scene illuminated only by this light, but only for part of the scene passing the stencil test
Each of these passages implies that a clean stencil buffer can be used. As for the shadows, this technique can be used to illuminate parts of space that are under strong light. For example, the brightness of the spotlight in a dark room with a large presence of dust in the air could be seen illuminating the appropriate volume of space.
1. Отрисовать сцену без освещения.
2. Заблокировать Z-буфер и буфер цвета, чтобы предотвратить их изменение. Для каждого источника света:
1. Используя информацию о глубине сцены (Z-буфер), заполнить буфер трафарета только на тех участках сцены, где нет тени или они не видны из-за существующих объектов.
2. Разблокировать буфер цвета и настроить функцию Z-буфера, чтобы разрешить изменения только там, где значение глубины совпадает с существующим.
3. Отрисовать сцену, освещенную только этим источником света, но только для той части сцены, которая прошла проверку трафарета.
1. Draw a scene without light
2. Lock the Z buffer and color buffer, so that the two can not make changes For each light 1. Using in depth information about the scene (Z buffer) to fill the stencil buffer only on parts of the scene where volume shadow does not exist or are not visible from the existing buildings. 2. Unlock buffer for color, and adjust the function of the Z buffer to allow amendments only where the depth value equal to an existing
3. Draw the scene illuminated only by this light, but only for part of the scene passing the stencil test
Each of these passages implies that a clean stencil buffer can be used. As for the shadows, this technique can be used to illuminate parts of space that are under strong light. For example, the brightness of the spotlight in a dark room with a large presence of dust in the air could be seen illuminating the appropriate volume of space.
Каждый из этих этапов подразумевает использование чистого буфера трафарета. Что касается теней, эта техника может быть использована для освещения участков пространства, находящихся под прямым светом. Например, яркость прожектора в темной комнате с большим количеством пыли в воздухе может быть видна, освещающая соответствующий объем пространства.
1. Draw a scene without light
2. Lock the Z buffer and color buffer, so that the two can not make changes For each light 1. Using in depth information about the scene (Z buffer) to fill the stencil buffer only on parts of the scene where volume shadow does not exist or are not visible from the existing buildings. 2. Unlock buffer for color, and adjust the function of the Z buffer to allow amendments only where the depth value equal to an existing
3. Draw the scene illuminated only by this light, but only for part of the scene passing the stencil test
Each of these passages implies that a clean stencil buffer can be used. As for the shadows, this technique can be used to illuminate parts of space that are under strong light. For example, the brightness of the spotlight in a dark room with a large presence of dust in the air could be seen illuminating the appropriate volume of space.
Другие применения
Еще один пример – так называемая мягкая тень, в которой переход между освещенной и затененной частями сцены размыт. В частности, один из способов достижения этого эффекта с использованием буфера трафарета – умножение объема тени, при этом копии соответственно масштабируются в соответствии с геометрической прогрессией с небольшим коэффициентом увеличения, например, 1,04. Центром масштабирования может служить центр тяжести многоугольника, представляющего верхний объем. Это само по себе создаст серию составных теней, дающих желаемый эффект. Другая реализация включает в себя область визуализации при моделировании методом Constructive Solid Geometry (CSG), где буфер трафарета, вместе с Z-буфером, может успешно решать задачи булевых операций над твердотельными объектами (SOLiD).