Academic work
A real-time renderer built from the maths up
A C++ and OpenGL engine written for the Computer Graphics course. It carries its own vector maths library and lighting shader, and an interactive scene where thrown light sources light the geometry around them as they move.
The problem
The lights move with the player, so none of the lighting can be baked ahead of time. Every light is recomputed for every pixel of every frame, inside a fixed frame budget.
Compiled from commit 25e23fa with emcc 6.0.6 on . 818 KB in total.
I wrote this without an engine, so the vector maths, the camera and the shading are all implemented in the project rather than configured.
The course ran in the second half of the first semester of 2025/2026, so the months are that block rather than recorded dates.
What this demonstrates
Implementing the primitives rather than importing themcore
I wrote the linear algebra myself rather than pulling in glm: 1,259 lines covering Vec2/3/4, Mat2/3/4, transpose, the projection and model matrices, and a 4x4 inverse.
Measuring instead of assertingcore
Lighting is recomputed per pixel every frame, with quadratic attenuation and a spotlight cutoff evaluated for each light at each fragment. A shortcut anywhere in that loop shows up as a dropped frame, so I could not guess at whether it was fast enough.
Built with
C++core
The engine, the maths library and the scene loading.
OpenGLcore
The rendering pipeline, and the shader stage I wrote by hand.
CMakeminor
Cross-platform build. I developed and ran it on both macOS and Linux.