Jet è un rasterizzatore 3D fisso, senza dipendenze, scritto in C++17 moderno da CubeCoders. Il suo campo d’azione sono i microcontrollori con poca memoria e poca potenza, come ESP32 e STM32. Funziona interamente in software con aritmetica a soli interi e usa nativamente il colore RGB565 a 16 bit per l’output veloce su display SPI come ST7796 e ILI9488. In pratica, mette una scena 3D illuminata e texturizzata su un piccolo LCD collegato a un microcontrollore, oppure regala un’estetica software-rasterizzata low-poly a frame rate elevati, con consumo di flash, RAM e CPU limitato a ciò che si usa davvero.
Chi cerca il codice trova il repository di CubeCoders con i sorgenti della libreria. Non è un’applicazione pronta: è un motore da integrare nel proprio progetto.
Come funziona il rasterizzatore: framebuffer e aritmetica fixed-point
Jet non possiede finestra, driver di display né main loop. Riempie solo un framebuffer fornito dall’utente e va chiamata con scene->render() una volta per frame. Gira interamente in software con aritmetica fixed-point a soli interi nel percorso caldo, senza allocazioni, senza virtual dispatch nel rasterizzatore e senza globali nascosti. Questa scelta tiene il codice prevedibile e adatto a un microcontrollore.
Ogni funzionalità è un interruttore a compile-time in JetConfig.hpp. Disattivando Z-buffering, texture perspective-correct o illuminazione per-pixel il relativo codice non viene compilato. Di conseguenza, chi non usa una funzione non ne paga il costo in flash né in cicli di CPU.
- Mesh di triangoli e quad con materiale per faccia
- Shading flat, Gouraud, Phong e wireframe
- Texture mapping affine e perspective-correct con filtro bilineare opzionale
- Z-buffering opzionale oppure ordinamento con algoritmo del pittore, per oggetto e/o per triangolo
- Culling backface e frontface, depth bias, blend mode per oggetto e alpha screen-door con dithering
- Rendering interlacciato o a scacchiera, fog di profondità, fade in/out per distanza
- Sprite 2D, sistema di particelle a pool fisso, lens flare e un piccolo entry point per shader personalizzati
I numeri su ESP32-S3 e l’esempio minimo da cui partire
Su un ESP32-S3 Jet renderizza circa 40000 triangoli al secondo con shading flat. Sempre su ESP32-S3, a 480×320 si ottengono poco più di 650 triangoli a schermo dopo il culling a 60fps, oppure 1300 a 30fps. La demo di un gioco in stile Wipeout costruita su Jet gira su un ESP32-S3 a 60 FPS in modalità interlaced field-buffer, renderizzata in software senza GPU.
Per partire c’e’ un esempio minimo concreto. Il framebuffer è di 320×240 con colore RGB565 e Z-buffer abbinato, la camera ha FOV di 75, nearPlane 16 e farPlane 8192. Il cubo creato misura 200x200x200 e viene posizionato a 0, 0, 200. La luce direzionale ha direzione 45, 35, 0, colore 255, 245, 220 e intensità 220, mentre la luce ambientale ha colore 40, 48, 64.
Il progetto si compila con CMake ed ESP-IDF, e la documentazione si genera con Doxygen, con Graphviz opzionale. C’e’ anche un loader per file Wavefront .obj, così le mesh si preparano con gli strumenti che già si usano. Per provare Jet su un hardware vicino a quello dei test, un display TFT da 3,5 pollici con ESP32-S3 riunisce microcontrollore e schermo con controller ILI9488, uno di quelli citati dal progetto. Il bus del display è parallelo, quindi serve un driver adatto.
Chi vuole rifare il progetto parte dai sorgenti e dagli esempi. La libreria non impone nulla: scegli il tuo display, il tuo framebuffer, il tuo main loop, e attivi solo le funzioni che ti servono.
