Що таке буфер трафарету?


26

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

Однак він натякає, що він використовується для відсікання або іншим чином «щільно зв’язуючи» буфер глибини та пікселів, трохи суперечивши собі.

Що трафарет буфер дійсно робити, і як він практично використовується в сучасних додатках?

Відповіді:


31

Визначення буфера трафарету від Wikipedia дійсно не велике, воно занадто сильно фокусується на деталях сучасних реалізацій (OpenGL). Мені здається, що розроблена версія легше зрозуміти:

Трафарет - це шаблон, який використовується для малювання або малювання однакових літер, символів, форм або візерунків кожного разу, коли він використовується. Дизайн, виготовлений за таким шаблоном, ще називають трафаретом.

Ось що мав на увазі трафарет перед Computer Graphics. Якщо ви вводите трафарет на Google Images, це один з перших результатів:

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

Як бачите, це просто маска або візерунок, які можна використовувати для "малювання" негативу візерунка на чомусь.

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


Що стосується реалізації буфера трафарету, іноді він дійсно поєднується з буфером глибини. Більшість графічних апаратних засобів використовують буфер трафарету на 1 байт (8 біт), що достатньо для більшості програм. Глибинні буфери зазвичай реалізуються за допомогою 3-х байт (24 біта), що знову ж таки достатньо для більшості видів 3D-рендерінга. Тож логічно упакувати 8 біт буфера трафарету з іншими 24 буферами глибини, що дозволяє зберігати кожен піксель глибини + трафарету в 32-бітове ціле число. Ось що мав на увазі Вікіпедія:

Буфер глибини та буфер трафарету часто ділять однакову область в оперативній пам’яті графічного обладнання.


Одне застосування, в якому буфер трафарету, який раніше використовувався королем, був для надання тіньової рендерінгу, в техніці, званій " тіньові томи" , а іноді також відповідним чином називаються трафаретними тінями . Це було дуже розумним використанням буфера, але в даний час більшість полів візуалізації, схоже, змістилися в напрямку глибоких карт тіней.


Це один символ, але cleaver-> clever. Я не можу його відредагувати D: Чудова відповідь, до речі, це має найбільш сенс поки що.
Qix

3
Якщо у вас дорогий шейдер на один піксель, буфер трафарету також може використовуватися для створення подібних ниток, зменшуючи розбіжність і збільшуючи заповнення, як у цій статті OIT, розділ 2.6 (відмова від відповідальності: я автор).
jozxyqk

@jozxyqk, це щось поза межами вікна, що думає прямо там! Дуже хороша.
гламперт

13

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

Тест трафарету - це просто піксельна операція, в якій поточне значення трафарету пікселя тестується на вміст буфера трафарету. Ви встановлюєте умову, в якій проходить тест трафарету (наприклад, ЗАВЖДИ, МЕНШЕ тощо).

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

Буфер трафарету має досить багато застосувань, першими, які спадають на думку:

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

У минулому він використовувався також для методів затінення, таких як Shadow volume.

Поганий буфер трафарету часто буває досить заниженим, але може стати гарною зброєю в озброєнні графічного програміста.

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

EDIT: Також, варто згадати, що у моделі Shader Model 5.1 (так що D3D11.3 та D3D12) ви маєте доступ до еталонного значення трафарету через SV_StencilRef


6

Буфер трафарету містить цілочисельні дані на один піксель, які використовуються для додання більшого контролю над тим, які пікселі відображаються.

Буфер трафарету працює аналогічно буфері глибини. Так само, що дані трафарету зберігаються в глибинному буфері. Хоча дані про глибину визначають, який піксель найближчий до камери, дані трафарету можна використовувати як більш загальну маску на піксель для збереження або відкидання пікселів. Щоб створити маску, скористайтеся функцією трафарету для порівняння еталонного значення трафарету - загального значення - зі значенням у буфері трафарету щоразу, коли надається піксель.

Джерело: Що таке буфер трафарету? | Мережа розробників Microsoft

Загальна ідея полягає в тому, що ви можете встановити значення для кожного пікселя, а потім встановити операцію ( GREATER, SMALLERі EQUALт. Д.), Коли це оцінюється як справжній, піксель є затіненим і показаним.

Одне застосування - це відображення в реальному часі, коли візуалізація текстури відображення буфер трафарету використовується для створення маски, де застосовується відображення. Наприклад, застосуйте лише відбиття до скляного матеріалу, затіненого трикутниками. Він також може бути використаний для створення довільних двовимірних масок для всього фреймбуфера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.