Panos Karabelas

One engineer. Twelve years.

Spartan Engine

A bindless, GPU-driven renderer with real-time path-traced global illumination, hardware ray tracing, and a vehicle simulation running at 200 Hz. It started as a university project. It is now the thing I am known for.

3.1k GitHub stars
600+ Engineers on Discord
272 Forks
MIT Licence, free with attribution

The trailer

See it move

Spartan Engine — 10 year anniversary

The principle

The GPU owns the data

Every resource — geometry, materials, textures, lights, transforms, bounding volumes — lives in persistent, globally accessible buffers. No per-draw descriptor updates. No per-draw resource binding. No CPU-side draw loops. One philosophy applied without compromise: favour real-time over baked, dynamic over static, modern over safe.

Under the hood

What is actually in there

Architecture

  • Zero-binding draw path, all per-draw data in a single bindless storage buffer with push constants carrying only an index
  • One global vertex and index buffer for all geometry, with vertex pulling that bypasses the input assembler and is shared by rasterisation and ray tracing
  • GPU-driven indirect rendering with per-meshlet frustum, Hi-Z occlusion and backface cone culling, one DrawIndexedIndirectCount per pass
  • Meshlet clustering via meshoptimizer, with no mesh shader dependency
  • Universal HLSL compiled for both Vulkan (SPIR-V) and DirectX 12
  • GPU-side asset processing: mip generation and texture compression at load time, not baked offline

Lighting and global illumination

  • ReSTIR path tracing with spatiotemporal reservoir resampling for real-time multi-bounce global illumination
  • Clustered deferred shading on a GPU-built logarithmic-Z grid, scaling to many local lights at near-constant per-pixel cost
  • Hardware ray-traced reflections and shadows via ray queries
  • Volumetric clouds baked into the sky panorama, with multi-scatter lighting and aerial perspective
  • Froxel volumetric fog with temporal reprojection, sun shafts and underwater caustics
  • Tessendorf FFT ocean with multi-cascade IFFT in compute, driving a camera-following clipmap
  • Screen-space shadows and XeGTAO ambient occlusion

Performance and image quality

  • Variable rate shading and dynamic resolution scaling
  • TAAU, Halton-jittered with variance-clip history reprojection
  • Intel XeSS 3 upscaling
  • Physically based camera with auto-exposure and physical light units in lumens and kelvin
  • ACES, AgX and Gran Turismo 7 tonemappers, with HDR10 output
  • Custom GPU breadcrumbs for crash tracing and post-mortem debugging

Beyond rendering

  • Vehicle dynamics at 200 Hz: Pacejka MF 5.2 tyres with thermal, pressure and wear models, LSD differentials, thermal brake fade and ABS
  • PhysX rigid bodies, character kinematics and vehicle physics
  • Full skeletal animation with crossfade blending and two-bone IK with ground-aware foot planting
  • Lua 5.4 scripting through Sol2, with the full engine API and lifecycle callbacks
  • Nsight-style profiler with separate graphics and async compute lanes, plus a memory fragmentation viewer
  • OpenXR VR with multiview single-pass stereo, work in progress

Worlds

Nine of them ship with the engine

Nothing here is a canned demo. Every world is physics-enabled — walk around, pick objects up with the mouse, or take a car for a spin.

Why it exists

I had to “finish” this project inside a year so I could use it as a ticket out of Greece and into a studio that would have me. To get there I worked 100-hour weeks, roughly fourteen hours a day, every day. It worked. It also never stopped.

Twelve years later it is still the same codebase, and I have rewritten almost every system in it multiple times. Every single rewrite came out simpler than what it replaced. That is not what people expect to hear about a maturing system, and it is the most useful thing I have learned from building this.

This is what a codebase looks like when one person owns every line for a decade. No legacy committees. No half-migrated architectures. No “we’ll fix it in the next version.”

It is a personal R&D engine, not a commercial product. No roadmap promises, no support queue, no compromises on the vision. There is a destination that gives all of this a purpose — the plan is in the repository if you are curious.

Get involved

Build it, break it, or just come and argue about it

One-click project generation, a wiki that covers the build and the Lua API, and 600+ engineers on Discord who will happily tell you what you got wrong. Contributors get access to perks designed to accelerate learning.

A dim liminal corridor lit by a single ceiling panel, rendered in Spartan Engine