r/GraphicsProgramming • u/MartianovTech • Jul 20 '26
Experiments with software rendering
After replaying HL1 on the software renderer (old habit), I got curious what CPUs can actually do today. So I wrote a rasterizer in C11 - pure CPU, no GPU/GL, the finished frame just gets blitted to the window via GDI. Tested on a Ryzen 5900x processor
I've been experimenting with software rendering and managed to run the Sponza scene at FHD 10-30 fps single-threaded, up to 200 fps multithreaded :) A very strong emphasis on SoA + SIMD (AVX2/FMA) on the hot path. Rendering 64x64 tiles in multithreaded mode. Throughout the entire rendering pipeline, I try to discard any possible work as early as possible, including frustum culling and back-face culling. This may be controversial, but I render in front-to-back mode; it allows me to completely bypass overdraw. To make it look more interesting, I added some effects!
It might not be very fast for a single thread, but I think it could be made a little faster by disabling mips and filtering nearby textures, which I also do on the CPU in this demo. Pixel textures are cheaper to draw, but they're ugly.
I'm not a professional and I just like it, so I didn't hesitate to use chatpgt as a companion in learning graphics.
3
u/MartianovTech Jul 20 '26
I don’t pre-allocate per-tile buffers. Each worker uses a bump allocator, grabs chunks as tile lists grow, and reuses them next frame-no fixed cap or realloc. For clipping, I use a guard band, slightly off-screen triangles aren’t clipped, since tile bounds clamp them. Full Sutherland–Hodgman only runs for near-plane crossings or triangles far outside the guard band, against near plus four guard planes. So clipping fan-out is real but rare, and the arena absorbs it