Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
На этом изображении есть белые области и черные области, представляющие единицы и нули в буфере трафарета соответственно. Затем поверх полос рисуются фигуры путем инвертирования значения буфера трафарета. Если буфер в этом пикселе имеет значение 0 (черный), цвет пикселя белый (1) и наоборот.

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

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

Простая комбинация теста глубины и модификаторов трафарета делает возможным огромное количество эффектов (например, теневые объемы трафарета , двусторонний трафарет, [1] наложение, декалирование, растворение, затухание, пролистывание, силуэты, рисование контура или выделение пересечений). между сложными примитивами ), хотя они часто требуют нескольких проходов рендеринга и, следовательно, могут создать большую нагрузку на графическое оборудование.

Самым типичным приложением по-прежнему является добавление теней к 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 - количество выделенных битов), каждый из которых может использоваться для управления конкретная часть сцены. Возможна также любая комбинация этих двух способов использования доступной памяти.

Тест трафарета [ править ]

Тест трафарета или трафарет входит в число операций с пикселями / фрагментами (попиксельные операции), выполняемых после альфа-теста и перед тестом глубины . Тест трафарета гарантирует, что нежелательные пиксели не достигают теста глубины. Это экономит время обработки сцены. Точно так же альфа-тест может помешать соответствующим пикселям достичь теста трафарета.

Сама проверка выполняется над буфером трафарета до некоторого значения в нем, или изменяется или используется его, и выполняется с помощью так называемых функций трафарета и операций трафарета. Функция трафарета - это функция, с помощью которой значение трафарета определенного пикселя сравнивается с заданным эталонным значением. Если это сравнение логически верно , тест трафарета проходит. Иначе нет.

При этом возможная реакция, вызванная результатом сравнения трех различных состояний глубины и буфера трафарета:

  • Тест трафарета не пройден
  • Тест трафарета пройден, но не тест глубины
  • Оба теста пройдены (или тест трафарета пройден, а глубина не включена)

Для каждого из этих случаев можно задать разные операции над исследуемым пикселем. В функциях OpenGL трафарета, опорное значение и маски, соответственно, определить функцию glStencilFunc. В Direct3D каждый из этих компонентов настраивается индивидуально с помощью методов SetRenderState устройств, находящихся в данный момент под контролем. Этот метод ожидает два параметра, первый из которых является установленным условием, а второй - его значением. В указанном выше порядке эти условия называются D3DRS_STENCILFUNC, D3DRS_STENCILREF и D3DRS_STENCILMASK.

Операции с трафаретом в OpenGL настраивают функцию glStencilOp, которая ожидает три значения. В Direct3D, опять же, каждое состояние устанавливает определенный метод SetRenderState. Три состояния, которые можно назначить операции, называются D3DRS_STENCILFAIL, D3DRENDERSTATE_STENCILZFAIL и D3DRENDERSTATE_STENCILPASS.

Администрация [ править ]

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

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

Z-файтинг [ править ]

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

- Поднесите дальнюю плоскость ближе, чтобы ограничить глубину сцены, тем самым увеличивая точность Z-буфера или уменьшая расстояние, на котором объекты видны в сцене.

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

- Сдвигайте полигоны дальше друг от друга, что ограничивает возможности художника создавать сложные сцены.

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

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

Объем тени [ править ]

Объем тени - это метод, используемый в компьютерной 3D-графике для добавления теней к визуализированной сцене. Впервые они были предложены Фрэнком Кроу в 1977 году [2] как геометрия, описывающая трехмерную форму области, закрытой от источника света. Теневой объем делит виртуальный мир на две части: области, которые находятся в тени, и области, которые не находятся.

Реализация теневых объемов в трафаретном буфере обычно считается одним из наиболее практичных универсальных методов затенения в реальном времени для использования на современном оборудовании для трехмерной графики. Он был популяризирован видеоигрой Doom 3 , а конкретная разновидность техники, используемой в этой игре, стала известна как Reverse Кармака .

Размышления [ править ]

Отражение сцены рисуется по мере того, как сама сцена трансформируется и отражается относительно «зеркальной» плоскости, что требует нескольких проходов рендеринга и использования буфера трафарета для ограничения областей, в которых работает текущий проход рендеринга:

  1. Нарисуйте сцену без зеркальных областей - для каждой зеркальной блокировки Z-буфер и буфер цвета
    1. Визуализировать видимую часть зеркала
    2. Тест глубины настроен так, что каждый пиксель проходит для ввода максимального значения и всегда проходит.
  2. для каждого зеркала:
    1. Тест глубины настроен так, что он проходит, только если расстояние пикселя меньше текущего (поведение по умолчанию)
    2. Преобразование матрицы изменено для отражения сцены относительно плоскости зеркала.
    3. Разблокируйте Z-буфер и буфер цвета
    4. Нарисуйте сцену, но только ту ее часть, которая находится между зеркальной плоскостью и камерой. Другими словами, плоскость зеркала также является плоскостью отсечения.
    5. Снова блокирует буфер цвета, тест глубины устанавливается так, чтобы он всегда проходил, сбросьте трафарет для следующего зеркала.

Планарные тени [ править ]

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

Другая проблема, которая может появиться или не появиться, в зависимости от техники, состоит в создании большего количества полигонов в одной части тени, в результате чего получаются более темные и более светлые части одного оттенка. Все три проблемы могут быть решены геометрически, но из-за возможности прямого использования аппаратного ускорения это гораздо более элегантная реализация с использованием буфера трафарета: 1. Включите источники света и источники света 2. Нарисуйте сцену без какого-либо многоугольника, который должен быть проецируемые тени 3. Нарисуйте все полигоны, на которые должны проецироваться тени, но без света. При этом буфер трафарета, пиксель каждого многоугольника должен быть назначен определенному значению для земли, к которой они принадлежат. Расстояние между этими значениями должно быть не менее двух, потому что для каждой плоскости должны использоваться два значения для двух состояний: в тени и ярком. 4. Отключите любыеглобальное освещение (чтобы следующие шаги повлияли только на отдельный выбранный источник света) Для каждой плоскости: Для каждого источника света: 1. Отредактируйте буфер трафарета и только те пиксели, которые несут определенное значение для выбранного уровня. Увеличьте значение всех пикселей, которые проецируются объектами между датой данного уровня и яркостью. 2. Разрешить ему рисовать только выбранный свет на уровне, на котором часть ее конкретного значения не изменилась.

Пространственные тени [ править ]

Реализация пространственного рисования теней в буфере трафарета - это любая тень геометрического тела, объем которой включает в себя часть находящейся в нем сцены. Если какая-либо часть сцены принадлежит этому объему, свет не дается, в противном случае он есть. Эта проблема усугубляется увеличением количества источников света, но не затрагивает количество областей, на которые падают тени. Есть несколько решений проблемы, но мы следовали следующему алгоритму: 1. Нарисуйте сцену без света 2. Заблокируйте Z-буфер и буфер цвета, чтобы они не могли вносить изменения Для каждого источника света 1. Использование углубленного информация о сцене (Z-буфер) для заполнения буфера трафарета только в тех частях сцены, где объемная тень не существует или не видна из существующих зданий. 2. Разблокируйте буфер для цвета,

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

Что касается теней, эту технику можно использовать для освещения частей пространства, находящихся под сильным светом. Например, яркость прожектора в темной комнате с большим количеством пыли в воздухе можно увидеть, освещая соответствующий объем пространства.

Другие приложения [ править ]

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

Другая реализация включает в себя область визуализации во время моделирования твердых тел Constructive Solid Geometry (CSG), в которой буфер трафарета вместе с Z-буфером может успешно решать проблемы логических операций SOLiD.

OpenGL [ править ]

glEnable ( GL_STENCIL_TEST );  // по умолчанию отключено glStencilMask ( stencilMask );  // разрешить запись в буфер трафарета, по умолчанию (0xFF) без маски. glClearStencil ( clearStencilValue );  // очищаем значение трафарета, по умолчанию = 0 glStencilFunc ( func ,  ref ,  mask );  // по умолчанию GL_ALWAYS, 0, 0xFF, всегда проходить проверку трафарета glStencilOp ( fail , zfail , zpass );  // по умолчанию GL_KEEP, GL_KEEP, GL_KEEP, не менять буфер трафарета glClear( GL_STENCIL_BUFFER_BIT );  // очищаем буфер трафарета, заполняем его (clearStencilValue & stencilMask)

Тест: (ref & mask) func (stencilValue & mask)

В зависимости от трех возможных условий функции трафарета / функции глубины.

1. Сбой функции проверки трафарета:

 Если, скажем, func - это GL_NEVER, тест трафарета всегда завершится ошибкой.  Ни цвет / Z-буферы не модифицируются. Буфер трафарета изменен в соответствии с ошибкой glStencilOp. Если, скажем, glStencilOp (GL_REPLACE, GL_KEEP, GL_KEEP), то имеет место GL_REPLACE и  stencilValue = (ref & stencilMask) // станет ref

2. Выполнение функции проверки трафарета / сбой функции проверки глубины:

 Если, скажем, func - GL_ALWAYS, тест трафарета всегда будет проходить успешно, но тест глубины может не пройти. Ни Цвет / Z-буфер не изменяются. Буфер трафарета изменен согласно zfail glStencilOp. Если, скажем, glStencilOp (GL_KEEP, GL_INCR, GL_KEEP), то имеет место GL_INCR и stencilValue = (stencilValue + 1) // станет 1

3. Проходы функции трафарета / прохода функции глубины:

 Если, скажем, func - это GL_ALWAYS, тест трафарета всегда будет успешным. Если тест глубины тоже проходит. Оба Color / Z-буфера изменены. Буфер трафарета изменен согласно glStencilOp zpass. Если, скажем, glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP), то значения Stencil не изменяются, изменяются только Color и Z-буферы.

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

 // отключение цвета и Z-буферов  glColorMask ( GL_FALSE ,  GL_FALSE ,  GL_FALSE ,  GL_FALSE );  glDepthMask ( GL_FALSE ); glStencilFunc ( GL_NEVER ,  1 ,  0xFF );  // никогда не пройти тест трафарета  glStencilOp ( GL_REPLACE ,  GL_KEEP ,  GL_KEEP );  // заменяем значения буфера трафарета на ref = 1  glStencilMask ( 0xFF );  // буфер трафарета свободен для записи  glClear ( GL_STENCIL_BUFFER_BIT );  // сначала очищаем буфер трафарета, записывая значение трафарета по умолчанию (0) во весь буфер трафарета.  draw_stencil_shape ();  // в точках расположения пикселей формы трафарета в буфере трафарета заменяем значения буфера трафарета на ref = 1

Теперь используйте инициализированный буфер трафарета и тест трафарета, чтобы писать только в тех местах, где значение трафарета равно 1:

 // включаем цвет и Z-буферы.  glColorMask ( GL_TRUE ,  GL_TRUE ,  GL_TRUE ,  GL_TRUE );  glDepthMask ( GL_TRUE ); // больше не нужно изменять буфер трафарета при проходе трафарета и глубины.  glStencilMask ( 0x00 );  // это также можно сделать с помощью glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); // тест трафарета: пройти тест трафарета только при stencilValue == 1 (при условии, что тест глубины прошел.)  // и записать фактическое содержимое в буфер глубины и цвета только в местах формы трафарета.  glStencilFunc ( GL_EQUAL ,  1 ,  0xFF );  draw_actual_content ();

См. Также [ править ]

  • Z-буферизация (буфер глубины)
  • Объем тени (техника трафаретной буферизации, создающая тени)

Ссылки [ править ]

  1. ^ https://msdn.microsoft.com/en-us/library/windows/desktop/bb206123(v=vs.85).aspx
  2. ^ Кроу, Франклин C: «Алгоритмы теней для компьютерной графики», Computer Graphics (SIGGRAPH '77 Proceedings) , vol. 11, вып. 2, 242-248.