Noise Singularity

I was messing about with math.noise() and instead of making terrain again, I thought of just visualizing the noise on the screen using frames. Simple stuff.
I played around, added about 100 octaves, messed with the seeds, scale, etc.
I was messing around with resolutions (size of the frames), with 5 pixels being a safe resolution Roblox can handle, and 1 pixel being extremely tedious and largely impossible to make a decently sized image.
That is until I accidentally discovered a certain anomaly when printing a noise image.


For some reason, the noise created a very odd sun flare in front of what looks like a warped plane of noise that looks like an inverted cylinder. The image is at a resolution of 5 pixels.
I quickly had the image centre and zoom out to get a better look at the anomaly.

58b6784a4da6d712265dcbcf99a52c52-png

After reviewing my code, I noticed that, oddly enough, nothing was off. The code was working perfectly. No logic errors or any type of identifiable issues. After playing around with a few settings, the anomaly persisted. This told me that this anomaly is akin to the noise function itself.
Zooming out further revealed this.

0739556dff3c3da65c0ba3bd5fab52ce-png
This image made it clear that the noise map past the centre is actually completely unaltered, which may explain why we don’t see it in normal usage.
Changing the seed only gave another unique look for the anomaly, not get rid of it.
Making a full resolution of this beauty is not possible in one go so I had to generated over a dozen chunks and put them together in post to generate this higher quality image.


Changing the resolution resulted in the image being too zoomed out so the next day, I generated about 20 chunks and put together a much better image.


@Vexture called it a singularity so that’s how I’ll call it too: the noise singularity. Let me know if you have ever seen this anomaly before and what could be causing it!
The seeding method I used was to put the X and Y numbers of the frame in math.noise(), with the Z parameter being the seed, as it is usually done for 2D noise. The seed used here was 0.2.

7 Likes

After testing the original Perlin Noise implementation in Java by Ken Perlin, I achieved the same result. It is not unique to Roblox.
While I was at it, I continued playing around with the anomaly in Java because only there could I generate high-quality images of any size I wanted in a reasonable amount of time. I generated this 4k image below.


The previous images didn’t automatically scale the contrast depending on the octave count so the new images have more visible details.
Since I couldn’t get any more detail, I had some fun in creating a lower quality gif animation (I don’t have all day to generate it after all) of the anomaly by changing the seed (Z value) incrementally, resulting in a rather mesmerizing singularity.

1 Like

After improving my generation, I spent the last 5 hours generating the frames for this video. It’s the same thing as above but shorter and far higher quality; a full 1080p this time! Behold the beauty.

It appears you’re not offsetting each octave of perlin noise, meaning that near the origin the values for each octave approach the same value.

It’s a cool effect, but not an issue with perlin noise at all - just a side effect of the way you sampled it :stuck_out_tongue:

5 Likes

The noise god Elttob himself hath spoken

You beat me to it

4 Likes

After tedious searching and experimenting, I still cannot find a way to completely remove this anomaly. How would you offset the octaves to fix this?

EDIT: Found the solution; apparently you need to precalculate an array of XY offsets for each octave to use, removing the singularity.

2 Likes