Створення загальних норм вершин у GPU


9

Здебільшого мені вдалося перенести реалізацію Marching Cubes з процесора до обчислювальних шейдерів OpenGL, але я ще не вирішував нормалів і цікавився найкращим способом зробити це.

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

Я міг би просто перенести цю реалізацію на інший шейдер, але проблема, яку я бачу в цьому, - це велика кількість необхідних атомів. Оскільки ми можемо використовувати атомію лише для скалярних цілих чисел, і я не можу придумати спосіб упаковки 3 підписаних входів у 1 підсумковим чином, це означає 3 осі * 3 вершини = 9 атомних додань на виклик шейдера. Вони, звичайно, поширюватимуться по пам’яті, так що це не так, як ударити по одному атомному лічильнику 9 разів, але це все одно здається пеклом.

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

Хтось має кращі ідеї, як це зробити?

Відповіді:


5

Для рішення лише для nVidia можна використовувати атомні додавання з плаваючою комою (наприклад, NvInterlockedAddFp32) Розблокування внутрішньої графіки GPU в HLSL | NVIDIA Developer

Я спробував це на 80.000 вершинній сітці, і це досить швидко (щось на зразок 1 або 2 мс на GTX980M, якщо я правильно пам'ятаю)

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

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


Оскільки питання старе, я запитаю вас замість цього :-) Для чого я розумію, що просто інформація про прикріплення для кожної вершини була недостатньо хорошою для Russ?
Андреас

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