Jump to content

Трафаретный буфер

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

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

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

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

Наиболее типичным применением по-прежнему является добавление теней в 3D-приложения . Он также используется для плоских отражений.

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

Доступ к буферу трафарета и его модификаторам можно получить в компьютерной графике с помощью таких API, как OpenGL , Direct3D , Vulkan или Metal .

Архитектура

[ редактировать ]

Буфер трафарета обычно использует то же пространство памяти, что и Z-буфер, и обычно соотношение составляет 24 бита для Z-буфера + 8 бит для буфера трафарета или, в прошлом, 15 бит для Z-буфера + 1 бит для буфера трафарета. . Другой вариант — 4 + 24, где 28 бит из 32 используются, а 4 игнорируются. Трафарет и Z-буферы являются частью буфера кадра, связанного с буфером цвета. Первым чипом, доступным для более широкого рынка, был Permedia II от 3Dlabs, который поддерживал однобитный трафаретный буфер.

Биты, выделенные в буфер трафарета, могут использоваться для представления числовых значений в диапазоне [0, 2 н -1], а также в виде логической матрицы (n — количество выделенных битов), каждый из которых может использоваться для управления определенной частью сцены. Также возможна любая комбинация этих двух способов использования доступной памяти.

Трафаретный тест

[ редактировать ]

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

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

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

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

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

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

Объем тени

[ редактировать ]

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

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

Размышления

[ редактировать ]

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

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

Плоские тени

[ редактировать ]

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

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

Пространственные тени

[ редактировать ]

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

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

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

Другие приложения

[ редактировать ]

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

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

glEnable(GL_STENCIL_TEST); // by default not enabledglStencilMask(stencilMask); // allow writing to stencil buffer, by default (0xFF) no mask.glClearStencil(clearStencilValue); // clear stencil value, by default = 0glStencilFunc(func, ref, mask); // by default GL_ALWAYS, 0, 0xFF, always pass stencil testglStencilOp(fail,zfail,zpass); // by default GL_KEEP, GL_KEEP, GL_KEEP, do not change stencil bufferglClear(GL_STENCIL_BUFFER_BIT); // clear stencil buffer, fill with (clearStencilValue & stencilMask)

Тест: (ref и маска) func (stencilValue и маска)

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

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

   If say func is GL_NEVER, the stencil test will always fail.    Neither Color/Z-buffers are modified. The stencil buffer is modified as per glStencilOp fail.   If say glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP) then GL_REPLACE takes place and    stencilValue = (ref & stencilMask) // will become ref

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

  If say func is GL_ALWAYS, the stencil test will always pass, but depth test may fail.  Neither Color/Z-buffer are modified. The stencil buffer is modified as per glStencilOp zfail.  If say glStencilOp(GL_KEEP, GL_INCR, GL_KEEP) then GL_INCR takes place and   stencilValue = (stencilValue+1) // will become 1

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

  If say func is GL_ALWAYS, the stencil test will always pass. If the depth test also passes.  Both Color/Z-buffer are modified. The stencil buffer is modified as per glStencilOp zpass.  If say, glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP) then Stencil values are not changed, only Color and Z-buffers are modified.

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

  // disable color and Z-buffers  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);  glDepthMask(GL_FALSE);  glStencilFunc(GL_NEVER, 1, 0xFF); // never pass stencil test  glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);  // replace stencil buffer values to ref=1  glStencilMask(0xFF); // stencil buffer free to write  glClear(GL_STENCIL_BUFFER_BIT);  // first clear stencil buffer by writing default stencil value (0) to all of stencil buffer.  draw_stencil_shape(); // at stencil shape pixel locations in stencil buffer replace stencil buffer values to ref = 1

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

  // enable color and Z-buffers.  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);  glDepthMask(GL_TRUE);  // no more modifying of stencil buffer on stencil and depth pass.  glStencilMask(0x00);  // can also be achieved by glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);  // stencil test: only pass stencil test at stencilValue == 1 (Assuming depth test would pass.)   // and write actual content to depth and color buffer only at stencil shape locations.  glStencilFunc(GL_EQUAL, 1, 0xFF);   draw_actual_content();

См. также

[ редактировать ]
  1. ^ «Методы трафаретного буфера (Direct3D 9) — приложения Win32» .
  2. ^ Кроу, Франклин С.: «Теневые алгоритмы для компьютерной графики», Компьютерная графика (SIGGRAPH '77 Proceedings) , том. 11, нет. 2, 242–248.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 1be5c3a95095b152fc14f03604104ecb__1719335460
URL1:https://arc.ask3.ru/arc/aa/1b/cb/1be5c3a95095b152fc14f03604104ecb.html
Заголовок, (Title) документа по адресу, URL1:
Stencil buffer - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)