Atmosphere Graph¶
An Atmosphere Graph describes a planet's whole sky as a node graph: the gas that colours it, the haze and dust in it, the ozone band, low fog, the sun and the cloud layers. You wire nodes together, and a live Sky Preview renders the real atmosphere while you edit. You don't write any code.
One graph drives one atmosphere. Save a graph per planet (AG_Earth,
AG_Mars, ...) and swap them to change the look of a world in one step.
Which plugin?
The Atmosphere Graph is part of Metaplanets Creator: Atmosphere (2.1.0 and later). It works on its own, without the terrain plugin, in Unreal Engine 5.6, 5.7 and 5.8. Getting started with the atmosphere actor itself is covered in Adding an Atmosphere.
What you can do with it¶
- Earth-like skies: blue air, a white horizon, the blue band at twilight, and orange sunsets.
- Other planets: thin, dusty, red-scattering air (Mars); thick nitrogen-methane smog (Titan); hydrogen-helium air; skies tinted by an orange or blue-white star.
- Weather: haze, valley fog with sun shafts, and stacked cloud layers from thin cirrus to cumulonimbus storm decks with rain shafts.
- Alien looks: teal air, violet haze, coloured clouds, a sky that scatters red instead of blue.
- The same sky from the ground to orbit: the preview shows altitudes from 2 m up to 2,000 km, so you can check the limb glow from space and the sky from the surface without leaving the editor.
Create a graph¶
- In the Content Browser, right-click and choose
Metaplanets → Atmosphere → Atmosphere Graph. Name it with the
AG_prefix, for exampleAG_MyPlanet. - Double-click it. A new graph is not empty: it starts as an Earth starter with Air, Haze, an Absorbing Layer (ozone), a Sun and one Cumulus layer, all wired to the Atmosphere output.
- Edit nodes and watch the Sky Preview. The graph recompiles automatically 0.2 s after your last change; the Compile button forces it.
The editor¶
| Area | What it does |
|---|---|
| Graph | The node canvas. Right-click for the node palette (grouped by category). Drag from a pin to list only the nodes that fit it. |
| Sky Preview | The real atmosphere renderer in a preview world. Pick an altitude (Ground, 3 km, 12 km, 80 km, Orbit) and set Sun elevation, Sun azimuth, View pitch and a fixed Exposure (EV100). |
| Compiled | Read-only view of the result: planet radius, atmosphere height, ground albedo, every medium, the sun and the cloud layers. Last Compile Message shows an error if the graph didn't compile. |
| Toolbar | Compile, Copy JSON, Paste JSON. |
Pins only connect to pins of the same type (an Air output only goes into an Air input, for example). Float pins have inline number boxes, colour pins have swatches and choice pins have dropdowns. Nodes with many settings hide the advanced ones behind the arrow at the bottom of the node.
The preview has no terrain
The Sky Preview stands on a smooth sphere shaded with the graph's Ground Albedo, looking along the horizon from the pole. It shows exactly how the air, haze and clouds look; place the atmosphere in your level to see it over your planet's terrain.
Use a graph on an atmosphere¶
Select the Metaplanets Atmosphere Actor, select its AtmosphereComponent, and set Atmosphere Graph (category Atmosphere → Graph) to your asset.
- The graph's air, haze, ozone, fog, sun and planet values replace the component's own settings. They are reapplied every time you edit and recompile the graph, so you can keep the graph editor open next to the level viewport.
- Cloud layers from the graph are created as temporary components (named
GraphCloudLayer…). They are rebuilt from the graph when the level loads and are never saved into the level. - Cloud layers you added by hand stay and render together with the graph's layers. When you switch an existing level over to a graph, untick Enabled on the old hand-placed layers so you don't get both.
With Metaplanets Creator, a sky preset can point at a graph instead. Add this line to the preset's Atmosphere list:
Node reference¶
Gases and haze¶
Air (Rayleigh): the gas itself, scattering short wavelengths more than long ones. This is what makes a clear sky blue and a sunset orange.
| Pin | Default | Meaning |
|---|---|---|
| Composition | EarthAir | EarthAir, CarbonDioxide, NitrogenMethane or HydrogenHelium. Sets how strongly the gas scatters and its typical scale height (8, 11.1, 40 and 27 km). |
| Density | 1.0 | Surface density relative to Earth. Mars is about 0.013, Titan about 4.4, Venus about 65. |
| ScaleHeight | -1 | Height (km) over which the air thins out. -1 uses the composition's typical value. |
| Tint | white | Per-channel multiplier for stylised skies. |
Colored Scattering: an alternative to Air when you want full control of the colour. It plugs into the same Air input.
| Pin | Default | Meaning |
|---|---|---|
| Strength | 13.558 | Scattering at 550 nm (green). |
| WavelengthExponent | 4.0 | 4 = a normal blue sky. 0 = grey, equal at all colours. Negative = red scatters more than blue, so the sky turns warm and the sunset blue (Mars-like). |
| ScaleHeight | 8.0 | km. |
| Tint | white | Per-channel multiplier. |
Haze (Mie): aerosols such as dust, smoke and sea salt. Haze whitens the horizon, softens distant terrain and puts a glow around the sun.
| Pin | Default | Meaning |
|---|---|---|
| Type | EarthAerosol | EarthAerosol, DesertDust, MarsDust, Smoke, VolcanicAsh or Marine. Each type has its own amount, height, glow and colour. |
| Density | 1.0 | Multiplier on the type's amount. |
| HeightScale | 1.0 | Multiplier on how high the haze reaches. |
| Absorption | 1.0 | Multiplier on how much light the particles absorb (darker, browner haze). |
| Anisotropy | 0.0 | Added to the type's forward scattering. Higher = a tighter, brighter glow around the sun. |
| Tint | white | Colour of the scattered light. |
| AbsorptionTint | white | (advanced) Colour removed by absorption. |
| Haze type | Character |
|---|---|
| EarthAerosol | Neutral, low (1.2 km), strong sun glow. The default Earth haze. |
| DesertDust | Warm beige, reaches 2.5 km, absorbs blue. |
| MarsDust | Orange-brown, reaches 11 km, strongly absorbs blue. |
| Smoke | Warm grey-brown, absorbs strongly. |
| VolcanicAsh | Dense grey, reaches 3 km. |
| Marine | Bright white sea haze, very low (0.9 km). |
Absorbing Layer (Ozone): a band of gas that absorbs light without scattering it. Earth's ozone takes out some red and green, which is why the sky stays deep blue at twilight.
| Pin | Default | Meaning |
|---|---|---|
| PeakAltitude | 25 km | Centre of the band. |
| Width | 15 km | Half-width of the band. |
| Strength | 1.0 | 0–3. |
| Tint | white | Per-channel multiplier on the absorbed colours. |
Ground Fog: low valley fog and mist, with sun shafts through it.
| Pin | Default | Meaning |
|---|---|---|
| Density | 0.03 | Fog at ground level (per km). |
| ScaleHeight | 0.35 km | How quickly it thins with height. |
| Albedo | (0.75, 0.82, 0.9) | Fog colour. |
| Anisotropy | 0.35 | Forward scattering. Higher = stronger sun shafts when looking toward the sun. |
Unconnected means off
A medium that isn't wired to the output is switched off: no Air node means no blue sky, no Haze node means a perfectly clear horizon, no Ground Fog node means no fog. Leave a node out on purpose for airless or clear worlds.
Light¶
Sun: the star's disk and colour.
| Pin | Default | Meaning |
|---|---|---|
| Illuminance | 25 | Brightness of the sun used by the Sky Preview and by atmospheres that don't follow a directional light. |
| AngularRadius | 0.268° | Size of the disk. Earth 0.268, Mars 0.18. A close red dwarf might be 1–2. |
| Color | (1, 0.97, 0.91) | Connect a Star Color node here to set it by temperature. |
Star Color (Temperature): a black-body colour from a temperature in Kelvin (1,000–40,000). The Sun is 5,778 K, a red dwarf about 3,000 K and a blue giant about 15,000 K.
In a level, the sky follows your directional light
By default the atmosphere is lit by the level's Directional Light (its intensity and colour), so the sky, clouds and terrain always share one sun. The graph's Sun Illuminance and Color are used in the Sky Preview, and in a level only when Use Sun Light Intensity is turned off on the AtmosphereComponent or there is no directional light. To get a star's colour in a level, set the same colour on the directional light.
Clouds¶
One node per cloud type, plus Cloud Stack to combine them. Each cloud node outputs one layer; see Clouds: shapes & layers for what every setting does and ready-made recipes.
| Node | Default band | Look |
|---|---|---|
| Cumulus Clouds | 1.5–5 km | Rounded fair-weather clouds. |
| Stratocumulus Clouds | 0.8–2.2 km | Low, flat, lumpy sheets. |
| Cumulonimbus (Storm) Clouds | 1.2–12 km | Towering storm cells with anvils. |
| Nimbostratus (Rain) Clouds | 0.6–4 km | Thick grey rain decks with rain shafts. |
| Cirrus Clouds | 8–11 km | High, thin, wispy ice clouds. |
| Cloud Stack | Combines any number of layers into one Clouds wire. |
A graph can have up to 8 cloud layers.
Values¶
| Node | Use |
|---|---|
| Float | A number you can wire into several pins. |
| Color | A colour you can wire into several pins. |
| Math | Multiply, Add, Subtract, Divide, Min, Max or Power of two numbers. |
| Color x Float | Scale a colour's brightness. |
| Color Mix | Blend between two colours (Alpha 0 = A, 1 = B). |
Use them to drive several nodes from one control. For example, wire one Color into the Haze Tint and the Ground Fog Albedo so dust and fog always match.
Output¶
Atmosphere: exactly one per graph.
| Pin | Default | Meaning |
|---|---|---|
| PlanetRadius | -1 | km. -1 keeps the radius set on the actor (recommended when the atmosphere sits on a Metaplanets planet). |
| AtmosphereHeight | 100 km | Top of the atmosphere. Raise it for thick, tall atmospheres (Titan-like: 300–400). |
| GroundAlbedo | 0.4 | How much light the ground bounces back into the air. Tint it to match the planet (rusty for Mars). |
| Air, Haze, Absorber, Fog, Sun, Clouds | Inputs from the nodes above. Clouds takes several wires. |
Example skies¶
These graphs ship as assets in /Metaplanets/Metaplanets/Sky (with
Metaplanets Creator) and as JSON in the plugin's Docs/examples/atmosphere
folder. Paste the JSON into a new graph with Paste JSON.
| Graph | Recipe |
|---|---|
| AG_Earth | Air, Haze, Ozone, Ground Fog and Sun at their defaults. Cumulus (Coverage 0.38) and Cirrus (0.25) in a Cloud Stack. |
| AG_Mars | Colored Scattering with Strength 3.2, WavelengthExponent -2.5, ScaleHeight 11.1, so the sky scatters red. Haze MarsDust at Density 0.3. Ground Fog tinted (0.85, 0.6, 0.4). Sun AngularRadius 0.18. No ozone. One thin Cirrus ice layer at 15–24 km, Density 0.008, bluish white. Output: AtmosphereHeight 120, rusty GroundAlbedo (0.45, 0.28, 0.16). |
| AG_HazyMoon | Titan-like. Air NitrogenMethane, Density 1.2, ScaleHeight 20, amber tint. Haze Smoke with HeightScale 8. Ozone band moved up to 60 km, 40 km wide, tinted to absorb red. Star Color 4,600 K into a large sun (AngularRadius 1.2). A warm Stratocumulus deck lifted to 8–14 km. AtmosphereHeight 400. |
| AG_Storm | Default Air and Ozone. Haze Density 2.4, HeightScale 1.4, cool tint. Thick Ground Fog (Density 0.09, ScaleHeight 0.5, Anisotropy 0.5). Cumulonimbus (Coverage 0.42) under Stratocumulus (0.55). |
| AG_Alien | Colored Scattering with WavelengthExponent 1.6 and a teal tint (0.35, 1.0, 0.78). Marine haze tinted violet. Strong ozone band tinted magenta. Star Color 9,500 K (blue-white). Cumulus and Cirrus with coloured MediumAlbedo. |
| AG_Canopy | A clear forest day: default Air and Ozone, light Haze (Density 0.45), faint low fog (Density 0.008) with strong sun shafts (Anisotropy 0.6), Cumulus 0.3 and Cirrus 0.2. |
Haze Density raised to 7: the horizon goes milky and the sun glow spreads. Haze is the quickest way to make a world feel humid, dusty or polluted.
Copy-paste JSON¶
This is AG_Earth. Copy it, open a new Atmosphere Graph and press
Paste JSON:
{
"format": "MetaplanetsAtmosphereGraph/1",
"nodes": [
{ "id": "air", "type": "Air", "pos": [-460, -320] },
{ "id": "haze", "type": "Haze", "pos": [-460, -120] },
{ "id": "ozone", "type": "AbsorbingLayer", "pos": [-460, 90] },
{ "id": "fog", "type": "GroundFog", "pos": [-460, 270] },
{ "id": "sun", "type": "Sun", "pos": [-460, 460] },
{ "id": "cu", "type": "CloudCumulus", "pos": [-900, -340], "values": { "Coverage": 0.38 } },
{ "id": "ci", "type": "CloudCirrus", "pos": [-900, 380], "values": { "Coverage": 0.25 } },
{ "id": "stack", "type": "CloudStack", "pos": [-460, 640] },
{ "id": "out", "type": "AtmosphereOutput", "pos": [60, 0] }
],
"links": [
{ "from": "air.Air", "to": "out.Air" },
{ "from": "haze.Haze", "to": "out.Haze" },
{ "from": "ozone.Absorber", "to": "out.Absorber" },
{ "from": "fog.Fog", "to": "out.Fog" },
{ "from": "sun.Sun", "to": "out.Sun" },
{ "from": "cu.Clouds", "to": "stack.Layers" },
{ "from": "ci.Clouds", "to": "stack.Layers" },
{ "from": "stack.Clouds", "to": "out.Clouds" }
]
}
And a Mars-like sky with Colored Scattering, dust and one high ice layer wired straight into the output:
{
"format": "MetaplanetsAtmosphereGraph/1",
"nodes": [
{ "id": "air", "type": "ColoredScattering", "values": { "Strength": 3.2, "WavelengthExponent": -2.5, "ScaleHeight": 11.1 } },
{ "id": "haze", "type": "Haze", "values": { "Type": "MarsDust", "Density": 0.3 } },
{ "id": "fog", "type": "GroundFog", "values": { "Density": 0.02, "ScaleHeight": 0.6, "Albedo": [0.85, 0.6, 0.4], "Anisotropy": 0.4 } },
{ "id": "sun", "type": "Sun", "values": { "AngularRadius": 0.18 } },
{ "id": "ice", "type": "CloudCirrus", "values": { "AltitudeInnerKm": 15, "AltitudeOuterKm": 24, "Coverage": 0.2, "Density": 0.008, "MediumAlbedo": [0.85, 0.92, 1.0] } },
{ "id": "out", "type": "AtmosphereOutput", "values": { "AtmosphereHeight": 120, "GroundAlbedo": [0.45, 0.28, 0.16] } }
],
"links": [
{ "from": "air.Air", "to": "out.Air" },
{ "from": "haze.Haze", "to": "out.Haze" },
{ "from": "fog.Fog", "to": "out.Fog" },
{ "from": "sun.Sun", "to": "out.Sun" },
{ "from": "ice.Clouds", "to": "out.Clouds" }
]
}
JSON format details
posis optional.idcan be any string; links refer to pins as"<id>.<Pin>".- Values are numbers, colours as
[r, g, b](or[r, g, b, a]), option names as strings ("MarsDust"), andtrue/falsefor on/off pins. - Missing values use the pin default, out-of-range numbers are clamped, and an unknown option falls back to the first one. An unknown node type fails the paste.
- Copy JSON writes every value as a string and uses generated ids. It looks different from hand-written JSON, but both paste back the same.
Building graphs from the command line¶
To build many skies from files (for example in a build script), compile JSON into assets headlessly:
UnrealEditor-Cmd MyProject.uproject -run=MetaplanetsAtmosphereGraph -json=C:/Skies/AG_Desert.json -out=/Game/Skies/AG_Desert -dump
-dump prints the compiled result to the log. Exit codes: 1 usage or file
error, 2 bad JSON, 3 compile failed, 4 save failed.
Tips for a believable sky¶
- Air, haze and fog set the planet's character far more than clouds do. Get the clear sky right first, then add clouds.
- Thin air (Density below 0.1) makes a dark sky and a sharp, small sun glow; thick air (above 3) makes a bright, washed-out sky and short views.
- To make a warmer or colder planet, change the star, not just the tints. A Star Color of 4,000–4,600 K warms everything, sky and terrain, consistently.
- Match GroundAlbedo to your terrain's average colour. It changes the colour of the haze near the ground.
- Check every sky at Ground, 12 km and Orbit, and at low sun elevations (0–10°). That is where scattering problems show.
Troubleshooting¶
| Message or symptom | Fix |
|---|---|
| the graph has no Atmosphere output node | Add the Atmosphere output node. |
| 'Node.Pin' expects A, got B | A wire connects mismatched types. Reconnect it. |
| the graph has a cycle through 'X' | Remove the loop between value nodes. |
| The sky has no colour | Nothing is wired into Air. |
| The sun colour in the level doesn't match the preview | The atmosphere follows the directional light. Set the colour there (see the note under Light). |
| Clouds sit inside mountains | Cloud altitudes are measured above sea level. Raise the layer's band on mountainous worlds. |