Что такое трафаретный буфер?

26

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

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

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

Qix
источник

Ответы:

31

Определение буфера трафарета в Википедии действительно невелико, оно слишком сильно фокусируется на деталях современных реализаций (OpenGL). Я считаю, что неоднозначную версию легче понять:

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

Вот что имел в виду трафарет перед компьютерной графикой. Если вы набираете трафарет в Google Images, это один из первых результатов:

Трафаретная маска

Как вы можете видеть, это просто маска или шаблон, который можно использовать, чтобы «нарисовать» негатив шаблона на чем-то.

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


Когда дело доходит до реализации буфера трафарета, иногда он действительно связан с буфером глубины. Большинство графического оборудования использует 1-байтовый (8 бит) трафаретный буфер, что достаточно для большинства приложений. Буферы глубины обычно реализуются с использованием 3 байтов (24 бита), чего обычно достаточно для большинства видов трехмерного рендеринга. Поэтому логично упаковать 8 бит буфера шаблонов с другими 24 буферами глубины, что позволяет хранить каждый пиксель глубины + трафарета в 32-битном целом числе. Вот что подразумевает под Википедией:

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


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

glampert
источник
Это один персонаж, но cleaver-> clever. Я не могу отредактировать его. D: Между прочим, отличный ответ, в этом пока есть смысл.
Qix
3
Если у вас дорогой шейперный пиксельный шейдер, буфер трафарета также можно использовать для пакетирования похожих потоков, уменьшая расхождение и увеличивая занятость, как в этой статье OIT, раздел 2.6 (отказ от ответственности: я автор).
jozxyqk
@jozxyqk, вот некоторые нестандартно думают прямо сейчас! Очень хорошо.
гламперт
13

Буфер шаблонов представляет собой целочисленный буфер без знака, обычно в настоящее время 8-разрядный, где вы можете заполнять информацию на пиксель по своему усмотрению, основываясь на использовании различных операций (например, OpenGL Ops ) после теста на шаблон.

Тест трафарета - это просто операция на пиксель, в которой текущее значение пиксельного трафарета проверяется на соответствие содержимому буфера трафарета. Вы устанавливаете условие, к которому проходит тест трафарета (например, ВСЕГДА, МЕНЬШЕ и т. Д.).

Вы можете решить, что произойдет со значением трафарета, в зависимости от результата теста (в OpenGL с помощью операции, которую я связал с вами выше)

У буфера трафарета довольно много применений, первое, что приходит на ум:

  • Его можно использовать в качестве маски для выборочной визуализации определенной части кадрового буфера и отбрасывания остальных. Это, например, полезно для размышлений, но и многое другое. При работе с рендерингом с множественным разрешением его можно использовать для разметки ребер, которые необходимо рендерить при более высоком разрешении. Существует множество способов маскировки.
  • Например, очень простой фильтр наложения. Вы можете установить, чтобы тест трафарета всегда проходил и всегда увеличивал значение. Значение, которое вы заканчиваете в буфере трафарета, представляет ваше перерасход. [*]

В прошлом это использовалось также для методов затенения, таких как объем теней.

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

[*] Значение, которое будет считано в пост-процессе с использованием правильного SRV!

РЕДАКТИРОВАТЬ: Кроме того, стоит отметить, что в Shader Model 5.1 (например, D3D11.3 и D3D12) у вас есть доступ к эталонному значению трафарета через SV_StencilRef

cifz
источник
6

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

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

Источник: Что такое трафаретный буфер? | Сеть разработчиков Microsoft

Общая идея заключается в том, что вы можете установить значение для каждого пикселя, а затем установить операцию ( GREATER, SMALLERи EQUALт. Д.), Когда это оценивается как true, пиксель заштрихован и показан.

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

Морис Лаво
источник