@HAMBUP · PORTFOLIO · 2026

I love computer graphics: how geometry, light and a lot of linear algebra turn into an image. I learn it by building every piece from the ground up, and I enjoy teaching what I figure out along the way.

Computer Science @ UCLA · Class of 2030
LOS ANGELES, CA OPEN TO INTERNSHIPS

Live renderer

NO WEBGL · NO GPU · YOUR CPU
PASS 09/10 · SHADOWS 384×216
TRIS HOVER TO INSPECT A PIXEL DRAG · ORBIT   HOVER · LIGHT

This rasterizer was built for this page in plain JavaScript. It goes through the same stages as the C++ renderer: MVP transforms, back-face culling, barycentric fill, a z-buffer, Phong lighting and shadow mapping.

FRAMEBUFFER

Projects

02 · IN PROGRESS Ray Tracer Same goal, the other way of making an image.

Journey

2025 — 2026 Software Rasterizer C++17 · SDL3 · PERSONAL PROJECT

A 3D renderer built from scratch on the CPU. Started in Lua, rebuilt in C++, and documented stage by stage at hambup.me/rasterizer.

NOW Computer Science @ UCLA LOS ANGELES, CA · CLASS OF 2030

Studying computer science with a focus on graphics and rendering.

Let's render
something.

I'm open to internships. Want to talk rendering, the pipeline, or a project? Reach out.

Say hello →
01 · FLAGSHIP · 2026

Software Rasterizer

A 3D renderer that runs entirely on the CPU, written from scratch in C++ to understand how 3D graphics actually work. SDL3 only opens the window and shows the finished framebuffer.

Two skulls in a library: Phong shading on the left, toon shading on the right, lit by two lights with shadow mapping
FIG. 1 · Phong (left) and toon (right), two lights, shadow mapping. Every pixel computed on the CPU.
WHY I BUILT THIS

“Honestly, it was pure curiosity.”

It started in Lua with one goal: understanding how 3D graphics work. When Lua got complicated, I started over in C++ with the right tools.

Building the base of 3D rendering taught me how linear algebra is actually used, how to structure a project, how to fix bugs, how to optimize, and how to turn an idea into something huge. I built every part from scratch, so I can explain any part of it to anyone. That is what I love most: teaching.

IN MOTION
Skull scene rendering in real time
Phong vs toon shading, two lights, real-time shadow mapping.
Walking through the Backrooms scene
The Backrooms test. A full downloaded scene of about 70K triangles, imported to prove the renderer is not tied to scenes built for it. Its lighting is baked into the textures, so it shows off geometry, texturing and clipping.
PIPELINE
  • Math library from scratch: Vec2, Vec3, Vec4, Mat4
  • Full Model · View · Projection, every matrix derived on paper first
  • Near-plane triangle clipping, frustum rejection, back-face culling
  • Barycentric rasterization with perspective-correct interpolation
  • Per-pixel z-buffer
LIGHTING AND SHADING
  • Per-pixel Phong: ambient, diffuse, specular
  • Toon shading with banded light and outlines, switchable per object
  • Directional light and spotlight with cone and attenuation
  • Shadow maps: orthographic for the directional light, perspective for the spotlight
  • Bias against shadow acne; shadow maps re-render only when a light changes
ASSETS
  • OBJ parser with MTL materials
  • Quads and n-gons split into triangles
  • BMP decoder written from scratch, 24-bit and 32-bit
PERFORMANCE AND INTERACTION
  • Multithreaded: the screen and the shadow maps split into bands of rows, one per CPU core
  • First-person camera: WASD and mouse look

Project timeline

2025Started in LuaLÖVE2D

One goal: understanding how 3D graphics work. A first rasterizer with projection, a z-buffer and an FPS camera.

2026Started over in C++C++17 · SDL3 · CMAKE

Moved to a proper environment and rebuilt the whole pipeline from scratch: math library, MVP, clipping, Phong and toon shading, two kinds of shadow maps, multithreading.

2026Wrote it all downHAMBUP.ME/RASTERIZER

Every stage of the pipeline explained from the first pixel to shadow mapping, with interactive visualizations, handwritten notes and the Bugs Hall of Fame.

NEXTA ray tracerIN PROGRESS

Same goal, the other way of making an image.