Шум Перлина с OpenGL - PullRequest
       95

Шум Перлина с OpenGL

1 голос
/ 23 ноября 2010

Я изучал Шум Перлина на нескольких примерах @ http://dindinx.net/OpenGL/index.php?menu=exemples&submenu=shaders и не мог не заметить, что его make3DNoiseTexture() в perlin.c использует noise3(ni) вместо PerlinNoise3D(...)

Сейчасэто почему?Разве шум Перлина не является суммой различных шумовых частот и амплитуд?

Вопрос 2 - что означает ni, inci, incj, inck?Зачем использовать ni вместо координат x, y?Почему ni увеличивается с
ni[0]+=inci;
inci = 1.0 / (Noise3DTexSize / frequency);
Я вижу, что Хьюго Элиас создал свой Perlin2D с координатами x, y, и PerlinNoise3D (...) тоже.* Заранее спасибо:)

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010

Теперь я понимаю, почему и собираюсь ответить на свой вопрос в надежде, что это поможет другим людям.

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

Теперь, если бы входной точкой было целое число, такое как координаты xyz текстуры, которую вы хотите создать, произведение точек всегда возвращало бы 0, что давало бы плоский шум. Поэтому вместо этого мы используем inci, incj, inck в качестве альтернативного индекса. Да, просто индекс, больше ничего.

Теперь, возвращаясь к вопросу 1, есть два способа реализации Шума Перлина:
1. Рассчитайте значения шума отдельно и сохраните их в слотах RGBA в текстуре
2. Синтезируйте шумы заранее и сохраните их в одном из слотов RGBA в текстуре

noise3(ni) - это фактическая реализация метода 1, тогда как PerlinNoise3D(...) предлагает последний.

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

1 голос
/ 23 ноября 2010

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

Я полагаю, что причина ni, inci, incj, inck заключается в том, что непосредственное использование громкости x, y, z не дает хорошего результата, поэтому вместо этого можно масштабировать шум с частотой.настроить разрешение шума независимо от размера громкости.

...