Graphics Programming
Material-Guided Decoders
Joint estimation of material properties and HDRI lighting, since illumination estimation is central to realism in inverse rendering. A ResNet-50 backbone with FiLM conditioning predicts environment lighting from a single image, trained on a Blender pipeline built for ground-truth lighting. Adding material parameter regression as a second task produced far more convincing relighting than the baseline CNN, despite lower pixel-wise accuracy.



Project poster. Open the PDF above for a readable version.
Pure C++ Raytracer
Physically based rendering entirely in C++, no external libraries: reflection, refraction, soft shadows and multi-bounce global illumination from scratch.
Normal Repainter
A Blender plugin that gets painterly or cel-shaded effects by repainting normal maps with k-nearest neighbors. Accurate, smooth, and fast even on 4K images.



Same mesh, three normal treatments: source shading, painterly repaint, cel repaint.




In texture space: painted albedo, the source normal map, and the k-NN repainted normals before and after smoothing.





Applied to a character: baseline smooth shading, then increasingly painterly repaints.
Procedural City GenerationTencent
Built as a C++ Unreal Engine intern at Tencent, Lightspeed Studios. Procedural generation for large-scale 3D environments, with custom HLSL shaders and rendering pipelines tuned against RenderDoc captures. A configurable mesh instancing system cut draw calls by 55%, and multi-threaded dynamic lighting drives a day/night cycle with thousands of concurrent lights.


