Creative Coding

Jet Puts Sega Saturn-Class 3D on a $5 Microcontroller, in 3,000 Lines of C++

650 triangles at 60fps on an ESP32-S3, integer math only, no GPU and no dependencies. For anyone building objects with small screens, real-time 3D just got a lot more available.

Microcontrollers have gotten fast enough to drive decent colour displays, which is why so many hobby projects now have a screen. Almost all of them show flat 2D: menus, dials, sprites. Real-time 3D on hardware without a GPU is treated as out of reach.

Jet, from CubeCoders, is a compact software rasterizer that says otherwise, and Hackaday picked it up on September 16.

The numbers

On an ESP32-S3 driving a 480×320 display, Jet renders about 650 on-screen triangles (after culling) at 60fps, or roughly 1,300 triangles at 30fps. The author’s comparison is a Sega 32X or Saturn, and that’s about right for the era of geometry budget.

It’s C++17, dependency-free, uses integer arithmetic only (no floating point, which is what makes it fast on chips without an FPU), and outputs 16-bit RGB565 colour. It runs on ESP32-S3 and STM32 parts, driving common SPI displays like the ST7796 and ILI9488. The demo is a Wipeout-style racer. Licensing is AGPL-3.0, which is worth checking before you build a product around it. Currently it does flat shading with triangle culling; textures aren’t implemented yet.

Why a creative coder should care

It makes 3D an option for physical objects. Handheld instruments, gallery-piece control panels, badge hardware, desk objects, synth UIs — anything with a small screen and a microcontroller can now have real perspective geometry instead of a flat menu. A rotating wireframe that reacts to a sensor is a different kind of object than one that displays a number.

The constraints are creatively useful. 650 triangles and no textures is a hard aesthetic limit, and it lands exactly where a lot of current work already wants to be: low-poly, flat-shaded, mid-90s. It’s the constraint set that produced Virtua Racing and Star Fox, and having it imposed by the hardware tends to produce better decisions than choosing it as a filter in a modern engine.

Integer-only rendering is a worthwhile thing to read. Anyone interested in how graphics worked before GPUs will get more out of 3,000 lines of readable C++ than from any amount of shader documentation. Fixed-point maths, span filling, culling and clipping are all visible in one place.

The project has been under development since May and is small enough to understand in an afternoon, which is not something you can say about most graphics code.