Tilbake til tidslinjen
hobby feb 2022

Et spill som tegner seg selv i ASCII

Et C++-spill laget under en folkehøyskole-game-jam, med en CUDA-akselerert ASCII-shader mellom rendereren og skjermen. Shaderen plukket det beste tegnet for hver pikselflekk i sanntid, og den samme kjernen kunne lese webkameraet og gjøre ansiktet ditt om til typografi.

Ideen

En "kodesone" i spillet vekslet rendereren til ASCII-modus. Ikke det vanlige lyshets-binningstrikset, men en treff-per-flekk mot et lite tegnatlas som kjørte på GPU-en, så det holdt seg på frame-rate.

Hvordan shaderen virker

  • Framebufferen deles i flekker på størrelse med en tegncelle.
  • Hvert tegn i atlaset er forhåndsrendret til en tensor i samme størrelse.
  • For hver flekk vurderer kjernen hvert tegn ut fra strukturell likhet og velger det beste treffet.
  • Hvis en flekk er hvit bare langs underkant, lander den på _, fordi det er tegnet hvis massefordeling matcher.

Trikset var å gjøre dette billig nok til å kjøre per bilde. CUDA, scoring per blokk og et lite atlas fikk det godt under et millisekund ved 1080p.

Webkameramodus

Kjernen bryr seg ikke om innholdet, så å gi den et webkamerabilde i stedet for framebufferen fungerer rett ut av esken. Live ASCII-selfie:

Live ASCII-webkamera, drevet av samme kjerne.

Hva jeg ville sett på igjen

Matchingen er rent strukturell. Den vet ikke at O og 0 ser nesten like ut. Et lite perseptuelt ledd, eller å kjøre scoringen mot et kantkart, ville rydde opp i typografien. Atlaset var også bare monospace. Med en proporsjonal font og en smartere pakker er det mer visuell variasjon å hente.

Tilbake til tidslinjen