Lets start off with a sphere and a pigment.
#declare PMoonMare=pigment {
wrinkles
turbulence 0.2
scale 0.5
color_map { [0 rgb 1] [1 rgb 0] }
}
#declare PMoonCraters=
pigment {
granite
scale 0.2
color_map{
[0 rgb 1]
[1 rgb 0]
}
}
#declare TMoon=
texture{
pigment {
average
pigment_map{
[0.85 PMoonMare]
[0.15 PMoonCraters]
}
}
finish {ambient 0.001 diffuse 0.9}
}
#declare Moon1=sphere { 0,1 texture {TMoon } }
This is good but too smooth. Fine for moons in the distance or seen from a planet in daylight. But lets try and give it some depth add the following normal to the moon texture.

normal {
average
normal_map{
[0.85 wrinkles 0.3 turbulence 0.2]
[0.15 granite 0.3 scale 0.4]
}
scale 1/2
}
That gives us a bit of a feel for the craters, however at the terminus its a hard cut. You can get around it by controling the light but I won't go into that now. So now it looks fakey. Lets take a look at iso_surfaces.

first we need a sphere iso_surface:
#declare Sphere=function{"Sphere",<1>}
Then we want the same pigments for the moon as for the bumpiness of the moon.
#declare FCraters=function{pigment{PMoonCraters}}
#declare FMare=function{pigment{PMoonMare}}
Remove the normal declaration from our texture declaration and use the following object.
isosurface {
function {
Sphere(x,y,z)
+(1-FCraters(x,y,z))*0.005
+(1-FMare(x,y,z))*0.02
}
eval
accuracy 0.001
bounded_by{sphere{0,1}}
texture {TMoon}
}
