With Exo Terrain, I ended up making a quite complicated noise function. However, it was kept back by having to output something that would seem like terrain. As I have explored previously, terrain and other art projects go well with different levels of domain warping. This time, I wanted to create as complicated a function as Exo Terrain, only with levels of domain warping fitting art. Thus Rock Crystals was born.
The central noise function samples 9 different noise fields. These are combined as follows, if we imagine a function noise(scale,coordinates) that takes in either two coordinates (x and y) or three coordinates (x and y, and then a third coordinate for domain warping).
bumpdistort = noise(1/15,x,y)
bump = noise(1/10,x,y,2*bumpdistort)
bump2distort = noise(1/40,x,y)
bump2 = noise(1/30,x,y,3*bump2distort)
roughdistort = noise(1/100,x,y)
rough = noise(1/150,x,y,5*roughdistort)
roughness = abs(rough-.5)
smallscale = (bump+bump2)*roughness
middistort = noise(1/80,x,y)
midscale = noise(1/60,x,y,3*middistort)
largescale = noise(1/1200,x,y)
dither = random(.015)
z = 2*smallscale+2*midscale+10*largescale+dither
value = noise(1/400,x,y,z)
return(value)
This combines small-scale and large-scale structures together just to get the z-coordinate of a final noise call. This is then called three times, once to modulate the hue of the output colour, once for the saturation and once for the brightness.
I think what excites me about this project is that while everything is very clearly Perlin-noise based, due to the high amount of domain warping, the usual artifacts are avoided. I have a lot of opinions about all of this, but I am finding that it is difficult to really put them into words.
I want to show a bit of what the dithering is there for. This is a small random value added to the z depth of the noise function, which makes pixels even close to each-other stand out from each-other. Its effect is quite subtle at the large scale, but it creates a different feeling.
I think that's all I have to say about the project. It's all a bit too complicated to really be described in words. The code and demonstration can be found on my OpenProcessing page as usual.
The central noise function samples 9 different noise fields. These are combined as follows, if we imagine a function noise(scale,coordinates) that takes in either two coordinates (x and y) or three coordinates (x and y, and then a third coordinate for domain warping).
bumpdistort = noise(1/15,x,y)
bump = noise(1/10,x,y,2*bumpdistort)
bump2distort = noise(1/40,x,y)
bump2 = noise(1/30,x,y,3*bump2distort)
roughdistort = noise(1/100,x,y)
rough = noise(1/150,x,y,5*roughdistort)
roughness = abs(rough-.5)
smallscale = (bump+bump2)*roughness
middistort = noise(1/80,x,y)
midscale = noise(1/60,x,y,3*middistort)
largescale = noise(1/1200,x,y)
dither = random(.015)
z = 2*smallscale+2*midscale+10*largescale+dither
value = noise(1/400,x,y,z)
return(value)
This combines small-scale and large-scale structures together just to get the z-coordinate of a final noise call. This is then called three times, once to modulate the hue of the output colour, once for the saturation and once for the brightness.
I think what excites me about this project is that while everything is very clearly Perlin-noise based, due to the high amount of domain warping, the usual artifacts are avoided. I have a lot of opinions about all of this, but I am finding that it is difficult to really put them into words.
I want to show a bit of what the dithering is there for. This is a small random value added to the z depth of the noise function, which makes pixels even close to each-other stand out from each-other. Its effect is quite subtle at the large scale, but it creates a different feeling.
I think that's all I have to say about the project. It's all a bit too complicated to really be described in words. The code and demonstration can be found on my OpenProcessing page as usual.
Comments
Post a Comment