Graphics Archive

Projects & Experiments

A collection of graphics projects, rendering experiments, and engine work from over the years.

Professional & Shipped Film, engine, and platform work I contributed to on the job.

Godot for XBOX on PC - Microsoft

Contributed to the public XBOX Godot sample - a source-only reference showing how to build a Godot GDExtension that integrates the Microsoft GDK, XBOX Services, and PlayFab. Covers platform services, sign-in, PlayFab Core, Multiplayer, and Game Saves, plus a GameInput bridge into Godot's Input/InputMap, so developers can ship to XBOX on PC without leaving the engine. The open-source samples cover roughly 85% of the XBOX SDK surface. Separately, I've contributed upstream to Godot itself - fixing a GLSL shader-generation bug in the refraction-normal path and working with the physics and rendering teams on Vulkan and physics-server regressions.

GodotGDExtensionModern C++Microsoft GDKPlayFabGameInput
Source → Announcement →
Godot editor running the XBOX GDK sample Microsoft GDK packaging wizard inside Godot Introducing the XBOX Godot Sample banner

The Wild Robot - Feature Film

Credited for two roles: started as the first Lighting TD on production, building the show's custom tooling, then promoted to lighting tools engineer across the studio. Some of that tooling drives the film's painterly look - a layered extension of the Cryptomatte format that stores per-asset IDs, coverage, position and normals across depth layers, so precise CG renders can be filtered into hand-painted brushstrokes. Process via befores & afters.

HoudiniNukePythonPyQT5CryptomatteUSDVEX
The Wild Robot painterly tool: precise CG render of Roz beside the filtering panel The Wild Robot painterly tool: layered-Cryptomatte ID pass The Wild Robot painterly tool: brushstroke filter with pattern library The Wild Robot: final painterly composite of Roz and Brightbill

Trolls Band Together - Feature Film

Lighting TD responsible for maintaining department tools studio-wide and show-specific. Focused on optimizing rendering pipelines and day-to-day artist shot support.

HoudiniNukePythonPyQT5USDVEX

The Bad Guys 2 - Feature Film

Lighting tools engineer on the sequel, building and extending show-specific tooling for the lighting department. Developed automation for look development and surfacing workflows to accelerate artist iteration across sequences.

HoudiniNukePythonPyQT5USDVEX

Forgotten Island - Feature Film

Lighting tools engineer supporting production pipeline and tooling needs. Built and maintained lighting department tools, focusing on pipeline reliability and workflow improvements for the show's lighting and LookDev teams.

HoudiniNukePythonPyQT5USDVEX

World of Warcraft - Dragonflight

Contributed to graphics systems on the game engine team, including an innovative GPU compute particle system enabling artists to create high-fidelity VFX with fewer performance constraints.

DirectX 11/12HLSLModern C++Dear ImGuiRenderDoc
World of Warcraft →

Writing & Notes Technical write-ups and deep dives - full articles on the blog.

Iris: reconstructing a street as 3D Gaussian splats

One twenty-second nuScenes drive - six cameras and a 32-beam LiDAR through Boston - rebuilt into a navigable 3D world. LiDAR for geometry, cameras for colour, a Depth-Anything-V2 prior to fill the gaps, SegFormer masks to delete the sky and the traffic, PCA-oriented Gaussians sliced into geo-anchored tiles, and a three.js/WebGL2 viewer you can fly through at 60 fps. Plus an honest account of what's still rough.

Gaussian Splatting3D ReconstructionLiDARComputer Vision
Read article →

neural deferred shading: shading Sponza at 64 FPS with an 11k-parameter network, in Metal

A from-scratch Apple Metal path tracer becomes a data factory for neural rendering: cast one primary ray per pixel, keep the cheap G-buffer, and let a tiny MLP - compiled into a Metal compute kernel - synthesize the fully globally-illuminated frame at frame rate. Plus a screen-space U-Net, temporal reprojection, and a directly-measured "one ray ≈ 68 samples" amplifier.

Apple MetalNeural RenderingPath TracingSwift
Read article →

aircoder: a local coding agent that externalizes its memory to disk

How a nine-crate Rust agent drives a small local LLM through hour-long coding tasks by treating the model as stateless and a content-addressed SQLite ledger as its working memory - bounded context, crash-resumable, fully auditable.

RustLocal LLMAgentsSystems
Read article →

metalstream: running a 31B model on a 16 GB laptop

A drop-in MLX add-on that streams model weights off NVMe so an 18.4 GB model produces tokens on a 16 GB M4 Air - plus the phase-by-phase investigation, with real benchmarks, that proved every step before taking it.

PythonMLXApple MetalLLM Inference
Read article →

Mandelbrot Fractals in OpenGL

Rendering Mandelbrot fractals using the OpenGL Core Profile - covering the math, the shader implementation, and the GPU-accelerated results.

OpenGLC++GLSLMath
Read article →

Independent Projects & Experiments Self-directed R&D, prototypes, tools, and from-scratch rendering studies.

aircoder - Local Agentic Coding Agent

A nine-crate Rust workspace that drives a local LLM through hour-long coding tasks by externalizing all working memory to a content-addressed ledger on disk. Every observation becomes typed evidence - file reads, diagnostics, test results, decisions - queried by predicate instead of re-read from the prompt, so the context window stays nearly empty. Every step is a checkpoint: a SIGINT or kill -9 mid-task resumes byte-for-byte. Closes a real local-model loop against mlx_lm.server, with 94 tests passing.

RustLocal LLMMLXAgentic SystemsContent-Addressed Storage
Read the write-up →

metalstream - MLX Weight-Streaming Substrate

A drop-in MLX add-on that streams model weights off NVMe so a 31B-parameter Q4 model (18.4 GB on disk) produces tokens on a 16 GB M4 MacBook Air - beneath a 10.67 GiB Metal working-set cap that is half the model's size. The GPU only ever sees the layer it needs; peak Metal pool holds around 22% of the cap, with bit-identical numerical equivalence to the non-streaming baseline. A persistent buffer pool eliminates the substrate's eviction-path overhead.

PythonMLXApple MetalSystemsLLM Inference
Read the write-up →

Iris - Automotive Digital Twin

A real-time 3D digital-twin viewer for a vehicle-sensor concept, built in React-Three-Fiber. Renders live 3D Gaussian-splat scenes with tile streaming and frustum culling, a neural ONNX post-processing pass, a procedural city, lidar halos, tracked objects and twins, and a driving ego vehicle - targeting WebGPU with Metal and Vulkan back-ends. Built over comma.ai's openpilot as the sensor substrate.

React Three FiberWebGPUGaussian SplattingONNXThree.js
Real-time 3D Gaussian-splat reconstruction of a city street in the Iris twin view

GridLock - City Traffic & Transit Sim

A 2.5D isometric city-flow game in Godot 4 - no zoning or services, only moving people through a city. Roughly 3,900 lines of GDScript across sandbox, puzzle, and real-time dispatch modes. Placement happens on a tile grid, but the simulation runs on a derived graph - intersections and stops as nodes, lanes, tracks, and sidewalks as edges - rebuilt incrementally on every edit. A fixed 20 Hz tick drives pooled car, pedestrian, bus, train, and cyclist agents over congestion-reactive multi-modal A*.

Godot 4GDScriptSimulationMulti-Modal A*Isometric
Isometric city with road grid, colored districts, and transit HUD in GridLock

Photogram - Image-to-3D Compositing

An FX/lighting compositing prototype that reconstructs any RGB plate metrically with Apple SHARP (3D Gaussian splatting), then comps 3D assets into the scene with accurate scale, depth-correct occlusion, and transferred lighting. Assets are dreamed from a reference image or from the plate itself via SAM 2 segmentation and TripoSR, fit against an ambient-plus-directional lighting solve. A three-tab Gradio UI exports a camera-matched preview and a combined GLB; runs on Apple Silicon MPS.

PythonPyTorchGaussian SplattingSAM 2TripoSRGradio

Bonsai NPCs - In-Process LLM Agents

A Godot 4.6 sandbox where 7-10 NPCs are driven by a local 1-bit LLM (PrismML's Bonsai) running entirely in-process through a custom GDExtension that vendors a llama.cpp fork. NPCs hold long-term memory, form bonds and grudges, and gossip when they cross paths - a Hitman-style level where you exploit the emergent NPC reasoning to pull off an objective.

Godot 4.6GDExtensionllama.cppModern C++Local LLM

Splatty - Gaussian Splat Viewer

A real-time 3D Gaussian Splatting viewer built from scratch in C++ and DirectX 12. Implements a full DX12 compute pipeline, a PLY loader for standard and SuperSplat-compressed formats with chunk-based dequantization, spherical-harmonic evaluation up to degree 3, and an auto-positioning FPS camera - loading reconstructed scenes of 200k+ Gaussians.

DirectX 12HLSLModern C++Compute ShadersGaussian SplattingDear ImGui
Real-time Gaussian splat reconstruction of an observatory

PrintSim - FDM Printer Simulator

A browser-based, physically based FDM/FFF 3D-printer simulator. Loads real Marlin .gcode and simulates extrusion end-to-end: trapezoidal motion planning with junction-deviation cornering, voxel deposition, thermal diffusion, polymer bond healing, and corner-lift warping - with G-code parsing and motion planning offloaded to Web Workers.

TypeScriptThree.jsWebGL2Web WorkersVitePhysical Simulation
Physically based FDM 3D printer simulator with live thermal model

mapz - Urban Design Simulation

A CAD-like urban-design game played on real-world streets. Loads real map geometry from the Overpass API, then runs a living city simulation - zone blocks and watch them grow and fill over months, with RCI demand, a treasury/economy, happiness, and emergent problems. Part Cities: Skylines, part SimCity, part GeoGuessr.

TypeScriptWebGLOverpass APISimulationProcedural
Urban design simulation rendered on real Tokyo streets

Lineage - Medieval RPG Simulation

A simulation prototype for a grounded medieval fantasy RPG. Procedurally generates settlements from hamlets to walled capitals, then drives them with deeply interlocking systems - economy, factions, NPCs, social standing, skills, weather, and multi-generational lineage - all wired together over an event-bus architecture in Godot 4.

Godot 4GDScriptProcedural GenerationSimulationEvent-Driven
Procedurally generated medieval town with walls and hills

Iso-Tactics - Cyberpunk Deckbuilder

A prototype for a cyberpunk isometric turn-based tactics deckbuilder - think Hitman by way of Baldur's Gate 3. Sneak, lure, barter, talk, bribe, or kill your way through assassination encounters on a verticality-aware isometric grid, with card-driven actions resolving on a turn-based combat layer.

Godot 4GDScriptTurn-BasedDeckbuilderIsometric
Cyberpunk tactics dialogue and encounter screen Isometric tactics grid with card hand

Green CRT Terminal Shader

A drop-in Godot 4 canvas_item post-process shader that makes any scene look like an old green-phosphor CRT terminal: barrel distortion with a bezel mask, a fast 9-tap phosphor glow, scanlines and an RGB aperture-grille shadow mask, per-line jitter, a rolling bar, whole-screen flicker, film grain, and luminance-to-phosphor recoloring.

Godot 4GLSLPost-ProcessingCRT Emulation
Green-phosphor CRT terminal post-process shader CRT shader applied over a roguelike scene

Slang Cross-Platform Shader Pipeline

A production-style build pipeline showing how studios compile shaders for many platforms from one Slang source - targeting XBOX (DXIL, Shader Model 6.6) first, with cross-compilation to PC, Vulkan, and Metal. Includes a Cook-Torrance PBR pipeline, compute-based auto-exposure and ACES tonemapping, multi-pass bloom, and a declarative JSON shader manifest over CMake.

SlangHLSLDXILCMakeShader Model 6.6XBOX

Physically Based Raytracer

Path tracer written from scratch in C++ implementing a Monte Carlo rendering algorithm. Uses multithreaded accumulation buffers for ~30-50% faster render times.

Modern C++MultithreadingPBR
Source →
Cornell Box render Moon render Raytracing in One Weekend render

Teapot Graphics Engine

Minimal graphics engine featuring a PBR material pipeline, HDR with ACES tonemapping, glTF model support, and omnidirectional shadow mapping.

Modern C++OpenGLGLSLASSIMPUSD
Source →
HDR exposure mapping demo PBR rendering demo

Voxel Engine

Interactive voxel engine supporting 16.7M+ voxels with noise-based terrain generation and a real-time hydrological erosion simulation using particle dynamics and multithreading.

Modern C++OpenGLGLSLFastNoise2Multithreading
Source →
Terrain without erosion Terrain with erosion Erosion simulation

Unity Point Cloud Renderer

Point cloud renderer built with Unity's Universal Render Pipeline, using shader graph and custom HLSL for geometry instancing - driven by a single draw call.

UnityC#HLSLURP
Point cloud render Point cloud statue Point cloud detail

OpenGL Toy Rendering Engine

A toy rendering engine in the OpenGL Core Profile with ASSIMP model loading and support for 2D and 3D rendering, including various shader experiments.

Modern C++OpenGLGLSLASSIMP
Source →
Walrus animation Mandelbrot fractal Planet shader

Vulkan Toy Rendering Engine

A reimplementation of the OpenGL toy engine in Vulkan, focused on understanding the graphics pipeline and how Vulkan exposes lower-level control to the programmer.

VulkanVMAModern C++Dear ImGuiSDL
Source →

Geometry Processor

Implementations from Dr. Keenan Crane's Discrete Differential Geometry course at CMU - additions to the provided geometry processor for the course labs.

Modern C++OpenGLGLSLDifferential GeometryDear ImGui
Source →
Bunny geometry processing

Raymarcher

A Unity raymarcher implemented entirely in HLSL. The engine is contained within a single shader and supports arbitrary signed distance functions and CSG operations.

UnityHLSLCompute ShadersCSG
Source →
Raymarcher explosion CSG operations SDF raymarching