Skip to content
Back to projects

Featured Project 01 / Graphics / Systems

BLACK HOLE SIMULATION

Rust • OpenGL • GLSL • WebAssembly/WebGL2 • egui

Native + desktop web demo

Project insight

Overview

Black Hole Simulation is a stylized real-time renderer that visualizes a Kerr-like black hole approximation with interactive graphics controls.

Problem

The project explores how shader-based lensing and post-processing can produce an interactive black-hole visualization across native and browser targets.

My Contribution

Built the Rust renderer, custom GLSL shader pipeline, camera and rendering controls, and native and WebAssembly/WebGL2 targets.

Black hole renderer showing gravitational lensing, an accretion disk, and interactive rendering controls

Main Technologies

  • Rust
  • OpenGL
  • GLSL
  • WebAssembly
  • WebGL2
  • glow
  • glutin
  • winit
  • egui

Key Technical Decisions

  • Used custom GLSL shaders for the black-hole effect, bloom, lens flare, and tonemapping passes.
  • Used glow with glutin and winit for OpenGL rendering and window/input handling.
  • Maintained native and WebAssembly/WebGL2 targets so the renderer can run locally or in a browser.

Challenges and Solutions

Supporting the same visual project across native and browser graphics environments.
Separated platform setup from the shared rendering work and targeted OpenGL natively and WebGL2 through WebAssembly.
Keeping a shader-heavy scene understandable while tuning its visual output.
Added egui controls for camera, lensing, accretion-disk, bloom, and tonemapping settings.

Outcome

Published native and WebAssembly targets with a desktop browser demo, mouse/front/top/auto-orbit camera modes, and adjustable lensing, disk, and bloom settings.

Limitations / Verification Boundary

  • A stylized Kerr-like approximation, not a geodesic solver or validated physics simulation.
  • Native OpenGL uses HDR render targets; browser WebGL2 uses RGBA8, so effects and performance differ.
  • The external demo is desktop-only and loads approximately 23 MB of WebAssembly; it is not an embedded mobile experience.
  • There is no pause control in the renderer.

Evidence / Sources