Work

Ohao Engine rendering core, path-traced helmet

Ohao Engine

I wrote it in C++ as a Vulkan renderer. Now I'm turning it into an agentic 3D engine.

I wrote Ohao in C++ as a Vulkan renderer, with fast deferred lighting and slower path tracing. Now I'm upgrading it into an agentic 3D engine, so they can train interesting stuff natively in it. The rendering core is public on GitHub.

Graphics
GitHub ↗
Studio capture set for the neural rendering thesis

Neural Rendering Dataset

Earlier · MSc thesis · Linköping · 2026

CamMatrixCapture: 12-camera sync, turntable automation, and a public dataset, 209 GB, 14 objects, MIT. On reflective surfaces, 3D Gaussian Splatting measured about 11 dB PSNR above NeRF.

Thesis
PDF ↗ DiVA ↗ Dataset ↗ Monograph ↗

MLS-MPM Physics Simulation

Taichi · MLS-MPM · APIC · SDF collision · SplashSurf · Cycles

Series of fluid–structure sims on Taichi (Hu et al. 2018 MLS-MPM). Showcase clip: Phase 9 3D Rising Flood, 128³ grid, up to 4M water particles, GLB building → SDF slip boundaries, two-phase injection, PLY → SplashSurf isosurface → Blender Cycles water. Also: 2D dam break, 3D bridge pillars, water wheel, city flood, building fracture (Phase 8).

Physics
Live demos ↗ Code ↗
sx-engine hero render: ray-traced glass sphere over desert with cloud-reflecting environment
sx-engine crystal aquarium liquid preset sx-engine silk cloth PBD simulation

sx-engine, CUDA Path Tracer + Physics

CUDA · Taichi · C++ · OIDN · ~3K LOC

CUDA path tracer with BVH, Schlick-Fresnel refraction, and optional Intel OIDN denoising. 16 parameterized liquid presets (ocean · honey · lava · milk · blood · crystal …) each with their own IOR and depth-absorption. Paired with a Taichi-GPU Position-Based Dynamics cloth solver, stretch + bend constraints, material-specific stiffness, exporting per-frame OBJ meshes back to the CUDA renderer. 58 production stills shipped.

GraphicsPhysics
Repo ↗
SPH particle fluid simulation with velocity-coded color visualization, confined in a tiled pool

SPH Water Simulation

C++ · CUDA · OpenGL · BSc thesis

GPU-accelerated Smoothed Particle Hydrodynamics solver with Marching Cubes surface extraction and CUDA ↔ OpenGL interop for real-time visualization. Uniform-grid spatial hashing for neighbor search, cubic-spline density kernel with gradient / Laplacian variants for pressure and viscosity forces, plus surface-tension kernel. Bachelor thesis, the foundation my current fluid work builds on.

Physics
Repo ↗ Demo video ↗
Fully oxidized metal sphere PBR render, final stage of the procedural rust progression

Real-time Material Aging & Weathering

OpenGL · GLSL Compute Shaders · PBR · Procedural Noise

Compute-shader playground for procedural material decay on a PBR sphere, noise-driven rust progression (0/25/50/75/100%), paint cracking and peel, and a dynamic puddle / weather system that wets and dries the ground in real time. Built around an OpenGL compute pipeline with full BRDF response so albedo and roughness shift together as the surface ages. Coursework for Linköping's TNM084 Procedural Methods.

GraphicsCoursework
Repo ↗
Custom Qt-based Xiàngqí board mid-game with the trained DQN agent on move

Xiàngqí AI with Deep Q-Networks

C++ · Qt · CUDA · DQN · Self-Play

Reinforcement-learning agent for Chinese Chess, full Xiàngqí rules engine in C++/Qt, a Deep Q-Network with experience replay and a target network, and CUDA-accelerated training driven by self-play in the spirit of AlphaZero. Win-rate sweeps against random and self-play opponents, plus a playable GUI to face the agent. TNM114 group project at Linköping with Oskar Tengvall.

AgentsCoursework
Repo ↗
Cornell-box-style path-traced render with diffuse, glossy and refractive interactions converged

Path Tracing & Photon Mapping

C++ · CUDA · Monte Carlo · KD-Tree

Two global-illumination renderers written from scratch for TNCG15. Monte Carlo path tracer with a CUDA backend for per-pixel parallel ray generation and progressive accumulation, real-time-feasible against the CPU baseline. Photon-mapping pass scatters photons from light sources, then estimates radiance via KD-tree nearest-neighbour lookup for sharp caustics and indirect lighting. Comparative study of where each technique wins.

GraphicsCoursework
Repo ↗ Demo ↗
Skiing-action classifier test panel: original video, OpenPose skeleton, ST-GCN class label, and attention map

Skiing Action Analysis · OpenPose + ST-GCN

Python · OpenPose · ST-GCN · Action Recognition

Pipeline for classifying skiing techniques from video, OpenPose extracts 2D body keypoints, a Python preprocessor stitches per-frame skeletons into spatial-temporal graphs, and an ST-GCN trains on those graphs to label actions like big-bend carving. Best model (epoch 39, lr 0.1, batch 32) hits 50% Top-1 / 90.9% Top-5. Co-authored, published in Intelligent Computer and Applications Vol. 12 No. 4, April 2022.

NeuralCoursework
Paper ↗
Freedo Technology
AI Algorithm Intern · Remote
Feb 2026 to Jun 2026
  • GPU physics runtime coupling an MLS-MPM solver to 3D Gaussian Splatting on a multi-GPU A100 server, a scanned scene can deform, fracture, and flow. ~2.25× end-to-end speedup via CUDA-graph capture and mass-conserving particle reduction.
  • Pipeline in Taichi, NVIDIA Warp, and CUDA, with a FastAPI + React workbench for streaming splat playback.
Beijing Guoyao Xintiandi Information Technology
C++ Development Engineer Intern · Beijing
Aug 2022 to Sep 2022
  • Moved a Qt 3D medical viewer from legacy OpenGL to modern OpenGL, shader programs, VBOs, current state management.
  • Custom C++ protocol for client-to-backend data.
Tool use TypeScript Python Node Job queues
AgentsTool use, and proof you can check
LanguagesTypeScript, Python, Node, C++20, CUDA, C#, Rust
Product systemsAsync job queues, quotas, Postgres, OAuth, billing, FastAPI
Earlier graphicsVulkan (KHR ray tracing), path tracing, PBR, 3DGS / NeRF, Taichi, MLS-MPM, capture pipelines
SystemsGit, Linux, Docker, CMake, PostgreSQL

I want an agent to finish a job I can check: a tool result, a screenshot assert, a generation that actually landed in the queue. One server with a real contract is worth more than a chat window that only sounds capable. The graphics years were practice in measuring whether a result was actually right. I still work that way.

Linköping University
MSc Computer Science, Graphics & Visualization
2023-2025
  • Graduated February 2026.
  • Top grades (5/5) in Advanced Global Illumination, Modelling & Animation, Computer Games Design, Large Distributed Projects.
  • Thesis: Neural Rendering Dataset Collection, filed with the earlier graphics records. PDF ↗ · DiVA ↗
Beijing Information Science and Technology University
BEng Computer Science
2018-2023
  • GPA 3.53 · Advanced Mathematics 97 · CPU Design 91.

Notes

The Penumbra Condition, Radiance Cascades in Flatland

Why a shadow is crisp at the washer drum and blurry down the aisle, and the global-illumination trick built on that.

All notes →