Pixel-art styles, resolution and detail, palettes and color, and perspectives (for a plain-JS phone engine)

Research notes compiled 2026-11-02. Sources were fetched or searched this session unless an item is marked “general knowledge, not verified this session”. Those items sit only in Inferences or Gaps, never in Cited Findings. Target: a plain-JS canvas engine on phones, with internal resolutions from 128x128 to 640x360. (Context: Elsewhere already renders isometric at 320x180 with 8 inks per frame, through an indexed-palette painter, Ink.)


(a) Styles: which rules define each major pixel-art style, and which can an engine enforce automatically?

Takeaway

The classic styles are defined by hardware rules that can be written down and checked by a program: a master palette, a few colors per sprite or per tile region, the region’s size, sprite size, and sprites per scanline. An indexed-color engine can enforce these exactly. The modern styles (hi-bit, HD-2D, painterly, minimalist) are defined by habits instead: palette discipline, outline policy, cluster cleanliness, and post effects. An engine can enforce only some of those (palette lock, colors per frame, no anti-aliasing, outline rules). The rest has to be encoded as generator rules or checked with heuristics.

Cited Findings

NES (Famicom), from the hardware reference

Game Boy (DMG) and Game Boy Color

SNES

PICO-8 (fantasy console)

1-bit (Return of the Obra Dinn)

Hue-shifted palettes (hi-bit and modern practice)

HD-2D (Octopath Traveler)

Isometric

Sprite stacking (NIUM style)

Inferences

Gaps


(b) Resolution and detail tiers: how each changes what is readable, and scaling on phones

Takeaway

Internal resolution sets the “detail budget”. At 128x128 or 160x144 one pixel is a feature (an eye, a hand), and characters at 8 to 16 px are mostly silhouette and color. At 320x180 or 384x216, characters at 16 to 32 px get faces and secondary motion. At 480x270 or 640x360, a pixel stops being individually meaningful, and charm depends on clean clusters, restrained palettes and a deliberate “detail budget”. On phones, the 16:9 family (320x180, 384x216, 480x270, 640x360) scales to 1080p and 1440p by integers. Phone aspect ratios (19.5:9 to 20:9, with safe-area insets) mean you either pillarbox, letterbox, or render a variable-width internal canvas.

Cited Findings

Inferences

Gaps


(c) Palette and color science usable in code

Takeaway

Build and judge palettes in OKLab or OKLCH, which is perceptually uniform and has better hue linearity than CIELAB. Generate ramps by stepping L evenly, arcing chroma (peak in the middle), and rotating hue (Slynyrd: up to about 20° per swatch, warmer as it gets lighter). Store art as indexes, so palette swaps are free. When mapping arbitrary colors onto a fixed palette, use OKLab distance, and dither with ordered patterns (Bayer, blue noise, or pattern dithering), because error diffusion (Floyd–Steinberg) shimmers when anything moves.

Cited Findings

OKLab (Björn Ottosson)

Ramps and palettes

Indexed rendering and palette swaps

Quantization

Dithering

Inferences

Gaps


(d) Camera perspectives and projections: math, depth sorting, assets, cost and procedural fit

Takeaway

Most phone pixel games need only parallel projections: side view, top-down, 3/4 oblique and 2:1 dimetric. These cost little in canvas (blits plus a sort) and fit procedural tile content best. The pseudo-3D family (Mode 7 floors, raycasting, pseudo-3D roads, voxel space) is cheap per column or per scanline and was built for weak hardware, so it runs fine in plain JS at 320x180 using an ImageData framebuffer. Sprite stacking and billboards add depth cheaply. Fez-style rotation needs a 3D world model, rendered orthographically from four sides.

Cited Findings

Inferences

Per-perspective sheet. The cited items above give the math; the rest is standard practice, noted as general knowledge.

Gaps


(e) How style choices interact with procedural generation

Takeaway

Generation forgives more as resolution falls and as palettes tighten. At 8 to 16 px and 4 to 16 colors, the eye fills gaps, and random variation reads as character, not error. Strict palettes and fixed ramps hide noise because every output snaps to a designed color. Flat color with an outline style tolerates generated shapes far better than painterly or hi-bit styles, whose appeal depends on hand-placed clusters and anti-aliasing. Hardware-style constraints double as validators: a generated asset that breaks the palette, the colors-per-tile cap or the cluster rules can be rejected or repaired automatically.

Cited Findings

Inferences

Gaps