On this page you will find a 4096x4096 image followed by some notes on how it is made. So don't forget to scroll down.
How This Image Is Made
This is not intended to be a tutorial but if you are a Blender beginner you should be able to follow along and create your own version. I think this is a good project to practice.
Making The Planet
There is a
Planet collection in the scene with 4 objects;
Clouds 2 and
Athmosphere. First three objects share the same mesh,
Athmosphere has a separate mesh for shading purposes. More on that
Both meshes are created in the same way;
Add -> Mesh -> Ico Sphere,
set subdivisions to
3 and radius to
Using a 20 unit diameter sphere for a planet is a rather arbitrary decision.
I never intended this scene to look ultra realistic and I didn't have a clear
idea for the final result in the beginning. Ultimately I went for a more
stylistic look (more about this in Compositing section). It
is generally a good idea to use a scale so that your medium sized details fall
in range of
[0.0, 1.0) units. That is units as in Blender units, which
can be mapped to millimeters or kilometers in
Scene -> Units panel.
Back to main topic. As I mentioned before clouds and ground share the same mesh datablock. You might ask; how do they not clip into each other? Here is a render with just those 3 objects visible:
I have changed the materials a bit to enhance readability. In the render
Ground has a blue tint,
Clouds 1 has a red tint and
Clouds 2 has a
green tint. If you look closely you can see clouds casting shadow on the
planet surface, they are not same sized. This is achieved by using
modifier with varying
Displace modifiers have no texture assigned. This way the
entire geometry is displaced uniformly. That is
Clouds 1 and
Clouds 2. These values are arbitrary,
just like the
10m radius I have chosen for the ground sphere. It looked
fine, so I went with it. However as I mentioned above it is usually a good
idea to be mindful about the scale of things in your scene. Especially for
more complex scenes.
To finish our planet there is only one more object to create;
As I mentioned above we cannot just create another instance of our icosphere
and use a slightly larger displacement strength. This is because Eeevee
cannot fill the mesh's volume like Cycles does and I used
coordinates to spherical volume density gradient. Since our planet's
athmosphere is spherical we are lucky that can use a gradient texture to
define its volume.
So we use the
Generated coordinates and apparently they are not updated
(grown) based on the modifier stack (displacement). Alternatively we could
Object coordinates but that also would not allow us to adjust the
size of athmosphere (bounds of the volume rendered) using the viewport. Keep
it in mind this all works because our geometry is spherical, if we had a
planet shaped like the Stanford
Bunny we would need to use
volume data (VDB or mesh to volume modifier).
This concludes the planet. Let us look at how the cloud is created.
Making The Cloud
Making the cloud is a bit more complicated than making the planet. Cloud is rendered using volumetrics and to set up the shape of this volume we need a few mesh objects.
Highlighted object here is the base shape for the cloud. The volume is set up
Mesh to Volume modifier on a volume object. The base mesh is
created using simple edge only structure and applying
Skin modifier to
create thickness. There is also a
Shrinkwrap modifier to constrain the
vertices of base mesh to that large sphere-like shape you can see in the image
This creates a volume with the shape we want. If we stopped here, our render would look very boring. Boring and all wrong in fact.
To add that juiciness, that oomph factor to our image we need to fix the shading of our cloud volume. Eeeve is reasonably good (and much faster than Cycles) at rendering volumes, but it does not have a realistic enough lighning model (compared to Cycles) so we need to do something unrealistic to make it look more realistic.
Distributing lights over a (invisible) mesh that's cut-out from the cloud base
shape did the trick. This light instancer needs to be offset from the cloud
base shape a little bit to get the best results. This is achieved with a
Displacement modifier with no texture. Lights are instanced using a
GeometryNodes modifier on this mesh. Geometry nodes setup is just a
Point Distribute node set to
Poisson Disk distribution and a
Of course these extra lights can illuminate the planet's dark side a bit too
much if their intensity is not adjusted properly. In my scene I used
18 Watt intensity but this would mean very little to you as there are so many
other factors that determine lightning (such as exposure). You should adjust
your instance's intensity so that it creates a nice effect on the cloud but
does not light up the planet's dark site too much.
Initially I had a world background, but I discarded it later for a compositor based background. A compositor based background works since this is a single still render and it is a lot easier to set-up and tweak.
Space is supposed to be dark, so our background should be subtle. Our base
layer for the background is just two noise (
Clouds) textures with different
sizes. One noise texture is used for color channel, and has a color ramp.
The other one is used as an alpha, so we do not set up colors for that one.
A single noise texture could also be used but it would not have the same level
of variation as the combination of two textures.
Making the stars is very easy. We start with a
Voronoi texture. It does
not look anything like a starry sky. Obviously we can invert this to get
large, white blurry points. Adjusting the size of the texture down would make
the stars smaller but it would also increase the number of the stars. Making
the size larger would reduce the number of stars but make them too big this
time. Eventually we would decide to give up making a starfield by just
fiddling with texture properties.
The node setup above might look complicated but it really is not. We are
using both the
Color (based on the position of the nearest point) and
Value (based on the distance to the nearest point) outputs of the texture.
Value is used to determine the position of our star, and the color's intensity
is used to add a bit of variation to the starlight's strength. This version
does not vary starlight color. Let us look at how both outputs are used in a
bit more detail.
All the math nodes in the bottom part are just to calculate
From Max &
From Min of the
Map Range node that uses value output of the voronoi texture. I
wanted to be able to adjust star size and density of the starfield
independently (problem I mentioned 2 paragraphs ago), so the math nodes help
with that. Trick is to adjust star size when we change the texture size, this
is done by multiplying star size values with
Starmap Size value. Those two
Divide nodes are there only because if we enter a value like
0.0001 in a
number field, it gets processed as
0.0001 but displayed as
0.000 in the
UI. So those two
Divide nodes are there just to avoid confusion. Also note
that, in map range node
To Min value is
To Max value is
This effectively inverts our texture, from black dots on white background to
white dots on black background.
Nodes that use the color output of voronoi texture is quite straightforward.
Color to BW is not strictly necessary, it turns the color output into a float
output. Map range node is mapping
[0.7, 1.0] range to
[0.3, 1.0]. In
simple terms this means most of the stars will be quite dim (assuming a
uniform distribution, 70% of the stars will be of 30% brightness) and few
(remaining 30%) stars will have uniformly (linear) distributed brightness values
ranging from dim to full brightness. Like I said, it looks complicated but it
Finally we can combine the background with our render. Node setup for this is below. I didn't include the nodes that generate the mask (shown in the image below) to keep things simple. Note that background's edges will be further dimmed when we apply the vignette.
Lens Distortion & Film Noise
Now that we have merged our compositor-based background and our rendered subject, what is left is to enhance the realism of our image by degrading it. The idea is to make it look less like a render and more like something that's totally not rendered in a 3D software like Blender.
These enhancements make a big difference in believability of your image. But the key is to keep these effects very, very subtle. You can find a comparison of these two effects applied vs our image with only the background (2x zoomed):
You can see the nodes used to create the vignette below. It is basically a
blurred box mask, applied with
Multiply blend type over the image.
The reason why we are scaling the mask down and then back up is because I feel like this makes it apply blur faster than the full size mask. I did not test this at all, so it might as well make it run slower. Feel free to remove both scale nodes. The choice of starting with a rectangle shape or ellipse shape is entirely up to you. The only important thing to note here is to keep this effect subtle, just like the lens dispersion and film grain.
That concludes the compositing. You can see a comparison between raw render (with plain black background) and the composited image above. Also here is a list of compositing steps we have covered:
- Dim background around subject.
- Lens dispersion
- Film noise
I hope this was useful for you. I don't plan on sharing the blend file, I covered everything that makes this project above. It would be a much better learning experience if you do it on your own, than just looking at the finished project file. Your critics and comments are welcome.