Perlin vs. Simplex
bit-101.com
bit-101.com
One thing the article only brushed, but is the main advantage of simplex noise is its performance. Perlin noise scales O(2^n) with the number of dimensions, but simplex noise scales O(n). That's because Perlin noise interpolates the nearest 2^n gradient values in its hypercube neighborhood, but simplex noise only has to check n+1 values in its simplex. For 3D and especially 4D noise that's a huge performance advantage.
edit: Turns out simplex noise is O(n^2), still faster than Perlin noise.
Typo? Simplex noise scales at O(n^2), not O(n).
Right, the gradients will still have more dimensions to evaluate.
Obviously this ignores the parallelizability of the algorithms, which is probably the more important factor at this point, and the ability to be hardware accelerated.
(Edit: the complexity is outlined on page 20 of the original simplex noise paper[1]. Just ctrl+f "complexity")
Also, Simplex noise is good in some ways but for texture -generation, when I tried it by swapping it in, it had a bunch of artefacts that weren't present with Perlin noise - it's not a simple improvement on Perlin.
Although it does seem like it expires next year. Sweet!
A great project would be to upgrade the Blender Noise Texture Node, by adding a Perlin/Simplex switch:
https://docs.blender.org/manual/en/latest/render/shader_node...
[0]: GDC, "Math for Game Programmers: Juicing Your Cameras With Math" https://www.youtube.com/watch?v=tu-Qe66AvtY
> Perlin noise is a procedural texture primitive, a type of gradient noise used by visual effects artists to increase the appearance of realism in computer graphics. The function has a pseudo-random appearance, yet all of its visual details are the same size. This property allows it to be readily controllable; multiple scaled copies of Perlin noise can be inserted into mathematical expressions to create a great variety of procedural textures. Synthetic textures using Perlin noise are often used in CGI to make computer-generated visual elements – such as object surfaces, fire, smoke, or clouds – appear more natural, by imitating the controlled random appearance of textures in nature.
An example for Perlin noise in production is the terrain generation in Minecraft: https://minecraft.fandom.com/wiki/Noise_generator
[1]: https://www.redblobgames.com/x/2107-webgl-noise/webgl-noise/...
Personally, I think value noise (with multiple octaves) is underrated:
OpenSimplex noise [0] has become somewhat popular in recent years since it gets similar results without infringing on the patent, but Perlin noise is decades older and have more name recognition, more implementations, etc.
It isn't just a matter of values clustering around the average; values aren't evenly distributed so just scaling doesn't improve it at all. You have to tune a smoothstep specifically to it, and past 4d you need multiple smoothsteps. Even with that it's gonna look different, and it's just overall not ideal.
For instance if you're writing graphics effects and you have a 3d noise that you want to transition to a 2d noise if it's farther away or not intersected, you'll get a noticeable change in the visual feel that you have to go back and fix.
I'm not familiar enough with Perlin or Simplex noise to know if it's standard to use the same "random" values in the permutation table across implementations [1].
[0] https://cm-gitlab.stanford.edu/andreab/mus320c-harmonizer/bl...
[1] https://github.com/bit101/bljs/blob/master/src/noise.js#L37-...
The continuous gradient function is also extremely important for 3d graphics. The surface may look fine, but the normal of Perlin noise has giant discontinuities between tiles.
Higher dimensional simplex noise has a lower-contrast distribution, not just lower contrast values. If you just naively scale it you end up with a bunch of points that are <0 or >255.
With statistics I bet one could derive this mapping equation pretty quickly. Then it would be interesting to compare the resulting residuals or statistical differences at that point. Because it would be comparing the actually differences rather than these more surface differences.