Для чого використовуються шейдери Халла, Домена та Геометрії?


21

Я зробив свою справедливу частку програмування 3D-ігор для мого (колишнього) роботодавця, а також у власному користувальницькому двигуні для моїх власних інді-ігор.

Спочатку я почав з Direct3D 9 і D3DX9, які майже все зробили для мене, і зовсім не вимагали від мене думки щодо шейдерів.

Після цього я написав свої перші шейдери Direct3D 9, але в основному використовував один дуже простий шейдер для всього, що робив.

Під час останньої ітерації мого ігрового двигуна я перейшов до Direct3D 11 і з цим створив безліч шейдерів. Я знімав графічний графічний процесор, обчислював частки GPU, багато освітлення та ефектів після обробки, все це в GPU. Дійсно класні речі.

Поки що я використовував лише шейдери вершин та пікселів / фрагментів. Незважаючи на те, що ще багато чого я не робив, я вважаю, що я добре знаю, що роблять шейдери вершин і пікселів / фрагментів, і як це все вписується у весь 3D конвеєр.

Догнавши новітні розробки, я дуже зацікавився новими етапами шейдерів. Тобто шейдер для геометрії та ще новіші шейдери Халла та домена.

Я ніколи не використовував ці етапи, але, наскільки я знаю, шейдер "Геометрія", якщо він включений, запускається після вершинного шейдера, один раз для кожної перетвореної вершини (або один раз за примітиву?) І дозволяє відкинути вершини (і примітиви?) , і створити нові (що, напевно, повернеться до початку трубопроводу?).

Я здогадуюсь, що головним використанням шейдера геометрії було б програмне створення геометрії в GPU. Поширеним використанням буде створення квадратиків білборда на основі однієї вершини, але я не візуалізую багато інших загальних сценаріїв, крім генерування фракталів та інших речей, які можна генерувати на 100% програмно.

Що стосується шейдерів Hull і Domain, то, схоже, вони пов'язані з tessellation (створення більш гладких поверхонь із шорстких поверхонь?), І їх потрібно використовувати разом або зовсім не використовувати. Термін "патч" також, здається, є поширеним тут.

Хтось би не хотів би пояснити мені, на практиці, для чого призначені ці нові етапи шейдерних процесів, як вони вписуються в тривимірний конвеєр і в яких випадках я повинен розглянути можливість їх використання?


Я думаю, що ви запитуєте неправильний шлях, а не "для чого вони використовуються", ви повинні запитувати "що вони роблять" - якщо ви розумієте дані ресурси (та їхні поняття під кришкою), тільки небо обмежує те, що ви є насправді вміє з ними робити.
wondra

@wondra: Це майже те саме питання, але я хотів би зупинитися більше на практичних зразках використання, а не на теоретичному поясненні того, що вони роблять. Насправді є огляд MSDN, який я читав багато разів, але все ще не можу зрозуміти, що вони можуть зробити для мене. Я розумна істота, і можу з'єднати A і B, і зрозуміти C, D, E і F із цього.
Піжама Panda

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

@Josh: Чи використовуєте ви, або ви використовували alll ці етапи в реальному світі?
Піжама Panda

1
FYI для тих, хто має непрямий фон (як я), ці два у OpenGL та Vulkan називаються "шейдером управління Tessellation" та "Shader оцінка Tessellation".
Шахбаз

Відповіді:


13

Халл і домени

Етапи корпусу та доменного шейдера є частиною трубопроводу тесселяції GPU. Зазвичай вони використовуються для обчислення деталізованої геометрії поверхні на основі більш детальної геометрії вхідної поверхні, яка визначається як трикутники або квадратики (тощо). Вхідні примітиви з нижчою деталізацією називаються "патчами", і важливо зазначити, що вони можуть не представляти фактичну геометрію, яка з часом буде існувати (хоча вони могли б). Подумайте більше, як контрольні точки кривої Безьє, за винятком поверхні.

Шейдер корпусу приймає вхідний патч і виробляє вихідний патч (або патчі; саме там, як правило, відбувається підрозділ патча). Постійні метадані про виправлення також можуть бути обчислені в шейдері корпусу і виведені для обробки на пізніших етапах конвеєра.

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

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

Фаза тесселяції настає після стадії вершинного шейдера в трубопроводі.

Геометрія шейдерів

Шедери геометрії певним чином схожі на спрощені шейдери корпусу / домену. Вони просто приймають вхідні вершини і виробляють вершини виводу. Для даної вхідної вершини може бути вироблено багато вихідних вершин, тому їх можна використовувати для "генерування геометрії".

Етап шейдера геометрії відбувається після вершинного шейдера та після етапу тесселяції.

Використання

Шейдер геометрії може записувати на потокові вихідні буфери, а не подавати їх безпосередньо у фазу растерізації та затінення фрагментів трубопроводу; це фактично означає, що ви можете повторно запустити геометрію, отриману за допомогою комбінації ітерації вершини / корпусу / домену / геометрії шейдера назад по трубопроводу, виконувати додаткові роботи на іншому етапі вершинного шейдера або будь-якому іншому.

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

Ландшафт - хороший приклад того, де ви можете скористатися деякою цією технологією, оскільки вам, як правило, потрібно бачити її як дуже близько (як ваш герой стоїть на ній), так і дуже далеко (гори вдалині) і здатність контролювати, де і скільки деталей ви вкладаєте в геометрію місцевості "на льоту" через ці щаблі шейдерів, дуже потужно. Альтернативні варіанти були або платять постійну середню вартість для місцевості в усі часи (підхід із найменшим загальним знаменником), або вручну підкачують шматки геометрії для різних рівнів деталізації в пам'яті GPU і поза нею, що є стомлюючим і дорого.

Будь-яка подібна ситуація, коли у вас може бути дійсно широкий спектр рівнів деталізації, який вам потрібно підтримати для якоїсь сітки або моделі, яка також є досить розділеною, може бути кандидатом для того, щоб зробити щось розумне і з цими шейдерами. Не все , однак, добре відповідає оптимізації стилів поверхні підрозділів . Можливо, ви могли б використовувати їх і для тканини та волосся.

Для подальшого читання, включаючи набагато більше деталей, ніж я можу пригадати, або перейти сюди:


4
Майте на увазі, що для шейдерів корпусу та домену потрібне обладнання Direct3D Feature Level 11.0 або новішої версії, а для шейдерів геометрії потрібне обладнання Direct3D Feature Level 10.0 або новішої версії. Крім того, більшість конструкцій відеокарт дають сценічній схемі геометрії дуже мало, щоб не було виділених апаратних засобів, тому їх корисність на практиці набагато менша, ніж спочатку передбачалося.
Чак Уолборн

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