Skip to content

Software rasteriser - no GPU, no libraries

A solar system drawn in plain C#

The eight planets are placed from real JPL-style ephemeris for a given date, lit by a single point-light at the Sun, shaded with a PBR IcoSphere material, set against a catalog of real stars, and tonemapped from HDR - every pixel computed on the CPU by code that touches nothing outside the .NET base library.

JPL ephemeris Point-light Sun PBR IcoSphere HDR tonemap Real star catalog N-body sandbox

These are the offline 1.4 render apps (Cosmos, ModelDemo). Frames were baked fresh on a single desktop CPU in about 44 seconds.

The Sun glowing at frame centre with several PBR-shaded planets caught as lit crescents against black space.

Renders

Six scenes from the same engine

Each tile names the technique doing the work. GIFs loop; still frames are 1024px renders.

An elevated camera circling the Sun while planet positions advance over about a year and a half.
Orbital sweep
Ephemeris positions per date + Sun point-light. 720x405, 60 frames.
Camera diving from a top-down view down onto the ecliptic plane, faint orbit rings and Saturn passing overhead.
Ecliptic descent
Camera pitches top-down to plane; HDR Reinhard tonemap. 60 frames.
A drifting star field aimed at Orion, with constellation lines and labels for the Pleiades, Beehive Cluster, Crab Nebula and Orion Nebula.
Aimed at Orion
Real star catalog projected to screen + constellation lines and deep-sky labels. 60 frames.
A live gravitational simulation of the planets with orbit rings; Jupiter is doubled in mass a third of the way through and turns red.
N-body: Jupiter doubled
Live gravitational integration seeded from ephemeris; Jupiter mass x2 mid-run, with an energy-drift bar. 80 frames.
A museum ant surface scan loaded from an STL file and rendered with smooth normals and cel shading.
Arbitrary STL model
STL triangle soup welded to smooth normals, slab-culled, cel/Toon shaded. 1024x1024.
The same ant model reduced to a small palette and upscaled into blocky pixel art with dark edge ink.
Pixel-art dither
128px render, Bayer 4x4 dither, MedianCut palette, Sobel depth/normal ink, nearest-neighbour upscale.

Method

Everything above is CPU-drawn

Planet positions come from an approximate ephemeris keyed on the calendar date, then compressed with a square-root radial scale so the inner planets do not vanish next to Neptune. Each body is an IcoSphere subdivided twice, tinted, and rasterised by a Pineda edge-function triangle filler into floating-point R, G and B planes. A single point-light at the Sun drives the physically-based shading; the result is Reinhard tonemapped back to 8-bit and packed to GIF or PNG.

The star field is a genuine catalog - direction, brightness and colour per star - projected through the same camera, with constellation line segments and deep-sky markers overlaid. The N-body clip drops the ephemeris entirely and integrates real gravity, so doubling Jupiter's mass visibly perturbs the other orbits. The model tiles prove the pipeline is not solar-system-specific: any STL loads, auto-frames itself and renders through the identical rasteriser.