
Welcome to my personal blog, hope what you find here is at your interest
Real-time global illumination using a precomputed voxel-based radiosity pipeline. Form factors are precomputed via GPU ray marching and stored as a sparse matrix; per-frame GI reduces to a single SpMV dispatch on the GPU. Includes a novel specular writeback path (SD*).
Read more →Development and optimization of a parallel voxelization engine built on Diligent Engine. Benchmarks four storage models (flat grid, 3D grid, Octree, cached Octree) and a multithreaded voxelization algorithm with near-linear speedup.
Read more →3D layout and visualization tool for large power-law networks, built with OpenGL. The Treecapitator algorithm places nodes in reverse degree order to avoid the central-clutter problem of standard layout algorithms. Handles graphs in the millions of nodes.
Read more →A small TypeScript framework for embedding pannable/zoomable canvas demos directly in blog posts: a 2D stage, drawing utilities, a GUI system, and linear algebra helpers, compiled to a single koala.js bundle.
Read more →A native Linux equivalent to Wallpaper Engine. Runs GLSL fragment shaders as live animated desktop wallpapers, integrated at the X11 compositor level with Shadertoy-compatible uniforms.
Read more →Dynamics simulator for solving user-defined static equilibrium problems. Interactive graphical environment with support for joints, motors, springs, pulleys, and water simulation. Built in Java with LibGDX.
Read more →I built Koala to scratch a specific itch: I wanted interactive math and graphics demos embedded directly in blog posts, without reaching for a heavy library or fighting a general-purpose game engine. The result is a small TypeScript framework that sits on top of the browser Canvas API and gives you a pannable/zoomable 2D stage, a few drawing utilities, a GUI system, and some linear algebra helpers. It compiles to a single koala.js bundle.
Adrian is a small demo I made inside Detramotor to play with curl noise. Named after the planet Adrian from Project Hail Mary, a greenish gas giant. The original plan was to recreate that swirling atmospheric look, but I couldn't quite get there, so it ended up as more of a lava planet. This was my first crack at curl noise, so the implementation is more "looks about right" than mathematically rigorous, but I'm happy with it as a first version. I plan to do a proper gas giant version in a future post.
So I built a particle system for Detramotor (my Vulkan engine) and I think it turned out pretty neat. The idea is simple: keep all the particle data on the GPU, simulate it there with compute shaders, and render it without the CPU ever touching individual particles. It also has a CPU fallback for when you want manual control. Here's what it looks like in action:
A few weeks ago, working on a Diligent project, I needed something fairly common in graphics rendering that many people have run into: using multiple textures.
If you have used OpenGL you probably think this is straightforward. Your textures end up as uniforms in the shader like this:
This is an intermediate chapter to show you the basic structure of a CUDA program for path tracing. It covers uploading the necessary data to the GPU (models, textures, etc.), rendering to a framebuffer, and downloading the result back to the CPU. Think of it as learning how to write custom fragment shaders in pure C, but running on the GPU.
Programming a ray tracer is a classic exercise to learn both GPU programming and the fundamentals of light simulation. It only requires some knowledge of C++ and basic linear algebra, so it is a great entry point into CUDA graphics programming.
This is a concurrency problem I found interesting while working with multi-threaded C++. I would say it sits at an intermediate level (easy enough to reason about, but subtle enough that a naive solution breaks under scrutiny).
You have a shared resource accessed by two kinds of threads: readers and writers. The rules are simple:
First WebGL particle system, built with three.js. A branching random walk with geometric step decay grows a sunflower-like point cloud in real time.
Launch →LIVE DEMOProcedural city generator based on random recursive AABB quadtree subdivision. Renders extruded building blocks in Babylon.js alongside a 2D debug view of the partition tree.
Launch →