BioFluidSim UE5

BioFluidSim UE5

BioFluidSim UE5

Ever observed bioluminescence? This project was built to explore a GPU-driven fluid simulation approach to simulating reactive bioluminescent emission (following decay rates of Lingulodinium polyedrum). Built in Unreal Engine, the system holds a 1.36ms game thread cost against ~2.77ms for a leading commercial solution at matched scale.


Contributions:

  • Dual-resolution Eulerian Fluid Solver Architecture

  • Biologically Parameterized Emission Model

  • Comparative GPU pipeline evaluation


Thesis awarded High Honors in Computer Science, Dartmouth College.

Ever observed bioluminescence? This project was built to explore a GPU-driven fluid simulation approach to simulating reactive bioluminescent emission (following decay rates of Lingulodinium polyedrum). Built in Unreal Engine, the system holds a 1.36ms game thread cost against ~2.77ms for a leading commercial solution at matched scale.


Contributions:

  • Dual-resolution Eulerian Fluid Solver Architecture

  • Biologically Parameterized Emission Model

  • Comparative GPU pipeline evaluation


Thesis awarded High Honors in Computer Science, Dartmouth College.

Ever observed bioluminescence? This project was built to explore a GPU-driven fluid simulation approach to simulating reactive bioluminescent emission (following decay rates of Lingulodinium polyedrum). Built in Unreal Engine, the system holds a 1.36ms game thread cost against ~2.77ms for a leading commercial solution at matched scale.


Contributions:

  • Dual-resolution Eulerian Fluid Solver Architecture

  • Biologically Parameterized Emission Model

  • Comparative GPU pipeline evaluation


Thesis awarded High Honors in Computer Science, Dartmouth College.

Type

UE5, Simulation, Fluid Solver

Type

UE5, Simulation, Fluid Solver

Development

6 months

Development

6 months

Reading Time

~ 1 minute

Reading Time

~ 1 minute

Written

06.19.26

Written

06.19.26

Real-Time Simulation of Bio-luminescent Light Propagation using Compute Shaders within Unreal Engine 5

Real-Time Simulation of Bio-luminescent Light Propagation using Compute Shaders within Unreal Engine 5

Figure 1: Snapshot of BioFluidSim etc.

Figure 1: Snapshot of BioFluidSim etc.

Why BioFluidSim?

Why BioFluidSim?

Current real-time fluid solutions either prioritize physically based simulation without biologically accurate bioluminescent emission, or they produce visually convincing bioluminescence without simulating the underlying fluid dynamics. In profiling FluidNinjaLive, a commercialized product, showed its simulation running on the GameThread, indicating a CPU-bound implementation. BiofluidSim was designed to address both limitations by implementing a GPU-native fluid simulation that directly couples biologically parameterized light emission with the simulated velocity field, enabling physically driven bioluminescent behavior in real time.

Current real-time fluid solutions either prioritize physically based simulation without biologically accurate bioluminescent emission, or they produce visually convincing bioluminescence without simulating the underlying fluid dynamics. In profiling FluidNinjaLive, a commercialized product, showed its simulation running on the GameThread, indicating a CPU-bound implementation. BiofluidSim was designed to address both limitations by implementing a GPU-native fluid simulation that directly couples biologically parameterized light emission with the simulated velocity field, enabling physically driven bioluminescent behavior in real time.

Figure 2: Unreal Insights trace of FluidNinjaLive

Figure 2: Unreal Insights trace of FluidNinjaLive

System Architecture

System Architecture

The simulation is composed of four cooperative subsystems: The Detection Component, Tracking Manager, BioFluidSim Manager, and Landscape Manager.

The simulation is composed of four cooperative subsystems: The Detection Component, Tracking Manager, BioFluidSim Manager, and Landscape Manager.

Figure 3: BioFluidSim Infrastructure Diagram

Figure 3: BioFluidSim Infrastructure Diagram

Detection Component (DC) — An actor component that can be attached to any physical object capable of disturbing the fluid surface. It measures surface tension (ST) data and sends it to the Tracking Manager for encoding.


Tracking Manager — Serves as the encoding and rate-limiting layer between the Detection Components and the fluid solver. It stores each object's location, velocity, and depth in an RGBA texture map.


BioFluidSimulation Manager — Manages the overall fluid simulation and light propagation system. It owns the Niagara Grid2D instance responsible for executing the GPU compute pipeline.


The Landscape Manager — Handles the projection and visualization of the simulation onto the environment, ensuring the computed fluid and bioluminescent effects are correctly represented within the scene.

Detection Component (DC) — An actor component that can be attached to any physical object capable of disturbing the fluid surface. It measures surface tension (ST) data and sends it to the Tracking Manager for encoding.


Tracking Manager — Serves as the encoding and rate-limiting layer between the Detection Components and the fluid solver. It stores each object's location, velocity, and depth in an RGBA texture map.


BioFluidSimulation Manager — Manages the overall fluid simulation and light propagation system. It owns the Niagara Grid2D instance responsible for executing the GPU compute pipeline.


The Landscape Manager — Handles the projection and visualization of the simulation onto the environment, ensuring the computed fluid and bioluminescent effects are correctly represented within the scene.

Biological Emission Model

Biological Emission Model

Bioluminescent dye is injected whenever the contact density exceeds the activation threshold, representing the mechanosensory activation threshold of Lingulodinium polyedrum. The dye color is interpolated between DyeColor and HighSpeedColor based on the normalized contact density.


Higher contact densities represent stronger disturbances to the fluid. Biologically, stronger disturbances activate more dinoflagellates within a given area, producing brighter localized emission around the species' characteristic peak wavelength of 474–480 nm.

Bioluminescent dye is injected whenever the contact density exceeds the activation threshold, representing the mechanosensory activation threshold of Lingulodinium polyedrum. The dye color is interpolated between DyeColor and HighSpeedColor based on the normalized contact density.


Higher contact densities represent stronger disturbances to the fluid. Biologically, stronger disturbances activate more dinoflagellates within a given area, producing brighter localized emission around the species' characteristic peak wavelength of 474–480 nm.

Visualization Buffer Output (RGBA)

Visualization Buffer Output (RGBA)

Four auxiliary render targets are written from the niagara grid pipeline for development visualization, with no effect on simulation state

Four auxiliary render targets are written from the niagara grid pipeline for development visualization, with no effect on simulation state

Figure 4: Density Buffer — raw dye color and luminance, showing where trails were injected and how they dissipate as they advect

Figure 4: Density Buffer — raw dye color and luminance, showing where trails were injected and how they dissipate as they advect

Figure 5: Velocity Buffer — red and green encode horizontal and vertical direction (yellow base color is resting state)

Figure 5: Velocity Buffer — red and green encode horizontal and vertical direction (yellow base color is resting state)

Figure 6: Divergence Buffer — the divergence of the velocity field. Values remaining near zero confirm that the fluid remains effectively incompressible.

Figure 6: Divergence Buffer — the divergence of the velocity field. Values remaining near zero confirm that the fluid remains effectively incompressible.

Figure 7: Pressure Buffer — greyscale pressure field. Concentric rings propagating outward confirm the Jacobi solver is resolving pressure waves correctly

Figure 7: Pressure Buffer — greyscale pressure field. Concentric rings propagating outward confirm the Jacobi solver is resolving pressure waves correctly

Additional Use Cases

Additional Use Cases

Since dye color and viscosity coefficients are both runtime parameters, the same system supports non-biological color palettes and higher-viscosity fluids without any HLSL changes.

Since dye color and viscosity coefficients are both runtime parameters, the same system supports non-biological color palettes and higher-viscosity fluids without any HLSL changes.

Figure 8: Parameter Overrides simulating different color mappings (fire, rainbow) and fluid behaviors (snow)

Figure 8: Parameter Overrides simulating different color mappings (fire, rainbow) and fluid behaviors (snow)

Performance

Performance

For a fair comparison, BioFluidSim was downscaled to match the dimensions of the commercial solution's (FluidNinja) demo scene. BioFluidSim also uses the same material instances provided with FluidNinja to isolate the cost of the simulation itself. All performance metrics were captured using stat unit under these matched conditions with 30 Jacobi iterations, a 256 × 256 simulation grid, and a 512 × 512 dye grid.

For a fair comparison, BioFluidSim was downscaled to match the dimensions of the commercial solution's (FluidNinja) demo scene. BioFluidSim also uses the same material instances provided with FluidNinja to isolate the cost of the simulation itself. All performance metrics were captured using stat unit under these matched conditions with 30 Jacobi iterations, a 256 × 256 simulation grid, and a 512 × 512 dye grid.

Figure 9: BioFluidSim (full 16-stage compute Navier-Stokes solver)

Figure 9: BioFluidSim (full 16-stage compute Navier-Stokes solver)

Figure 10: FluidNinja Live (commercial fragment-shader fluid solution)

Figure 10: FluidNinja Live (commercial fragment-shader fluid solution)

At matched scale, BioFluidSim holds a lower game thread cost (1.36ms vs ~2.77ms), draw thread cost (2.73ms vs 3.10ms), and memory footprint (2.5GB vs 2.8GB). FluidNinja's lighter fragment-shader approximated approach gives it the edge on raw GPU steady-state cost (1.8ms vs 2.35ms) and draw calls (90 vs 160).

At matched scale, BioFluidSim holds a lower game thread cost (1.36ms vs ~2.77ms), draw thread cost (2.73ms vs 3.10ms), and memory footprint (2.5GB vs 2.8GB). FluidNinja's lighter fragment-shader approximated approach gives it the edge on raw GPU steady-state cost (1.8ms vs 2.35ms) and draw calls (90 vs 160).

Thank You for Playing!

Jaden Halevi

jadenhalevi@gmail.com

Jaden Halevi

Thank You for Playing!

Jaden Halevi

jadenhalevi@gmail.com

Jaden Halevi

Thank You for Playing!

Jaden Halevi

jadenhalevi@gmail.com

Jaden Halevi