Skip to content

rubenaryo/Cumulus

Repository files navigation

Cumulus

A DirectX 12 project for real-time enabled cloud simulation and interactivity.

Made by Ruben Young Jacky Park Eli Asimow and Avi Serebrenik, Fall 2025

Project Document Milestone 1 Presentation

image
Camera flying in to a cloud

Overview

At its core, Cumulus is a realtime DirectX 12 cloud renderer with collisions, GPU generated clouds, and a clear environment.

We utilize the cloud rendering framework from the Horizon game series, as outlined in the Nubis 3 presentation from Advancements in Real-Time Rendering 2023. We then advance this method by incorporating interaction, allowing users to feel as though the clouds are truly part of the environment. Since the Nubis method uses offline modeled clouds, to enable interaction, we generate cloud data procedurally on the GPU to support our framework. This enables us to create more dynamic scenes, where we can smoothly transition between different weather conditions, resulting in true, realistic, and real-time cloudscapes.

Current Features

Clouds

image
A nice cloud in our engine

Rendering

  • World-space NVDF placement — volumes positioned consistently in world coordinates
  • Ray-marched rendering — integrates density with Beer–Lambert absorption/compositing
  • SDF-guided stepping — signed-distance field cached in 3D textures to skip empty space
  • Noise-based Details — Additional details at 0.5m scale using Alligator and "Curly-Alligator" noise

Generation

image
A cloud created in a compute shader

  • We support procedurally creating cloud NVDF data in a compute shader pass. However, this is a recent addition, and the set noise and detail values still need to be finetuned for a more realistic look.
  • Creation starts by initializing cloud "seeds" on the CPU side, which become world-space coordinates where clouds get initialized. These positions can be updated to show cloud movement and formation.
  • For each seed, we create an SDF (given by Inigo Quilez's blog) that is a simple round cone with "Vesica Segments" aka football shapes around them. The number of these shapes, their size, and the orientation of all of these is given by noise.
  • Next, based on this SDF, we create density values. Importantly, these values must slowly ease in, so we don't see the edge of the sdf shapes.
  • Finally, density type and shape profile are also generated with some added noise.

Engine

Core

  • Atmosphere rendering pass
  • Compute Shader pipeline for ray-marching
  • Post-processing pipeline
  • Automated loading of models/textures from files
  • Construction of 3D NVDF data fields for the core Nubis method, 3D textures for atmosphere

Extra Features

  • String-based, shader-driven resource binding for easy user experience
    • Driven by ID3D12ShaderReflection
  • Rendering is abstracted into a “Pass” framework,
    • Automatically generates Root Signatures and Pipeline States (shader-driven)
  • Upload Buffer system for staging CPU data temporarily before copying to the default heap
  • Automatic lifetime reporting for catching memory leaks in Debug mode
  • Diligent error detection and logging
  • ImGUI integration

Collision

image
Dynamic Convex Hull of a teapot

  • Convex Hull object bounds
  • Managed via several structured buffers on GPU – built to be dynamic as meshes update position / animation
Recording.2025-11-24.133249.mp4
  • Compute Shader: Modify Density Texture when cell collides with convex hull

Atmosphere

image
Sunrise

  • Based on Eric Bruneton's Precomputed Atmospheric Scattering
  • Skips precompute to read from offline Irradiance, Scattering, and Transmission textures
  • Blends Polar and Cartesian camera models
  • Day and night cycle with selectable time of day
  • Fully calculated in a pre-pass with raycasting
  • Added moon and night time sky.
  • Daytime can be modified in the UI to set sun position.

Building

This project uses the Premake 5 build system, which is bundled with the application and the executable can be found under ./external/

To generate a Visual Studio solution, simply run generate_vs2022.bat on Windows. This will:

  • Generate a "Cumulus.sln" solution file
  • Generate and configure the VS projects specified under ./premake5.lua
  • Any Source/Header Files in the specified folder will be automatically added to the corresponding project. It is not necessary to modify the lua build script if adding a new file.

Details

This project is built using MSVC with the Visual Studio 2022 toolset (v143) for the C++17 standard.

Dependencies

Bloopers

image
Broken Atmospheric Scattering

image
Broken Camera Matrix while working on Atmospheric Scattering

About

A DirectX 12 project for real-time enabled cloud simulation and interactivity.

Resources

Stars

Watchers

Forks

Contributors 4

  •  
  •  
  •  
  •  

Languages