Я хотел бы генерировать процедурный шум на поверхности сферы (например, чтобы процедурно генерировать планеты или шарики с мраморной текстурой). Конечно, я мог бы просто взять стандартный алгоритм шума и отобразить его на сфере, но это имеет все проблемы проецирования плоскости на сферу, такие как искажения на полюсах или где-либо еще.
Я полагаю, что мог бы генерировать объемный шум и «вырезать» сферу, но это кажется излишне неэффективным - и если у шума есть некоторые сетевые артефакты, они все равно не будут одинаково появляться на сфере. Кроме того, по крайней мере, в случае симплексного шума, вырезание 2D-срезов из 3D-шума обычно выглядит иначе, чем создание 2D-шума сразу.
Есть ли какой-нибудь способ избежать этих проблем, например, генерируя шум непосредственно на сфере? Шум должен иметь, по крайней мере, качество шума Перлина , в идеале шум Симплекса .
источник
Ответы:
Я хотел бы рассмотреть возможность использования трехмерного шума и оценки его на поверхности сферы.
Для градиентного шума, который естественным образом находится в области поверхности сферы, вам необходим регулярный образец точек выборки на поверхности, которые имеют естественную информацию о связности, с примерно равной площадью в каждой ячейке, чтобы вы могли интерполировать или суммировать соседние значения. Интересно, может ли что-то вроде сетки Фибоначчи сработать:
Я не перебирал математику, чтобы определить, сколько будет работы, чтобы выяснить показатели и расстояние до ваших четырех соседей (я даже не знаю, в конечном итоге у вас будет четыре четко определенных соседа), и я подозреваю, что это может быть менее эффективно, чем просто использование 3D-шума.
Изменить: кто-то еще пережевал математику! Смотрите эту новую статью о сферическом отображении Фибоначчи . Кажется, было бы просто адаптировать его к сферному шуму.
Если вы визуализируете сферу, а не просто оцениваете шум на поверхности сферы, и хорошо справляетесь с тесселяцией вашей сферы до разрешения вашей шумовой решетки, вы можете создать геодезическую сетку на поверхности сферы (подразделенный икосаэдр, обычно):
Каждая вершина сферы может иметь случайно сгенерированный градиент для градиентного шума. Чтобы передать эту информацию в пиксельный шейдер (если вам не нужна прямая интерполяция, такая как значение шума), вам может понадобиться метод, подобный каркасному рендерингу этой статьи с барицентрическими координатами : выполните неиндексированный рендеринг, где каждая вершина содержит барицентрические координаты этой вершины в треугольнике. , Затем вы можете читать из
SV_PrimitiveID
(или эквивалент OpenGL) в пиксельном шейдере, читать три градиента шума из вершин, основываясь на том, какой у вас треугольник, и использовать любой расчет шума, который вам нравится, используя интерполированные барицентрические координаты.Я думаю, что наиболее сложной частью этого метода является создание схемы для сопоставления вашего идентификатора треугольника с тремя выборками, чтобы найти значения шума в каждой вершине.
Если вам нужно несколько октав шума или шума с более высоким разрешением, чем у вашей сферной модели, вы можете сделать грубую геодезическую сетку с вершинами и выполнить несколько уровней деления в пиксельном шейдере. то есть, исходя из барицентрических координат, определите, в каком подразделяемом треугольнике вы бы находились, если сетка была подвергнута дополнительной тесселяции, а затем выясните, какими будут примитивные ID и барицентрические координаты для этого треугольника.
источник