Як я можу використовувати графічний конвеєр для відображення об'ємних даних на основі функції щільності?


12

Обидва графічні API (OpenGL та DirectX) розробляють чітко визначений конвеєр, в якому кілька етапів можна програмувати. Ці програмовані етапи вимагають прийняття фіксованого мінімального обсягу даних і повинні виконати чітко визначений діапазон операцій над ним та вивести деякий визначений мінімальний вихід, щоб дані могли бути передані на наступний етап правильно. Схоже, ці трубопроводи призначені для роботи лише з обмеженою кількістю типів геометричних даних, які у випадку D3D та OGL є координатами даних вершин та текстур.

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

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

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


Чи є функція густини функцій тавтологією?
Фарап

@Pharap, це був друкарський помилок. його просто "функтон бажання", який представляє наявність "речовини" в просторі.
Світла іскра

2
Здається, ви просто хочете побудувати ізоповерхня, що є добре вивченою проблемою. Ви бачили http.developer.nvidia.com/GPUGems3/gpugems3_ch07.html або шукали на Metaballs, візуалізацію хмарної точки, вилучення поверхні і виведення томів? Крім того, яка саме продуктивність вам потрібна, це матиме величезну різницю у виборі методики, яку ви шукаєте, поєднуючись зі складністю ваших розрахунків. Я думаю, що ви також виявите, що кожен піксель спричинить мерехтіння, коли камера рухається, і потрібен субпіксель.
Патрік Хьюз

Відповіді:


18

Ви можете абсолютно використовувати GPU для надання об'ємних даних.

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

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

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

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


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

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

@TheLightSpark Правильно, ви не передавали б рядки в шейдер (мови затінення навіть не мають типу рядка), ви б хотіли генерувати та компілювати шейдерний код для потрібних функцій. Це можна зробити під час виконання при необхідності.
Натан Рід

Почав читати вашу відповідь, я уявив монітор у формі трикутника;) Чи має перевагу використовувати лише один трикутник замість двох, які охоплюють екран, не відкидаючи пікселів?
danijar

@danijar Так, це має невелику перевагу перед використанням квадратика, тому що деякі пікселі по діагоналі будуть затіненими вдвічі, якщо використовувати повноекранний чотиримісний. З іншого боку, відкидання пікселів поза екраном безкоштовне, оскільки розпорошувач не буде генерувати ці пікселі для початку.
Натан Рід

6

Трасування променів та інші методи зазвичай проводяться з обчислювальними шейдерами, які Direct3D підтримує з моменту випуску D3D11, а OpenGL підтримується з 4.3 (і довше за допомогою OpenCL та деяких контур).


5

Це дуже схоже на те, що ви хочете використовувати шейдер для обчислення GPU або використовувати об'єкт "Buder Storage Buffer", щоб допомогти розширити трубопровід відповідно до ваших потреб. Математики, вчені та інші люди, які звертаються до GPU для обчислення речей, які точно не перекладаються на стандартну графіку, використовують подібний предмет.

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

http://community.arm.com/groups/arm-mali-graphics/blog/2014/04/17/get-started-with-compute-shaders

Якщо це не вказує на вас у правильному напрямку, чи не заперечуєте ви розширити свою концепцію, яка не відповідає парадигмі вершин / фрагментів?


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