
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!
Thank You for Playing!
Thank You for Playing!

