Как я могу генерировать процедурный шум на сфере?

15

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

Я полагаю, что мог бы генерировать объемный шум и «вырезать» сферу, но это кажется излишне неэффективным - и если у шума есть некоторые сетевые артефакты, они все равно не будут одинаково появляться на сфере. Кроме того, по крайней мере, в случае симплексного шума, вырезание 2D-срезов из 3D-шума обычно выглядит иначе, чем создание 2D-шума сразу.

Есть ли какой-нибудь способ избежать этих проблем, например, генерируя шум непосредственно на сфере? Шум должен иметь, по крайней мере, качество шума Перлина , в идеале шум Симплекса .

Мартин Эндер
источник
Может быть, трипланарная проекция, как видно на GPU Gems 3 ? Вопрос в том, будет ли шум выглядеть размытым или нежелательным, когда он смешивается между различными проекциями.
Натан Рид
Я добавил еще один возможный метод в свой пост. Возможно, стоит уточнить ваш вопрос с более подробными требованиями. то есть, почему 2D-срез 3D-шума не удовлетворяет вашим визуальным требованиям? Каковы ваши требования к производительности?
Джон Калсбек
@JohnCalsbeek Честно говоря, у меня нет жестких требований под рукой. Это был просто вопрос, который меня интересовал, и я подумал, что стоит попробовать частную бета-версию. Конечно, вырезание 2D-среза из 3D-шума будет достаточно для многих приложений, но я уверен, что это окажет некоторое влияние на производительность и приведет к анизотропии (которая может быть или не быть заметной). «Вырезать сферу из трехмерного шума - ваш лучший вариант, потому что ...» - это, безусловно, правильный ответ.
Мартин Эндер,
Вы можете проверить эту шейдертой, которая шумит на сфере: shadertoy.com/view/4sfGzS
Алан Вульф

Ответы:

15

Я хотел бы рассмотреть возможность использования трехмерного шума и оценки его на поверхности сферы.

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

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

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

Изменить: кто-то еще пережевал математику! Смотрите эту новую статью о сферическом отображении Фибоначчи . Кажется, было бы просто адаптировать его к сферному шуму.


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

Геодезическая сфера

Каждая вершина сферы может иметь случайно сгенерированный градиент для градиентного шума. Чтобы передать эту информацию в пиксельный шейдер (если вам не нужна прямая интерполяция, такая как значение шума), вам может понадобиться метод, подобный каркасному рендерингу этой статьи с барицентрическими координатами : выполните неиндексированный рендеринг, где каждая вершина содержит барицентрические координаты этой вершины в треугольнике. , Затем вы можете читать из SV_PrimitiveID(или эквивалент OpenGL) в пиксельном шейдере, читать три градиента шума из вершин, основываясь на том, какой у вас треугольник, и использовать любой расчет шума, который вам нравится, используя интерполированные барицентрические координаты.

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

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

Джон Калсбек
источник
2
Я никогда не слышал о сетках Фибоначчи; это круто!
Натан Рид
Это увлекательная статья. Похоже, что вы можете настроить параметры, чтобы приблизить квадратную сетку или шестиугольную сетку, что позволило бы использовать различные подходы к генерации шума.
Трихоплакс
У меня были некоторые неплохие результаты, интерполированные около краев плитки (обернутые по краям), но это зависит от того, какого эффекта вы пытаетесь достичь, и от точных параметров шума. Прекрасно работает с немного размытым шумом, не очень хорошо с остроконечными / мелкозернистыми.