Чи є спосіб генерувати примітивів у шейдері геометрії без вхідної геометрії?


17

Кілька років тому я спробував реалізувати цей GPU Gem у OpenGL для створення 3D-процедурних місцевостей за допомогою маршових кубів . У статті запропоновано реалізувати кубики марширування в шейдері геометрії для максимальної ефективності. Це означає, що мені потрібно запустити шейдер раз для кожного вокселя в домені, і він генеруватиме всю геометрію в цій комірці.

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

Отже, чи все-таки потрібно сказати OpenGL розпочати перегляд візуалізації з шейдера геометрії без будь-якої геометрії введення? Або мені завжди доведеться надсилати якісь манекени в GPU, щоб розпочати роботу.

Відповіді:


15

Ні, насправді немає способу це зробити.

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

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

Але те, що ви насправді зробили, відображаючи крапку для кожної комірки сітки та генеруючи з неї трикутні куби трикутники, - це саме прямий підхід. Звичайно, атрибути, що містяться в цій комірці, залежать від вас, це може бути 3D-позиція, текстовий координат у тривимірній текстурі, що завгодно, але це клітинки сітки, які ви надаєте. Чисто семантично кажучи, ви насправді не "відкидаєте" ці точки, а потім "замінюєте" їх трикутниками, ви "перетворюєте" кожну точку в набір трикутників. Саме для цього і є шейдер для геометрії, і в цьому немає нічого «хакітного» або «неналежного». Ніхто не каже, що шейдер геометрії повинен генерувати той самий вихідний примітивний тип, який був вхідним, щоб бути "правильним" .


Що ви можете зробити, щоб досягти способу візуалізації сітки вокселів, що не потребує вкладень (а це, можливо, ви і просили), було б просто намалювати набір атрибутивних точок. Це означає, що вам взагалі не потрібні будь-які масиви атрибутів, а просто вимкніть їх усі та викликте простий glDrawArraysіз кількістю потрібних комірок. Тоді у вершинній шейдері або шейдері геометрії ви можете генерувати необхідний індекс 3D-комірки сітки з невеликою магією індексу з ідентифікатора вхідної вершини (тобто gl_VertexID, це єдина інформація, яку ви маєте), а потім обчислити геометрію маршируючих кубів з пошуку в текстура об'єму 3D (або будь-яка структура даних).

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

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