Still on the matter of Perlin noise, I finally managed to figure out how to wrap Perlin noise on a sphere (that is, as a `Texture[]`

). It was a bit inconvenient that it seems (at least, to me) that not one of the usual references on Perlin noise mentioned the explicit formulae needed for a proper spherical embedding of Perlin noise. Making use of the functions already defined in the doc page for `Compile[]`

, here are two *Mathematica* functions you can use for generating textures that can be wrapped on a sphere:

`sphericalPerlin1 = With[{octaves = 4},`

Compile[{{theta, _Real}, {phi, _Real}, {amplitude, _Real},

{frequency, _Real}, {gain, _Real}, {lacunarity, _Real}},

Module[{noiseVal = 0.0, x, y, z, sf, freq = frequency,

amp = amplitude},

sf = Sin[phi];

x = sf*Cos[theta] + 1; y = sf*Sin[theta] + 1; z = Cos[phi] + 1;

Do[

noiseVal += amp*signedNoise[x*freq, y*freq, z*freq];

freq *= lacunarity; amp *= gain,

{octaves}

];

noiseVal

], CompilationOptions -> {"InlineExternalDefinitions" -> True}

]]

`sphericalPerlin2 = With[{octaves = 4},`

Compile[{{theta, _Real}, {phi, _Real}, {amplitude, _Real},

{frequency, _Real}, {gain, _Real}, {lacunarity, _Real}},

Module[{noiseVal = 0.0, x, y, z, sf, freq = frequency,

amp = amplitude},

sf = Sin[phi];

x = sf*Cos[theta] + 1; y = sf*Sin[theta] + 1; z = Cos[phi] + 1;

Do[

noiseVal += amp*Abs[signedNoise[x*freq, y*freq, z*freq]];

freq *= lacunarity; amp *= gain,

{octaves}

];

noiseVal

], CompilationOptions -> {"InlineExternalDefinitions" -> True}

]]

As an example, here is how to use `sphericalPerlin2[]`

along with `DensityPlot[]`

to generate a texture:

`DensityPlot[sphericalPerlin2[th, ph, 0.5, 2.0, 0.5, 2.0],`

`{th, 0, 2 Pi}, {ph, 0, Pi},`

AspectRatio -> Automatic, Frame -> None, PerformanceGoal -> "Quality", PlotPoints -> 200, PlotRange -> All]

and here is the result, after adding appropriate coloring (with thanks to Rob Collyer for the color gradient):

In fact, this is the texture I used for upper leftmost “marble” in the first image.