Essence - Cosmic Engine
A journey into the creation of a corner of the universe
Improving rocky planet surfaces and atmospheres in Essence – Cosmic Engine
Hi everyone, it has been a little while since our last devlog.
During this time, we have been working intensively on the new features presented in this article. One of the most common pieces of feedback we received about the previous version of the rocky planets was related to a curious colored band that appeared around the equator, regardless of the planet type.
After investigating the issue, we found a bug that was giving too much weight to some generation parameters, producing what looked almost like a planetary hula hoop. We fixed the problem, cleaned up the surface generation, and further optimized the surface shader.
However, the part that required the most time and effort was the atmosphere.
We wanted to give the atmospheres of our rocky planets a much more realistic and dynamic appearance. To do that, we started from the well-known open-source project WebGL Fluid Simulation by PavelDoGreat, available on GitHub, and spent a significant amount of time converting, adapting, and optimizing its real-time fluid simulation approach for our planetary pipeline.
Reference project: https://github.com/PavelDoGreat/WebGL-Fluid-Simulation
The result is finally something we feel satisfied with, and we hope you will find it interesting as well.
Of course, the final rendering of clouds and atmospheric structures can still be improved. In future steps, we would like to explore additional details such as cloud shadows, normal-based lighting, and more complex intra-cloud visual depth. For now, our main focus has been on realism, coherence, and performance.
With that in mind, this devlog focuses on two major improvements: cleaner rocky planet surfaces and a new GPU-driven atmosphere simulation system.
The first part of the update improves the generation of rocky planet surfaces. We removed the visual artifacts that were appearing around the equator on many planets and improved the rendering quality of icy regions, especially near the poles.
The second and more significant part of the update introduces a more advanced system for planetary atmospheres. Atmospheres are no longer treated as a simple visual layer placed on top of the planet. They are now driven by planetary profiles, animated at runtime, and simulated on the GPU through a fluid-like pipeline.
Together, these changes make rocky planets cleaner, more readable, and more coherent as complete celestial bodies.
Improved rocky planet surfaces and dynamic atmospheres.
Cleaner rocky planet surfaces
One of the most noticeable issues in the previous version of the rocky planet generator was the presence of artifacts around the equator.
These artifacts were especially problematic because they appeared across different planet types. It did not matter whether the planet was dry, icy, oxidized, or atmosphere-rich: the same visual defect could appear in the same general region.
This broke the illusion of a naturally generated planet.
Even when the color palette, terrain distribution, atmosphere, and climate regions were working well, the equatorial artifact made the surface feel artificial. It was a reminder that the planet was being generated from a texture pipeline rather than emerging as a coherent world.
In this update, we fixed that issue.
The rocky planet surfaces are now much cleaner, with no recurring artificial band around the equator. This is particularly important because planets in Essence are not static images. They rotate, they are observed from different angles, and their surface must remain believable as a continuous spherical body.
The equatorial artifacts have been removed from the rocky planet surface generation.
Better polar ice and frozen regions
The second surface improvement concerns icy regions.
In the previous version of the pipeline, ice coverage was already part of the planetary signature and climate system. However, the visual result was not always strong enough, especially near the poles.
The polar areas could sometimes appear too flat, too noisy, or not clearly separated from the surrounding terrain. For planets with a high ice coverage value, this was a problem: the planet was technically cold, but the visual result did not always communicate that state clearly.
We improved the rendering quality of frozen regions, with particular attention to polar ice.
The result is a more readable distinction between cold areas, frozen caps, and the rest of the surface. Icy planets now communicate their thermal state more effectively, while partially frozen planets show clearer transitions between temperate and glacial regions.
This is important because ice should not look like a simple white overlay. It should feel like a consequence of the planet’s climate.
A frozen world should be readable at a glance.
A dry planet with limited polar ice should still preserve its own identity.
A cold rocky planet should show ice as part of its environmental logic, not as a decorative texture.
Polar ice regions are now sharper, more readable, and better integrated with the planet surface.
Atmosphere as part of the planet
The largest update in this devlog is the new rocky planet atmosphere system.
Previously, the atmosphere was mostly a visual component. It provided rim lighting, color, density impression, and an external shell around the planet. This already helped planets feel more complete, but it was still too disconnected from the deeper planetary profile.
Now the atmosphere is treated as part of the planet’s identity.
The system is built as a three-layer pipeline:
– data profiles
– runtime animation
– GPU fluid simulation
This means that the atmosphere is not just rendered. It is configured, animated, and evolved over time.
The goal is to connect the atmosphere with the same logic that drives the surface, climate, and planetary classification. A rocky planet should not have an atmosphere that feels randomly placed on top of it. Its atmosphere should be consistent with its profile, its climate, and its physical state.
A dry desert planet should not behave like a Titan-like world.
An almost airless rocky body should not produce the same atmospheric movement as a dense, hazy planet.
An icy planet should not communicate the same visual and dynamic behavior as a volcanic rocky body.
This is the direction we are now building toward.
Profile-driven atmospheric behavior
The first layer of the new atmosphere system is based on planetary profiles.
Each rocky planet profile can define both visual and simulation-related values. This is a key point: a profile does not only describe how the atmosphere looks, but also how it behaves.
The profile can control values such as:
– atmospheric colors
– density response
– density diffusion
– velocity diffusion
– pressure
– vorticity
– splat count
– splat lifetime
– persistent source response
– source radius and intensity
This allows different rocky planet archetypes to generate different atmospheric behaviors.
A dense atmosphere can be more diffuse and visually present.
A thin atmosphere can remain subtle and almost transparent.
A volcanic world can generate stronger, more localized atmospheric sources.
An icy world can use colder colors and softer atmospheric motion.
A dry desert planet can show weaker or more rarefied cloud-like structures.
The atmosphere therefore becomes a procedural consequence of the planet profile.
This is important for *Essence* because planets are not meant to be manually authored one by one. They are generated from data, profiles, and simulation parameters. The system must be able to produce coherent results automatically.
Planet Profile Atmosphere
From a technical point of view, the core data structure behind this system is the PlanetProfileAtmosphere unity component.
This class acts as a unified container for both the visual and simulation parameters of the atmosphere.
This is important because visual rendering and simulation behavior need to evolve together. If these systems were separated, it would be easy to create inconsistent results: for example, an atmosphere that looks dense but behaves as if it were thin, or an atmosphere that looks almost absent but still produces strong fluid motion.
By keeping these values in the same profile, the system can interpolate them coherently.
When a rocky planet blends multiple profiles, the atmosphere can blend:
– colors
– density
– diffusion
– pressure
– vorticity
– solver parameters
– splat behavior
– persistent source response
This makes the atmospheric system more predictable and more consistent with the generated planet.
The profile is not only a rendering preset. It is a behavioral description of the atmosphere.
Animated persistent splats
The second layer of the atmosphere pipeline is runtime animation.
Atmospheric sources are represented through animated persistent splats. These are not simple static points on a texture. They are time-based sources that can evolve across the planet surface.
Each AnimatedPersistentSplat can animate several properties:
– UV position
– direction
– force
– radius
– density
– lifetime
– easing behavior
This makes it possible to create atmospheric sources that move, grow, fade, change direction, or vary their intensity over time.
A persistent splat can represent a recurring atmospheric region, a localized source, a drifting structure, or a dynamic input into the simulation.
One important detail is how these splats move across the equirectangular texture.
Planetary maps wrap horizontally. This means that an atmospheric source can cross the seam between the right and left edges of the texture. If this is not handled correctly, the source appears to jump suddenly from one side to the other.
The system now interpolates UV coordinates across the equirectangular wrap, allowing splats to cross the seam smoothly.
This is a small technical detail, but it is essential for planets. The atmosphere must feel continuous around the sphere.
GPU fluid simulation
The third layer is the GPU simulation.
The atmospheric solver was built starting from the WebGL Fluid Simulation project by PavelDoGreat, which we used as a reference for the core real-time fluid simulation approach.
Reference project: https://github.com/PavelDoGreat/WebGL-Fluid-Simulation.
From there, the system was heavily adapted to work inside Unity and to fit the specific needs of planetary atmospheres. The original real-time fluid simulation approach was converted into a compute-shader-based pipeline using RenderTextures, structured buffers, equirectangular wrapping, planetary profiles, and map-guided atmospheric sources.
Each frame, the atmosphere controller collects different types of atmospheric input:
– persistent splats
– queued splats
– random bursts
– profile-driven sources
These inputs are converted into structured data and sent to the compute shader.
The simulation then updates velocity and density fields using a fluid-like pipeline:
– curl
– vorticity
– divergence
– pressure solve
– gradient subtract
– advection
This gives the atmosphere motion and persistence over time.
The system uses ping-pong render textures to evolve the fields frame by frame. It also uses structured buffers to send splat data efficiently to the GPU.
Velocity and pressure can be simulated at a different resolution from the final density texture. This is useful because not every part of the simulation needs the same level of detail.
The final density texture must be readable on the planet surface.
Velocity and pressure can often run at a lower resolution to reduce cost.
This separation is important for scalability, especially because *Essence* may need to handle multiple celestial bodies with different levels of detail.
The GPU is therefore not only used to render the atmosphere. It actively evolves the atmospheric state.
Surface-guided atmospheric sources
A key improvement is that atmospheric sources are not placed completely at random.
The system can select candidates for persistent splats by sampling the maps generated for the planet:
– height
– heat
– moisture
This allows atmospheric sources to appear in more believable regions.
Warm and humid areas can become stronger candidates for atmospheric activity.
Mountainous regions can influence cloud-like structures and localized patterns.
Dry or cold areas can produce weaker or different responses.
This creates a stronger relationship between the planet surface and the atmosphere above it.
The atmosphere is not a generic animated texture. It is influenced by the world underneath.
This connection is especially important for the long-term direction of the project. Planets in Essence should not be assembled from disconnected layers. Their surface, climate, ice, and atmosphere should all describe the same planetary condition.
Current result and next steps
With this update, rocky planets in Essence are becoming more coherent as complete celestial bodies rather than simple textured spheres with an atmospheric layer added on top.
Cleaner surface generation, the removal of equatorial artifacts, improved polar ice rendering, and the new GPU-driven atmosphere pipeline all work toward the same goal: making each planet visually readable through its surface, climate, ice, haze, clouds, and atmospheric behavior.
This foundation will continue to evolve with further tuning of atmospheric patterns, profile blending, lighting, performance, and multi-planet scalability.
Most importantly, the work done on rocky atmospheres now prepares the next major step of the planetary pipeline: extending the same simulation-driven approach to the atmospheres of gas giants, where dynamic bands, large-scale flows, storms, and layered atmospheric structures will become central elements of the planet’s identity.
