Ні, насправді немає способу це зробити.
Виклик шейдера геометрії вимагає введення примітиву та генерує 0 або більше вихідних примітивів. Без вхідного примітиву насправді не існує способу викликати шейдер геометрії . Звичайно, ви можете розтягнути межі максимальної кількості вихідних примітивів шейдера для геометрії для кожного вхідного примітиву (не знайте практичних обмежень зараз, можливо, це має бути порядком тисяч). Таким чином, ви можете створити 1024 трикутники для кожної точки, але ви завжди повинні мати деякі вхідні примітиви.
Те, що вам не потрібно, - це власне поняття геометрії. Вам не потрібно рендерувати 3D-точки в будь-якому розумному місці, вони також можуть мати лише деякі абстрактні координати індексу або текстури або будь-які як атрибути, а не обов'язково значущі тривимірні положення. Ніхто не диктує, які атрибути мають ваші вершини. І ви навіть можете надавати вершини без будь-яких атрибутів . Але вам потрібно зробити кілька примітивів, щоб викликати на них шейдер геометрії, навіть якщо ці примітиви не мають жодних фактичних атрибутів (однак, як ви потім обчислюєте свою вихідну геометрію в шейдері геометрії - це інше питання).
Але те, що ви насправді зробили, відображаючи крапку для кожної комірки сітки та генеруючи з неї трикутні куби трикутники, - це саме прямий підхід. Звичайно, атрибути, що містяться в цій комірці, залежать від вас, це може бути 3D-позиція, текстовий координат у тривимірній текстурі, що завгодно, але це клітинки сітки, які ви надаєте. Чисто семантично кажучи, ви насправді не "відкидаєте" ці точки, а потім "замінюєте" їх трикутниками, ви "перетворюєте" кожну точку в набір трикутників. Саме для цього і є шейдер для геометрії, і в цьому немає нічого «хакітного» або «неналежного». Ніхто не каже, що шейдер геометрії повинен генерувати той самий вихідний примітивний тип, який був вхідним, щоб бути "правильним" .
Що ви можете зробити, щоб досягти способу візуалізації сітки вокселів, що не потребує вкладень (а це, можливо, ви і просили), було б просто намалювати набір атрибутивних точок. Це означає, що вам взагалі не потрібні будь-які масиви атрибутів, а просто вимкніть їх усі та викликте простий glDrawArrays
із кількістю потрібних комірок. Тоді у вершинній шейдері або шейдері геометрії ви можете генерувати необхідний індекс 3D-комірки сітки з невеликою магією індексу з ідентифікатора вхідної вершини (тобто gl_VertexID
, це єдина інформація, яку ви маєте), а потім обчислити геометрію маршируючих кубів з пошуку в текстура об'єму 3D (або будь-яка структура даних).
Отже, в ретроспективі я повинен відновити своє твердження з самого початку: Ви не можете генерувати примітиви без будь-яких вхідних примітивів , але ви можете їх генерувати без вхідної геометрії .