12 ms·
I'll take a shot (PLUG -- Here's /my/ explanation of Perlin noise: [1]). 1) It's approximately band-limited. In other words, it goes up and down in a somewhat
by a_e_k 8y ago
I'll take a shot (PLUG -- Here's /my/ explanation of Perlin noise: [1]).
1) It's approximately band-limited. In other words, it goes up and down in a somewhat random looking way that is neither too fast nor to slow. If you evaluate two points close by, they'll have approximately the same value. If you evaluate two points far away they'll have completely unrelated values. This is so because the way it is constructed, every "hill" is paired with a "valley" nearby and vice-versa. Those hills and valleys are of a fairly uniform size and in each pair are a consistent distance from each other. This helps to give it a fairly even appearance and means that we can use it as a building block for other patterns; we can do spectral synthesis (e.g.: [2]) and sum together multiple instances of Perlin noise at different scales and amplitudes to produce a particular look. (Though Gabor noise [3], is even better at this.)
2) It's deterministic. So long as your permutation tables and gradient tables are the same from run to run (either hard-coded into your program or generated from the same RNG seeding), the values that you get out of Perlin noise at a given point will stay the same across different runs of your program. This is nice for things like Minecraft where you can put in the same seed and be dropped into the same world. For movies, we can use it to make pattern on a surface, add detail to a volume, or make things move in interesting swirls [4] and know that they'll stay consistent from frame-to-frame rather than jumping to a completely different pattern.
3) It's random access. You can evaluate any point, anywhere, at any time without having to say, pre-compute a patch and filter it somehow. (Classic Perlin noise uses just a couple of tiny lookup tables initialized at the program start and even these can be traded for pure computation [5].) This makes it ammenable to parallelization.
4) It easily generalizes to arbitrary dimensions. Typical implementations provide functions for evaluating it on a 1D, 2D, 3D, and 4D domains. So if you need a 3D point that varies with time you can use the 4D version. Classic Perlin noise gets exponentially more expensive with higher dimensions, but the closely related Simplex noise [6] scales linearly. There are also vector-valued versions where the range is multidimensional; instead of just getting a scalar value out you can get a vector.
Hope that helps. Let me know if anything is unclear or you have further questions.
----
[1] http://www.eastfarthing.com/blog/2015-04-21-noise/ http://www.eastfarthing.com/blog/2015-04-21-noise/
[2] http://paulbourke.net/fractals/noise/ http://paulbourke.net/fractals/noise/
[3] http://graphics.cs.kuleuven.be/publications/LLDD09PNSGC/ http://graphics.cs.kuleuven.be/publications/LLDD09PNSGC/
[4] https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph2007-curlnoise.pdf https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph2007-cu...
[5] https://www.csee.umbc.edu/~olano/papers/GPUTEA.pdf https://www.csee.umbc.edu/~olano/papers/GPUTEA.pdf
[6] https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf#page=18 https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf#page=18
- appleflaxen 8y agothat's super helpful; thank you! useful links, too.