Produce a tiny image and explain how coordinates become a sequence of color values.
This chapter’s project
Your own gradient or color-grid program, its PPM, and a note tracing one pixel from loop index to file values.
A softer light for long learning sessions.
Loading your preference…
Light uses Latte. Your choices stay in this browser.
Volume 01 · 24 flexible weeks
A pixel becomes a world.
Bring your existing C++ knowledge into modern practice through ownership, value semantics, memory budgets, geometry, light, triangles, and shaders. Small experiments become one finished rendering study.
Open my weekly workbench ↗Your earlier C++ experience. We teach modern ownership, values, errors, and lifetimes; no remembered CMake knowledge is assumed.
Explain one pixel from allocation to geometry to encoded color, and defend a tested personal extension.
Before week one: Build your studio — a complete CMake, Ninja & Clang primer ↗
Your sketchbook / 12 chapters
Two weeks per chapter: understand and build, then investigate and finish. Repeat any week.
Produce a tiny image and explain how coordinates become a sequence of color values.
Your own gradient or color-grid program, its PPM, and a note tracing one pixel from loop index to file values.
Distinguish owned image storage from borrowed views and explain cleanup without manual delete calls.
An owned image or color buffer with one borrowed-view operation, a mutation/copy test, and your ownership diagram.
Use vector operations to explain a camera ray and the surface normal at an intersection.
Your own small vector tests and a ray/sphere sketch with one independently calculated hit or miss.
Construct an owned scene in C++ and separate representation, validation, and rendering effects.
Your own typed scene variation, one accepted boundary test, one rejected boundary test, and a written validation contract.
Trace the native CPU renderer from validated scene through ray, hit, shading, and PPM output.
A scene image with one deliberate visual change, a pixel trace, and a new geometric regression test.
Use std::pmr to connect allocation policy, bounded scratch storage, failure, and container lifetime.
Your own PMR experiment variation, a failure test, and a diagram of storage, resource, borrowers, and promoted output.
Explain visibility toward a light and design a bounded one-bounce reflection extension.
A controlled shadow comparison and your own one-bounce reflection extension, with an explicit work/depth limit and tests.
Use edge functions and barycentric weights to explain the screen-space raster reference.
A changed two-triangle image, coverage tests for your edge convention, and a sketch explaining one sample’s barycentric weights.
Explain the transformation pipeline, near-plane clipping, and per-sample visibility without conflating their roles.
Your own overlap/depth test plus a near-plane clipping sketch or implementation with documented input and output spaces.
Distinguish affine interpolation, perspective-correct attributes, sampling rules, and normal/color handling.
Your own textured-triangle extension or executable interpolation test with an affine/perspective comparison and defined sampler boundaries.
Modify a real WebGL2 fragment shader and connect its interface to the CPU rendering concepts.
Your own shader variation, the source diff, one screenshot, and a note connecting its inputs to the CPU triangle experiments.
Produce an original, bounded rendering study with reproducible evidence and interview-ready reasoning.
Your own bounded renderer study with source, one reproducible scene, a short demo, tests, a debugging story, and a measured result.
Keep your hands on the work
The companion explains its build steps, tested behavior, and remaining learner work. Keep your own contribution clear as the project grows.