Sources
Every external source the study cites, about 300 in all, grouped by the page that draws on it and listed once each, under the page where it matters most. Each line gives the source and a few words on what it is or what the study took from it. Tycho’s and the games’ own files are cited on the pages themselves, and the research notes behind each page are in the notes, which also carry sources the pages don’t.
- Sprites and items
- Plants
- Worlds and levels
- Real geography
- Buildings and interiors
- People and histories
- Animals
- Zoom and chunks
- Palette and resolution
- Text and interface
- Perspectives
- The sun
- Light
- Motion
- Effects and simulations
- Sound and music
- Phones and budgets
- Reaching a style
- The five games
Sprites and items
- Dave Bollinger, Pixel Spaceships: the mirrored-mask ship generator; “the avocado” mask, 62 free pixels, about 4×10¹⁸ ships.
- zfedoran, pixel-sprite-generator.js: the mask generator’s source; cells of −1, 0, 1, 2, mirrored, outlined.
- yurkth, Sprator: sprites from a 4×8 noise grid and a Life-like rule, mirrored and outlined.
- OpenGameArt, a layered character generator: layer groups and z-order in JSON; recolors that break across ramps.
- OpenGameArt forum, the recoloring fork: recoloring made to work by capping each material at six shades.
- Caves of Qud wiki, Modding: Tiles: 16×24 tiles in three color roles, filled at runtime from 18 fixed colors.
- GTG3000, GunsNAmmo: a Starbound mod config; guns from butt, middle and barrel parts with palette swaps.
- ProcJam Seeds, spellbooks: spellbooks built from image layers, each with several options.
- Thomas Vasseur, Dead Cells’ 3D pipeline for 2D animation: 3ds Max models rendered tiny without anti-aliasing, plus normal maps; flicker never solved.
- Lexaloffle BBS, sprite stacking: slices offset a pixel each for pseudo-3D; animating across slices is “a big pain”.
- James Poole, sprite stacking in Wee Boats: a devlog on stacked-slice pseudo-3D.
- Pixel Composer, De-Corner: a filter that removes the L-shaped corner pixel from 1 px lines.
- Krita merge request 2158: Krita’s pixel-perfect stroke mode, the same cleanup.
- PixelLab API: skeleton-posed animation and rotations; $0.0084 per 64×64 image.
- PixelLab, skeleton animation: the docs for posing sprites from a skeleton.
- Astropulse, Retro Diffusion on Gumroad: color reduction and “Neural Pixelate” inside Aseprite.
- Sprite Sheet Diffusion (arXiv 2412.03685): a research model trained on 152 paired action sequences.
Plants
- Wikipedia, L-system: bracketed turtle grammars, stochastic and parametric.
- Prusinkiewicz and Lindenmayer, The Algorithmic Beauty of Plants: six classic 2D plants at 20° to 25.7°, Honda’s tree, tropism.
- Runions et al. 2007, space colonization: branches grown toward points in a crown envelope; no weeping trees.
- Nuić et al. 2019: L-systems, colonization and particle flow compared on speed and shape.
- Weber and Penn 1995, Creation and Rendering of Realistic Trees: the per-level parametric brancher; crown shapes, AttractionUp.
- Blender manual, Sapling: Blender’s Weber–Penn tree add-on and its parameters.
- LibreTexts, architectural models of tropical trees: an illustrated key to Hallé and Oldeman’s 23 models.
- Virginia Tech dendrology, eastern white pine: whorls of 5 to 6 branches “like wagon-wheel spokes”.
- Wikipedia, Cupressus sempervirens: the Italian cypress, under a tenth as wide as tall.
- Wikipedia, Fir: cones that stand upright “like candles”.
- Wikipedia, Larix decidua: larch, a conifer whose needles turn gold and drop.
- Wikipedia, Betula pendula: birch, white bark with black fissures.
- Wikipedia, Populus tremuloides: aspen, black horizontal scars, clones that turn at different times.
- NC State, Fagus grandifolia: beech, which keeps dead leaves through winter.
- Wikipedia, Adansonia digitata: baobab, leafless about eight months a year.
- NC State, Jacaranda mimosifolia: purple-blue bloom on bare wood.
- NPS, saguaro: first arms at 60 to 75 years.
- Wikipedia, Saguaro: arm counts, the record 78.
- Wikipedia, Opuntia: prickly pear, pads stacked end to end.
- Wikipedia, Ferocactus wislizeni: the barrel cactus that leans south.
- Wikipedia, Agave americana: flowers once after 10 to 30 years on a stalk up to 8 m, then dies.
- Wikipedia, Yucca brevifolia: the Joshua tree, unbranched until its first bloom.
- USDA Forest Service, snag decay: the decay sequence of a dead conifer, red needles to hard snag.
- Wikipedia, Papaver rhoeas: the corn poppy, four petals with a black spot.
- Wikipedia, Rose: five petals for the wild rose; no blue pigment.
- Wikipedia, Tulip: six tepals; no pure blue.
- Wikipedia, Cosmos bipinnatus: eight rays.
- Wikipedia, Hyacinthoides non-scripta: the bluebell’s one-sided nodding raceme.
- Wikipedia, Blue flower colouration: blue-flowered species under 10% of flowering plants.
- Wikipedia, Iris: irises, which have no true red.
- Gulf News, a blue chrysanthemum: blue engineered into a flower that lacks it.
- Germinal WF10, cornfield annuals mix: a meadow as weighted species: corncockle 40%, poppy 25% and so on.
- Saint11, Vegetation part 1: a pixel tutorial: “Shape, Light, Detail”, no pillow shading, no orphans.
- Slynyrd, Pixelblog 44: top-down trees: foliage bundles shifted along one ramp; 4 or 5 colors a bundle.
- Red Blob Games, a procedural tree generator: leaf clusters drawn after all branches.
- Desarrh, Procedural-Tree-Godot: a Godot pixel tree generator with solid stamps per segment.
- Games in Progress, t3ssel8r’s procedural pixel trees: scattered-leaf trees “still a bit too messy”.
- Nick McDonald, transport-oriented growth: leaves seeded from a branch’s ID so foliage stays put as a tree grows.
- Wikipedia, Autumn leaf color: carotenoid yellows, anthocyanin reds.
- godotshaders, 2D wind sway: sway as a per-row offset growing with height.
- dev.to, animating pixel-art fabric with a Unity shader: the same sway floored to whole pixels.
Worlds and levels
- Red Blob Games, terrain from noise: fBm, redistribution, islands, ridges, terraces, biome tables.
- Fabric Yarn docs, MultiNoiseUtil.NoiseHypercube: Minecraft’s biomes as nearest points in climate space.
- Inigo Quilez, domain warping:
fbm(p + 4·q), coastlines that look authored. - xarray-spatial, erosion: droplet erosion in tens of milliseconds.
- Dwarf Fortress wiki, World generation: rivers by steepest descent, and generated history.
- Darius Kazemi, Spelunky’s generator, part 1: the 4×4 room walk and its solution path.
- Darius Kazemi, Spelunky’s generator, part 2: 10×8 room templates whose glyphs are chances.
- Boris the Brave, dungeon generation in The Binding of Isaac: rooms grown by BFS on a 9×8 grid, boss in the farthest dead end.
- Brogue wiki, Level generation: loops only where a wall’s sides are far apart by path; B5678/S45678 lakes.
- RogueBasin, cellular automata caves: 40 to 45% walls, the 4-5 rule, flood fill.
- Boris the Brave, dungeon generation in Unexplored: cyclic generation; 24 cycle types, about 5,000 rewrite rules.
- Deepnight, the level design of Dead Cells: concept graphs filled with handmade rooms; monster budgets.
- Maxim Gumin, WaveFunctionCollapse: the original WFC; simple tiled and overlapping models.
- Paul Merrell, model synthesis: the constraint solver WFC grew from.
- Karth and Smith, WFC slides: WFC is NP-hard; global restarts rarely succeed.
- Boris the Brave, classification of tilesets: 47 blob tiles against 16 corner tiles, or 6 with symmetry.
- Boris the Brave, quarter-tile autotiling: the dual grid, terrain on cell corners.
- LDtk, auto-layer rules: small grid patterns that paint a tile when they match.
- Bridson 2007, fast Poisson-disk sampling: O(N) scatter, k = 30 tries per point.
- devmag, Poisson-disk sampling: density varied by noise.
- Watabou, itch.io comment: the Voronoi diagram is “not really necessary” in his city generator.
- Parish and Müller 2001, procedural modeling of cities (SIGGRAPH archive): roads grown as L-systems steered by density and terrain.
- RandRoll, interview with Watabou: “Narrative stuff is hard”.
- Turn Based Lovers, interview with Wildermyth’s developer: generation built around characters, not plot.
- Caves of Qud wiki, World generation: five fixed periods of sultan rule, generated and tied to sites.
- Smith and Whitehead, expressive range (arXiv 2004.10808): judging a generator by many outputs on two metrics, as a heatmap.
Real geography
- Tarn Adams, Gamasutra Q&A on the development of Dwarf Fortress: Dwarf Fortress’s world generation in Adams’s words, stage by stage.
- John Harris, Interview: The Making Of Dwarf Fortress (Game Developer, 2008): midpoint displacement, drainage and salinity fields, rivers that dig when stuck.
- Dwarf Fortress wiki, DF2014:World generation: Adams’s stage list quoted in full; world sizes 17 to 257 squares.
- Dwarf Fortress wiki, DF2014:Advanced world generation: field tokens, the weighted mesh, biome thresholds, erosion and cavern parameters.
- Dwarf Fortress wiki, DF2014:World rejection: “belt and braces”; region counts, ranges and placement minimums that reroll a world.
- Dwarf Fortress wiki, World rejection: worlds that fail placement constraints, and the rejection log.
- Dwarf Fortress wiki, DF2014:Site: site types and the cap on new sites.
- Dwarf Fortress wiki, v0.31:Civilisation: savagery that blocks civilization placement.
- Isegoria, quoting Polygon on Dwarf Fortress (2014): strata as a separate fractal; rivers “only after biomes exist”.
- Minecraft Wiki, World generation: the six biome parameters and their bands, density, splines, continentalness as a shelf.
- Minecraft Wiki, Cave: cheese, spaghetti and noodle caves; aquifer cells of 16×12×16 blocks.
- Henrik Kniberg, Minecraft terrain generation in a nutshell (2022): the talk on the 1.18 generator.
- Martin O’Leary, mewo2/terrain: 16,384 points, primitive heightmaps, five rounds of flux-and-slope erosion, cities by river flux.
- Red Blob Games, mapgen4 mesh.ts: precomputed Poisson points loaded from a file.
- Red Blob Games, mapgen4 config.js: mapgen4’s parameters.
- Red Blob Games, mapgen4 README: 1 million+ cells possible, prettiest around 25k.
- Red Blob Games, mapgen4 map.ts: elevation, the wind-sorted rain sweep, priority-flood rivers, trunk beds lowered to tributaries.
- Amit Patel, mapgen4: rainfall (2018): one sorted pass along the wind; moisture leaking through passes.
- Amit Patel, mapgen4: threads (2018): generation moved into a Web Worker “to make it run acceptably fast”.
- Azgaar wiki, Advanced options: the jittered lattice and its points count.
- Azgaar wiki, Knowledge Base: 10K points for performance, no mobile app, cultures by terrain.
- Azgaar wiki, Heightmap template editor: heightmaps from blob primitives, with 20 as sea level.
- Azgaar wiki, Geographical features: lake subtypes and features.
- Azgaar, temperature-generator.ts: temperature by latitude, minus 6.5 °C per km.
- Azgaar, precipitation-generator.ts: winds by latitude tier; cells above height 85 block the wind.
- Azgaar, river-generator.ts: rivers at flux 30, lakes raised to their shore, a downcut of at most 5.
- Azgaar, lakes.ts: lakes drain only when inflow beats evaporation.
- Azgaar, biomes-generator.ts: a 5 × 26 moisture-by-temperature biome matrix with overrides.
- Mindwerks, WorldEngine: plate-based worlds and Holdridge life zones; “could take a few minutes”.
- WorldEngine, plates.py: the pyplatec plate simulation’s defaults.
- WorldEngine, generation.py: borders faded to ocean, a flattened shelf, oceans flooded from the edges.
- WorldEngine, simulations: precipitation as gamma-shaped noise; river and erosion passes.
- Undiscovered Worlds, what it is: global maps at about 16 km a pixel, regional maps on demand.
- Undiscovered Worlds, springs and valleys (2025): rivers and lakes “more or less” working.
- Undiscovered Worlds on GitHub: the source.
- Frozen Fractal, Around The World, part 2: plate tectonics (2023): plates by flood fill; boundary type × crust type picks a profile.
- Terrafirmacraft docs, world presets (1.20.x): layer types and twenty rocks stacked as a chain.
- Modrinth, Terrafirmacraft 3.0.0 beta: more predictable strata, ores rebalanced around them.
- Vintage Story Wiki, Rock: geologic provinces set layer thickness; ores tied to host rocks.
- Cordonnier et al. 2016, Large Scale Terrain Generation from Tectonic Uplift and Fluvial Erosion: the implicit stream-power solve, about 200 steps to converge at any resolution.
- Schott et al. 2023, project page: stream power as an interactive authoring tool.
- H-Schott, StreamPowerErosion: the released code.
- StreamPowerErosion, spe_shader.glsl: the per-cell compute-shader kernel and its defaults.
- Barnes, Lehman and Mulla 2014, Priority-Flood (arXiv 1511.04463): depression filling in O(n) or O(n lg n), with flow directions.
- Beyer 2015, Implementation of a method for hydraulic erosion: droplet erosion and its timings; cost grows with radius².
- Sebastian Lague, Hydraulic-Erosion: a Unity port of droplet erosion with precomputed brushes.
- henrikglass, erodr: droplet erosion in C, and its defaults.
- Smelik et al. 2009, A Survey of Procedural Methods for Terrain Modelling: thermal erosion by talus angle; Olsen’s real-time speed-ups.
- Peel’s Köppen page, University of Melbourne: the Köppen–Geiger rules.
- Peel, Finlayson and McMahon 2007 (HESS): the updated Köppen–Geiger classification.
- PMC, Köppen table reproduction: a copy that disagrees on the steppe threshold.
- Johnson, Yannakakis and Togelius 2010, cellular automata for real-time cave levels: 50×50 caves in 0.41 ms.
- Paris et al. 2021, Synthesizing Geologically Coherent Cave Networks: karst skeletons by anisotropic shortest paths.
- Wikipedia, Spring line settlement: villages at the foot of an escarpment where springs emerge.
- Rashid Faridi, site of a settlement: wet-point and dry-point sites.
- Save My Exams, settlements and service provision: the standard site factors.
- British Landscape, reading the landscape: aspect and shelter as siting factors.
- AMS Glossary, adret: the sun-facing slope.
- AMS Glossary, ubac: the shaded slope, with a lower timber line.
- cahier-de-prepa.fr course notes: adret for villages and crops, ubac for forest.
- Parc national des Écrins booklet: villagers settled the sunniest zones.
- GMBA, treeline definition: the treeline at a growing-season mean of about 6.4 °C.
- Körner and Paulsen 2004: 6.7 ± 0.8 °C from 46 treeline sites.
- PMC3535059: the treeline temperature, later work.
- Emilien et al. 2012, Procedural Generation of Villages on Arbitrary Terrains: interest maps with a veto, roads and houses grown together, parcels.
- HAL, Emilien et al. 2012: the same paper’s record.
- Watabou, village generator devlog 1.4.0: a distorted circle on the highway becomes the square.
- Watabou, village generator devlog 1.6.4: villages at a crossroads or T-junction.
- Watabou, village generator comments: players on roads through villages.
- Mezha, Ostriv Alpha 5: two- and three-story houses and paved roads.
- Wikipedia, Tobler’s hiking function: walking speed against slope, fastest slightly downhill.
- movecost vignette: least-cost paths with Tobler, cell by cell.
- par.nsf.gov 10420114: one cost function misses travel-rate variability.
- Galin et al. 2010, Procedural Generation of Roads: road cost curves, bridges and tunnels, k-masks against 45° artifacts.
- Galin et al. 2011, Authoring Hierarchical Road Networks: road levels by settlement size, proximity pruning, merged junctions.
- Helbing et al., active walker model (arXiv cond-mat/9806097): trails that wear in with use and fade without it.
- Helbing et al., arXiv cond-mat/9805158: direct, minimal and minimal-detour trail systems.
- USFS, trail design: the half rule and the ten percent average guideline.
- Shuswap Trail Alliance, trail design standards: maximum short-pitch grades.
- Cordonnier et al. 2017 (ACM ToG): viability hat functions, vigor and stress, humus by slope, the lapse rate.
- Gain et al. 2017, EcoBrush: monthly soil moisture, clustered conditions, plant spacing histograms.
- Eurographics record, EcoBrush: the same paper’s record.
- Hammes on flipcode: plants placed at runtime from ecotopes.
- Hammes 2001 (DOI 10.1007/3-540-44818-7_14): the paper.
- Deussen et al. 1998, Realistic modeling and rendering of plant ecosystems: circle competition and self-thinning; eight species segregate.
- Deussen et al. 1998, project page: the paper’s page.
- Verdant 02 Elevation Tileset: cliffs as four bands plus a shadow row; lit north and west rims.
- Biome tileset terrain set-up tutorial: layers for cliffs and caves; three-part, 3-frame waterfalls.
- OpenGameArt, cave entrances: entrances only in the faces you see.
- Radical Fish Games, why auto jump: CrossCode’s height layers without perspective.
- PlayStation Blog, Sea of Stars: climbing and ledge-hoisting as core traversal.
- MobileSyrup, interview with Thierry Boulanger: verticality in Sea of Stars’ levels.
- Nintendo Life, Sea of Stars hands-on: moving off the grid.
- Nexus Mods, Wargroove tileset mod: cliffs as a wall-style autotile, not true elevation.
- SNESLab, BG3 High Priority: per-tile priority bits, for walk-under layers.
- SNESdev wiki, Mode 5: SNES background modes.
-
Slynyrd, Pixelblog 20: top-down tiles: 16×16 as the common tile size.
- Palmer 1991, origin and morphology of limestone caves: branchwork, network and anastomotic caves, and what makes each.
- USGS, the truth about lava skylights: how lava tubes form and open.
- Paris et al. 2021, karst network generation: karst grown along joints and inception horizons.
- Wikipedia (German), Waldhufendorf: the forest strip village, one of the village forms.
- University of Hull, Beresford’s lost villages: village plans in England.
- Cubitect, cubiomes layers.c: Minecraft’s biome layers and their edge rules, reimplemented.
- Swiss National Forest Inventory, forest edge: how forest edges are measured.
Buildings and interiors
- Marson and Musse 2010, automatic real-time generation of floor plans based on squarified treemaps: rooms by subdividing a footprint.
- Bruls, Huizing and van Wijk, squarified treemaps: the subdivision behind it.
- Merrell et al. 2011, interactive furniture layout using interior design guidelines: furniture placed by rules.
- Shaun Lebron, isometric blocks: sorting isometric boxes by their hexagons.
- Andrew Russell, how 2.5D sorting works in River City Ransom: Underground: a topological depth sort in a shipped game.
- fallout2-ce, tile.cc: Fallout 2’s tile and roof drawing.
- Exult, gamewin.cc: Ultima VII’s roofs lifted in place.
- Game Developer, how Townscaper works: Oskar Stålberg’s irregular grid and building rules.
People and histories
The page, which lists all its sources.
- Martin O’Leary, naming-language: seeded naming languages from phoneme sets and syllable shapes.
- Mark R. Johnson, procedural generation of linguistics, dialects, naming conventions and spoken sentences (2016): Ultima Ratio Regum’s languages.
- Tarn Adams, simulation principles from Dwarf Fortress, Game AI Pro 2 ch. 41: simulating a world’s history.
- Grinblat and Bucklew, generation of mythic biographies in Caves of Qud (FDG 2017): a history written backward from its artifacts.
- Ryan and Mateas, Talk of the Town, Game AI Pro 3 ch. 37: a town’s people who know and misremember its past.
- Azgaar’s Fantasy Map Generator: names, cultures and religions placed on a map.
- Ultima Codex, Ultima VII SCHEDULE.DAT: the classic daily schedule as data.
- Paavo, what was Radiant AI, anyway?: Oblivion’s schedules and packages, and what was cut.
Animals
- Craig Reynolds, Boids and steering behaviors for autonomous characters (GDC 1999): flocking from three rules, and the steering behaviors after it.
- Hecker et al. 2008, real-time motion retargeting to highly varied user-created morphologies: how Spore animates any body.
- Couzin et al. 2002, collective memory and spatial sorting in animal groups: zones of repulsion, alignment and attraction.
- Ballerini et al. 2008: starlings heed about seven neighbors, not a fixed distance.
- Dwarf Fortress wiki, creature token: species as rows of tokens.
- Minecraft Wiki, mob spawning: spawning rules by light, block and biome.
- Bennie et al. 2014, biogeography of time partitioning in mammals: who is active by day, night and dusk.
- Krebs et al. 2001, what drives the 10-year cycle of snowshoe hares?: the hare and lynx cycle.
Zoom and chunks
- Factorio Friday Facts #180: a schematic chart apart from the world view.
- Factorio forum, map zoom sharpness: non-integer map steps that “aren’t as sharp as normal view”.
- Minecraft Wiki, Map: 128×128 maps at 1:1 to 1:16; Java’s most-common-block color, Bedrock’s point sample.
- Dwarf Fortress wiki, Embark: world, region and local tiles nested by 16 and 48.
- newreleases.io, Distant Horizons 1.16.5-a1.4: the LOD mod’s move to a quadtree.
- Modrinth, Distant Horizons changelog: low detail first, refined around the player.
- OpenStreetMap wiki, Zoom levels: the world in 4^zoom tiles of 256 pixels.
- squirkel: sharp-bilinear fractional zoom with only
drawImage. - CapView wiki, scaling and sharpening: the nearest-then-smooth scaling trick explained.
Palette and resolution
- NESdev, PPU palettes: 4 background and 4 sprite palettes of 4 colors.
- NESdev, PPU attribute tables: one subpalette per 16×16 background area.
- Pan Docs, Game Boy specifications: 4 shades at 160×144, 10 sprites a line.
- PICO-8 manual: 16 colors at 128×128;
pal()remaps,fillp()dither patterns. - Slynyrd, Pixelblog 1: color palettes: hue-shifted ramps, at most about 20° a step.
- Björn Ottosson, OKLab: a perceptual color space; hue error 0.49 RMS against CIELAB’s 0.69.
- Wikipedia, Color quantization: nearest palette color by distance in a Lab space.
- Wikipedia, Ordered dithering: the Bayer matrix and its −½ offset.
- Wikipedia, Floyd–Steinberg dithering: error diffusion, which depends on scan order and content.
- Rune Skovbo Johansen, surface-stable fractal dithering: dots pinned to surfaces so they don’t crawl.
- Nintendo Everything, Octopath Traveler’s developers: sprites on big screens looked “lonely and simple”.
- Unity forum, smooth-looking pixel art in motion: snap to whole pixels, offset the final blit by the fraction.
- Fab, a pixel-perfect camera listing: the same subpixel-offset camera as a product.
Text and interface
The page, and the colorblind section of Palette and resolution.
- DaltonLens, a review of open-source color vision deficiency simulations: which simulation models hold up, and libDaltonLens’s matrices.
- Xbox Accessibility Guidelines 101, text display: minimum text sizes and contrast for games.
- AngelCode, the BMFont file format: the common bitmap font format.
- Brysbaert 2019, reading rate: how fast adults read silently, for typewriter speeds.
- W3C, WCAG 2.5.8 target size: the minimum size of a touch target.
- IGDA GASIG, don’t implement colorblind filters: why to design palettes rather than filter them.
- TakWolf, Fusion Pixel Font: an open pixel font with CJK at low sizes.
Perspectives
- Wikipedia, Isometric video game graphics: the 2:1 grid is dimetric, at about 26.565°.
- Wikipedia, Mode 7: an affine matrix per scanline, sampled without interpolation.
- Lode Vandevenne, raycasting: a ray a column, DDA, perpendicular distance.
- Lou’s Pseudo 3d Page: OutRun-style roads from a Z map per line.
- s-macke, VoxelSpace: Comanche’s height-map renderer in under 20 lines.
The sun
- Sabotage, Sea of Stars press kit: “a custom-made render pipeline” with “full-on dynamic lighting”.
- Game Developer, Eastward’s creators: assets rebuilt in 3D with hand-painted bump maps.
- 80.lv, Graveyard Keeper’s sequel is 3D: pixel art projected onto Blender models.
- Chucklefish forum, Stardew night lighting:
outdoorLightscaled between two times, from decompiled code. - Klei forums, making a custom colour cube: Don’t Starve’s day, dusk, night and full-moon color cubes.
- Lazy Bear Games, Graveyard Keeper’s graphics effects: night tint, and shadows that rotate around a point.
- Wikipedia, Position of the Sun: declination within about 2°.
- Wikipedia, Solar zenith angle: elevation from latitude, declination and hour angle.
- Wikipedia, Solar azimuth angle: the azimuth’s atan2 form.
- PC Gamer, Witchbrook: what we know: “Days get longer or shorter depending on the season”.
- Wikipedia, Golden hour: between about −6° and +10° of elevation; no sharp shadows in blue hour.
- Sector12 Games, skew-shear vertex shader: shadows by skewing the sprite and drawing it black.
- Gobs and Gods, 2D shadows: each pixel’s silhouette offset by its height above a root line.
- dev.to, an HD-2D pipeline on DX12: alpha-tested casters whose shadows match the pixel art.
- GameDev.net, terrain self-shadows: horizon maps as the fast path for terrain shadow.
- JoonyoungSeo, unity-isometric-pixel-pipeline: an iso pipeline that fixes cloud-shadow direction at low suns.
- Unreal forums, color-cycled 8-bit scenes: a palette texture with “U = color index, V = time”; 3D LUTs too big for phones.
- Yanrishatum, palette shader gist: a palette lookup shader.
- Pierre Vigier, palette swapping with shaders: index-to-color swaps on the GPU.
Light
- Normal-map generators compared (arXiv 2212.09692): “no technique could produce maps as good as” an artist’s for pixel art.
- Minecraft Wiki, Light: sky and block light in separate channels, combined through a lightmap.
- Unity URP, light blend styles: modulate and additive factors, the same as
light.Smooth. - Godot docs, 2D lights and shadows: light at viewport resolution, not texel resolution.
- Unity forum, efficient per-texel lighting: posterized light leaves “jagged patches” unless done per texel.
- unitycoder, LutLight2D: a hand-made gradient per palette color, picked by light.
- Game Developer, the art direction of Bloodless: four colors, blended by light with dithered borders.
- Surma, Ditherpunk: Bayer, blue noise and error diffusion compared.
- W3C, Compositing and Blending: the blend formulas behind additive and screen mixing.
- Terraria 1.4.4.1, LightMap.cs (decompiled): sweeps with 0.91 per air tile and 0.56 per solid.
- Terraria 1.4.4.1, Lighting.cs (decompiled): the light modes and corner averaging.
- OpenStarbound, StarCellularLightArray.hpp: the octagonal cellular light spread.
- OpenStarbound, StarCellularLightArray.cpp: its point lights with fractional obstruction.
- Adam Milazzo, roguelike vision algorithms: shadowcasting against ray casting, cell visits counted.
- Red Blob Games, 2D visibility: exact visibility polygons by sweep.
- Matt DesLauriers, 2D pixel-perfect shadows: the 1D polar shadow map.
- Sam Bigos, 2D global illumination in Godot: jump-flood GI, 32 rays a pixel, still noisy.
- 80.lv, radiance cascades: Sannikov’s method, the cost of 16 rays without noise.
- jason.today, radiance cascades: an interactive walkthrough of radiance cascades.
- GM Shaders, radiance cascades: another explainer of the method.
- 80.lv, interview with the developers of Dead Cells: backgrounds redrawn as normal maps.
- Game Developer, hand-drawn normal maps in The Siege and the Sandfox: one pixel holds one normal; angles over gradients.
- TechRaptor, the art of Children of Morta: sprites stretched about four times so light runs finer than the art.
- Phaser, post bloom: threshold bloom at 0.55 by default.
- three.js, ShaderGodRays: screen-space god rays in three passes of six samples.
Motion
- Glenn Fiedler, Fix Your Timestep!: the fixed-step accumulator and the “spiral of death”.
- Unity blog, the procedural design of Rain World: limbs moved in code, mixed with traditional animation.
- Scale2x, the algorithm: four edge-preserving rules; Scale4x is Scale2x twice.
- rotsprite crate, rotate.rs: RotSprite: upscale, rotate nearest, downsample.
- torcado, cleanEdge: pixel art scaled and rotated “as if it were a vector drawing”, as a shader.
- McGuire and Gagiu 2021, MMPX: palette-exact 2× magnification, 64k pixels in under 0.5 ms, JS reference code.
Effects and simulations
- Joseph Huckaby, old-school color cycling with HTML5: Canvas Cycle, redrawing only cycling pixels; ran on an iPhone 3GS.
- 80.lv, color cycling returns with HTML5: Mark Ferrari’s scenes and BlendShift fades.
- Fabien Sanglard, Doom PSX fire: 37 heat indexes, each pixel copying the one below minus 0 or 1.
- 80.lv, Noita’s falling sand: 64×64 chunks with dirty rectangles; rigid bodies; durability.
- Jos Stam, real-time fluid dynamics (Autodesk Research): stable fluids, stable at any step.
- PlayStation Blog, Animal Well: a Navier-Stokes layer thresholded “to fit the pixel art”.
- WebKit bug 235196: cited for the rule never to call
getImageDataon a GPU canvas: readback is the main phone hazard. - The Powder Toy, elements: every material’s numbers; weights from gas 1 to solids 100.
- The Powder Toy, ACID.cpp:
Hardnessas resistance to acid. - The Powder Toy, Simulation.cpp: lava’s
ctyperemembering what melted. - The Powder Toy, FIRE.cpp: fire, burning and its chances.
- The Powder Toy, WATR.cpp: water’s reactions.
- The Powder Toy, PLNT.cpp: plants drinking water and growing.
- Sandboxels, index.html: materials as a data table; viscosity as a probability.
- Max Bittker, Making Sandspiel: cells of species, grain, state and clock; updating in place.
- Sandspiel, species.rs: Sandspiel’s rules, burn countdowns and chances.
- Noita wiki, Material: material durability (sand 4, brickwork 14).
- jason.today, falling sand improved: alternating scan direction so neither side goes first.
- Hacker News, a falling-sand thread: clock bits and updating in place.
- LifeWiki, Margolus neighborhood: order-free block updates that leave gaps between grains.
Sound and music
- DrPetter, sfxr: the 2007 generator that made game effects from a dozen numbers.
- Frank Force, ZzFX: the same idea in 21 numbers and under a kilobyte.
- Paul Adenot, Web Audio performance notes: what each node costs.
- NESdev wiki, the APU: the NES’s five channels, the chip as a style.
- iMUSE on Wikipedia: LucasArts’ music that changes at marked points.
- A Sound Effect, Paul Weir on No Man’s Sky: procedural audio and generated music in a shipped game.
- Chris Wilson, a tale of two clocks: the look-ahead scheduler.
- MDN, AudioSession.type: Safari’s switch between ambient and playback audio.
Phones and budgets
- WebKit, updates to storage policy: Safari’s storage quotas and eviction.
- WebKit, full third-party cookie blocking and more: the seven-day cap on script-written storage.
- WebKit bug 277848: the 1.5 GB soft memory limit for a tab.
- WebKit bug 215745: requestAnimationFrame held to 30 fps in Low Power Mode.
- Notebookcheck, iPhone 17 Pro review: browser benchmark scores and throttling for a current phone.
- Yan et al., HotPower 2015: what frame rate costs in battery.
- Surma, is postMessage slow?: the cost of sending data to a worker.
- Chrome, the Page Lifecycle API: when a hidden page is frozen or discarded, and when to save.
Reaching a style
- Erich Schaefer, Postmortem: Blizzard’s Diablo II (Game Developer, 2000): 3D Studio Max renders, 8 and 16 directions, 75 px characters, paper dolls.
- Shacknews, how Diablo 2 evolved: one baked light direction, set pieces; “doesn’t feel as dark and gothic”.
- OpenDiablo2, pl2: Diablo II’s palette files: 48 light levels, blend tables, 111 variations.
- Phrozen Keep, Diablo II colormaps: colormaps that “decline” one animation into several monster colors.
- pd2-sprite-studio: DCC format tools (four colors per 4×4 cell, 160×80 floor tiles) and an MCP server of 31 tools.
- Game Informer, Witchbrook’s new look: the move from top-down to isometric in April 2020.
- Witchbrook dev blog, Express Yourself!: 5 drawn rotations flipped to 8, 6-frame walks, 11 greyscale clothing layers.
- Gamereactor, Witchbrook’s inspirations: characters about 40 px tall; Studio Ghibli and Google Street View.
- witchbrook.com: the game’s site; launch set for January 28, 2027.
- Witchbrook dev blog: concept draw-overs on greybox layouts.
- David Holland, 3D pixel art rendering: t3ssel8r-style rendering reconstructed: texel-snapped camera, 1 px outlines.
- Gerstner et al. 2012, pixelated image abstraction: downsample and palette solved together; naive downsampling loses detail.
- Efros and Leung, texture synthesis by non-parametric sampling: example-based synthesis, WFC’s ancestor.
- Efros and Freeman, image quilting: texture from stitched patches of an example.
- Saint11, how to start making pixel art 2: the ban on orphan pixels.
- SD-πXL (arXiv 2410.06236): diffusion distilled into a fixed n-color palette.
- Astropulse, Retro Diffusion on itch.io: a pixel model said to be trained on licensed art.
- Jones Day, the US Copyright Office on AI training: training not categorically fair use (May 2025).
- Loeb & Loeb, Thaler v. Perlmutter: a work made solely by AI can’t be registered.
- GamingOnLinux, Steam’s rules for AI content: disclosure of AI content players consume.
The five games
The page. Its sources are local: Tycho’s own source and docs, linked from the page, and the five games’ files, cited in the survey.