Як я можу генерувати процедурний шум у сфері?


15

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

Я думаю, я міг би створювати об'ємний шум і "вирізати" сферу, але це здається зайвим неефективним - і якщо шум має деякі артефакти на основі сітки, вони все одно не з'являться однаково на кулі. Крім того, щонайменше у випадку шуму Simplex, вирізання 2D-зрізів із 3D-шуму зазвичай виглядає інакше, ніж генерувати 2D-шум відразу.

Чи є якийсь спосіб уникнути цих проблем, наприклад, генеруючи шум на власній ділянці? Шум повинен мати принаймні якість шуму Perlin , в ідеалі шуму Simplex .


Може бути трипланарна проекція, як це спостерігається в GPU Gems 3 ? Питання полягає в тому, чи буде шум виглядати розмитим або інакше небажаним, коли він змішується між різними проекціями.
Натан Рід

Я додав ще один можливий метод до своєї посади. Можливо, варто уточнити своє питання з більш детальними вимогами. тобто чому 2D фрагмент 3D-шуму не відповідає вашим візуальним вимогам? Які ваші вимоги до ефективності?
Джон Калсбек

@JohnCalsbeek Чесно кажучи, у мене немає жорстких вимог під рукою. Це було лише питання, яке мені було цікаво, і я думав, що підкажу приватну бета-версію. Звичайно, вирізання двовимірного шматочка з тривимірного шуму буде достатньо для багатьох застосувань, але я впевнений, що це матиме певний вплив на продуктивність та анізотропію (що може бути або не помітно). "Вирізання сфери з 3D-шуму - ваш найкращий варіант, тому що ...", безумовно, є коректною відповіддю.
Мартін Ендер

Ви можете перевірити цю шадертою, яка шумить у сфері: shadertoy.com/view/4sfGzS
Алан Вулф

Відповіді:


15

Я б подумав просто перейти з 3D-шумом і оцінити його на поверхні сфери.

Для градієнтного шуму, який, природно, знаходиться в області поверхні сфери, вам потрібен звичайний зразок точок зразка на поверхні, які мають природну інформацію про з'єднання, приблизно з рівним площею в кожній комірці, щоб ви могли інтерполювати чи сумувати суміжні значення. Цікаво, чи може працювати щось на зразок сітки Фібоначчі :

Сітка Фібоначчі на поверхні сфери

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

Редагувати: хтось ще жував математику! Дивіться цей новий документ про Сферичне картографування Фібоначчі . Здається, що було б просто адаптувати його до шуму сфери.


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

Геодезична сфера

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

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

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


2
Я ніколи раніше не чув про сітки Фібоначчі; це досить круто!
Натан Рід

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

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