Vai al racconto
Vista dal cielo, una megattera scivola accanto a una piccola barca a remi di legno, su un mare blu profondo segnato dall’onda lunga.

Come è nato

Dérive

Come un solo paio di mani ha dipinto un oceano senza fine in una pagina web, e gli ha insegnato a respirare.

Thibaud Perrin — ideazione, codice, modelli 3D, musica

Dérive è nato dal desiderio di un gioco gentile sull’oceano. Non un gioco da vincere: un posto dove lasciarsi andare alla deriva, dove una balena passa sotto la barca perché andava da quella parte, e tu smetti di remare per guardarla.

Dérive è una barca a remi vista dal cielo, su un mare che non finisce mai. Remi, guardi, e riempi il taccuino di Élise Marceau, una naturalista partita nel 1911 le cui pagine tornano a galla dentro bottiglie. Non ci sono punteggi né orologi. Il mare si prende il tempo che gli serve.

È l’opera di una sola persona: l’ideazione, ogni riga di codice, ogni animale e ogni scenario modellati in Blender, la direzione artistica e la musica. Gira in un browser, su un telefono come su una scrivania, senza niente da installare e senza alcun server dietro. Questa pagina racconta come è stato fatto, e perché ha questo aspetto.

Un mare dipinto pixel per pixel

In Dérive non c’è nessuna immagine del mare. A ogni fotogramma, uno shader WebGL2 calcola da zero ogni pixel dell’acqua: due bande di onda lunga, due ottave di increspature del vento, sommate in un’altezza, e la pendenza esatta di quell’altezza sotto ogni singolo pixel. La luce nasce da quella pendenza. Dove una piccola faccetta d’acqua si inclina proprio quanto basta per rimandarti il sole negli occhi, brilla.

È così che funziona lo scintillio. A mezzogiorno, un sottile luccichio bianco su tutta la vista. Quando il sole è basso, i bagliori si allungano in tratti d’oro nella sua direzione e si raccolgono in una lunga strada di luce che arriva dal suo lato, come quella vera che ti segue lungo una spiaggia. Di notte, un esile sentiero d’argento sotto la luna.

La barca sola su un’acqua scura verde-azzurra all’ora dorata, i riflessi del sole sparsi sull’onda in centinaia di piccole pagliuzze d’oro.
Il Grande blu all’ora dorata: ogni pagliuzza d’oro è una faccetta d’acqua che rimanda il sole

Poi l’intera immagine passa per uno strato dipinto. I suoi colori vengono stesi lungo un campo di pennellate che deriva con il mare, sbalzati un poco, granulosi come la carta, così che l’oceano si legga come un acquerello e non come un render. La pennellata si misura in pixel dello schermo, non in pixel di render: quando un telefono stanco deve disegnare la scena a metà risoluzione, la pittura conserva lo stesso pennello.

Farlo girare a sessanta fotogrammi al secondo su un telefono è stata la parte più grande del lavoro. Ciò che cambia nell’arco dei metri anziché dei pixel (dove sono le scogliere, in quale mare ti trovi, le grandi ombre dell’onda lunga) viene disegnato una volta per fotogramma in piccole texture, a un ottavo della grandezza, e riletto filtrato: tre letture di texture invece di dodici-venti calcoli di rumore per pixel, cinque millisecondi risparmiati a fotogramma sopra i bassifondi. Il mare, il fondale, le creature e ciò che galleggia stanno in sei chiamate di disegno prima dello strato dipinto, più una per ogni modello 3D sullo schermo.

Il mare doveva sembrare dipinto, mai calcolato. E doveva restare dipinto anche sul telefono più piccolo.

Un giorno dura dieci minuti: un minuto d’alba, cinque di giorno, un minuto e mezzo di crepuscolo, due e mezzo di notte. I colori non si limitano a scurirsi. Ogni ora ha la sua tavolozza, accompagnata lungo delle curve: blu freddo e poi rosa all’alba, oro e poi viola al crepuscolo. Il tempo che fa dipende dal mare e dall’orologio, così chiunque navighi insieme sullo stesso mare vede la stessa pioggia nello stesso istante, senza che nulla passi tra loro.

  • La laguna all’alba, velata di rosa pallido.l’alba
  • La stessa laguna nell’oro del tardo pomeriggio.l’ora dorata
  • La stessa laguna al crepuscolo, diventata viola.il crepuscolo
  • La stessa laguna di notte, in un blu profondo.la notte
Una sola laguna, la barca ferma, quattro ore dello stesso giorno di dieci minuti

Un fondale che cresce da sé

Sotto i bassifondi ci sono praterie di fanerogame, teste di corallo nella laguna, foreste di kelp piegate dalla risacca. Niente di tutto questo è modellato, e niente è salvato. Cresce sulla scheda grafica, a ogni fotogramma, a partire da semplici numeri.

Il trucco è che il fondale non ha alcun buffer di vertici. Il fondo è tagliato in celle larghe sei metri, ancorate al mondo. Lo shader dei vertici riceve soltanto il proprio indice, gl_VertexID, e da lì ricava a quale cella appartiene e quale posto occupa al suo interno. Un piccolo hash della cella e del posto dà al filo d’erba un luogo, una lunghezza, un’inclinazione. Poi guarda quanto è fitta la prateria in quel punto: se è rada, il filo si ripiega in un triangolo di dimensione zero e la scheda grafica lo salta.

Otto celle di fondale, di sei metri ciascuna: in ogni cella gli stessi posti diventano un luogo tramite un hash; dove la prateria è fitta diventano fili d’erba, dove si dirada si ripiegano nel nulla.
Otto celle di sei metri: gli stessi posti in ciascuna, tenuti come fili d’erba dove la prateria è fitta, ripiegati nel nulla dove si dirada

Una cella di prateria contiene fino a 640 fili, di cinque vertici ciascuno. Non sono istanziati: le istanze minuscole costano alla scheda grafica per istanza, non per vertice, così i fili sono disegnati uno dopo l’altro in un’unica lunga striscia di triangoli, uniti da triangoli degeneri. Misurato, la stessa prateria costa così circa il quaranta per cento in meno. Scorri sull’immagine qui sotto per sollevare la prateria dalla sabbia.

Lo stesso punto senza il suo fondale: acqua tinta di verde sopra increspature di sabbia nuda. Una prateria marina vista dall’alto, migliaia di fili pettinati dalla corrente, la barca nel mezzo.
con il fondalesenza

I fili si piegano con la corrente, in bande che rotolano attraverso la prateria. E si accorgono di te. Ogni creatura e la barca stessa vengono impresse, a ogni fotogramma, in una piccola texture di disturbo che si ripete ogni ottanta metri e svanisce un poco alla volta: vicino al fondo, vicino alla superficie, nel mezzo. I fili si coricano e si scostano da ciò che passa, gli anemoni si ritraggono, la volta di kelp si apre attorno allo scafo e si richiude dietro di lui.

La barca attraversa una prateria marina, la scia alle spalle, mentre i fili si muovono sotto di lei.
A remi attraverso le Praterie marine
La barca si insinua in una foresta di kelp tra massi di granito, fronde dorate distese in superficie.
Insinuarsi nella foresta di kelp, oltre un faraglione

Ogni mare ha il suo fondale. Nella laguna, coralli cervello e coralli a tavola, corna di cervo dalle punte chiare, gorgonie e coralli molli che ondeggiano, tutto in rosa sbiaditi, ocra e crema, raccolti in tonde teste di corallo sopra la sabbia. Nella foresta di kelp, stipiti d’oro oliva salgono dai loro ancoraggi verso fronde distese appena sotto la superficie, sopra un granito incrostato di corallina rosa e di stelle marine, e l’acqua tra loro si scurisce e si fa torbida quanto più scendono.

Una laguna turchese sopra una scogliera di coralli tondeggianti in tenui toni pastello, la barca alla deriva sopra.
Le teste di corallo della laguna
Una foresta di kelp vista dall’alto: fronde dorate sopra scogli scuri e ciottoli chiari.
La foresta di kelp, piegata dalla risacca

Creature che nuotano, non che scivolano

Pesci, squali, tartarughe, razze e balene vivono in una piccola simulazione scritta in Rust e compilata in WebAssembly. È minuscola di proposito: niente libreria standard, niente allocatore, niente importazioni, tutto il suo stato in un unico blocco fisso di memoria, così la pagina legge le posizioni delle creature direttamente da lì senza copiare un solo byte. Compilata, pesa 11,7 kilobyte. I banchi seguono la loro guida, gli squali girano in tondo, le balene risalgono verso la superficie nei secondi prima di respirare e soffiano solo quando hanno il dorso vicino a lei. Una copia della stessa simulazione in JavaScript prende il testimone dove WebAssembly è bloccato, e un test le fa avanzare entrambe allo stesso passo perché non si separino mai.

Poi ogni animale deve muoversi come se stesso. Ogni modello nasce in Blender pensando già alla sua nuotata: pesi dipinti nei colori dei vertici, rosso per l’onda del corpo, verde per le pinne o le ali, blu per le parti sottili che fremono. Lo shader dei vertici manda un’onda dalla testa lungo il corpo, batte le pinne, fa increspare i bordi e legge la virata della creatura da un fotogramma all’altro, così la spina dorsale si curva lungo l’arco che nuota e il corpo si inclina nella curva. Una balena gira in un lungo arco della sua stessa lunghezza; una manta inclina le ali come un aliante.

Dal vivo, nel tuo browser: il modello del gioco con la sua nuotata. Trascinalo per farlo girare. Megaptera novaeangliae

La profondità si dipinge, non si sfuma. Un corpo sott’acqua non è mai trasparente: il dorso prende più luce dei fianchi, il colore dell’acqua guadagna terreno punto per punto, i bordi se ne vanno per primi, e di giorno i riflessi del sole scorrono sui dorsi vicini alla superficie. Vista dal cielo, una balena a dodici metri di profondità è una forma che intuisci prima di vederla.

Alcuni animali li incontri solo con la pazienza. Resta calmo accanto a loro, remi fermi, l’esca giusta in acqua, e l’incontro si riempie come un respiro trattenuto. Quando si compie, la balena risponde con uno sbuffo accanto alla barca. Se navighi con degli amici, vale anche per loro.

Il taccuino: prima la matita, poi l’acquerello

Ogni animale che incroci entra nel taccuino di Élise: cinquantuno specie, tutte esistenti tranne una. Il modo in cui il taccuino le disegna segue quanto bene le conosci. Incrociata una volta, uno schizzo a matita: un doppio contorno incerto, un tratteggio secondo la luce, la grafite impigliata nella grana della carta. Vista abbastanza spesso, arrivano i suoi colori. E quando macini i pigmenti che le servono con ciò che il mare ti dà (la madreperla per il bianco, il vetro di mare per il blu, la ruggine per l’ocra, la fuliggine per il nero), diventa una tavola ad acquerello: velature che sbordano dal contorno, pigmento raccolto sui bordi bagnati, il dorso illuminato lasciato in carta nuda.

Nessuna di queste tavole è stata dipinta a mano. Il gioco le ricava dagli stessi modelli 3D che nuotano nel suo mare, in due passate sui colori e sulla forma del modello, la prima volta che apri la pagina.

Uno schizzo a matita di una megattera, un tratteggio sopra un contorno incerto. incrociata: la matita
La stessa megattera come tavola ad acquerello, nei grigi e nei blu. dipinta: l’acquerello

Il caricamento, ad acquerello

Un gioco deve caricare. Qui l’attesa ne fa parte. La pagina si apre sulla carta; l’inchiostro scrive «Dérive» lettera dopo lettera, poi una velatura ad acquerello si allarga su una di quattro carte nautiche dipinte, e quella velatura è la barra di avanzamento. Quando il mare dietro è pronto, scegli se entrare con il suono o in silenzio, e la carta dipinta si tuffa nell’oceano vivo.

La velatura è uno script di ventidue kilobyte con il suo piccolo programma WebGL: sette macchie che avanzano attraverso uno spostamento strappato, una fascia più scura di pigmento bagnato sul loro fronte, la carta che vortica e si posa man mano che si riempie. Gira in un worker su una tela fuori schermo, così l’avvio pesante del gioco non la fa mai incespicare. I due caratteri del titolo sono incorporati nella pagina, ridotti a uno o due kilobyte, perché l’inchiostro scriva fin dal primissimo disegno.

La schermata di caricamento all’inizio: «Dérive» a inchiostro su carta color crema, una carta nautica ad acquerello velata solo a metà, i bordi ancora strappati. La stessa schermata pochi secondi dopo, tutta la carta nautica velata attorno al titolo.
Continua a scorrere: la carta si vela, come mentre il mare carica

Un mondo senza server

Dérive è un sito statico. Non c’è un server di gioco, nessun database, niente da tenere acceso. Ogni mare nasce da un solo numero, leggibile come un breve codice tipo J9C-HA4W: lo stesso codice dà le stesse scogliere, la stessa gente, lo stesso tempo, su qualunque dispositivo. Il tuo taccuino vive sul tuo dispositivo. Se crei un account, la tua partita viene cifrata e firmata sul tuo dispositivo prima che una copia sia lasciata su relay pubblici, così nessun altro può leggerla, nemmeno l’autore del gioco.

Navigare insieme funziona allo stesso modo. Le barche si trovano attraverso quei relay e poi si parlano direttamente, da browser a browser, via WebRTC; il codice della partita è anche la sua password. Lo stato di una barca sta in cinquantadue byte, dieci volte al secondo. Chi guida un gruppo simula le creature per tutti quelli vicini, così guardate tutti la stessa balena.

E il mare è davvero senza fine. I numeri in virgola mobile perdono precisione lontano dall’origine, e a cinquanta chilometri i pesci più lenti si sarebbero congelati. Così il mondo si ricentra in silenzio sulla barca mentre remi, e resta esatto fino a sedicimila chilometri: quattro mesi di remi in linea retta.

In qualche numero

Fotogrammi al secondo, su un telefono60
La simulazione delle creature, compilata11,7 KB
Fili d’erba in una cella di sei metri640
Specie nel taccuino di Élise51
Mari possibili, ciascuno da un solo numero4,3 miliardi
Chilometri prima che il mare perda precisione16.000
Server da tenere accesi0

La musica

La musica è stata composta per il gioco. Ognuno degli otto mari ha il suo brano: quello della laguna leggero e caldo, quello dei mari freddi lento e ampio, quello degli abissi grave e paziente; la notte ha il suo, e una tempesta prende il sopravvento su tutto finché dura. Remando da un mare all’altro, i brani sfumano l’uno nell’altro in sei secondi, e si abbassano un po’ quando si avvicina uno squalo.

Il resto del suono lo crea il browser dal vivo: il fruscio del mare, il cigolio dei remi, il respiro delle balene, la pioggia, il tuono che rotola qualche secondo dopo il lampo, più lontano o più vicino. Con le cuffie è meglio.

«Accueil», il tema della schermata di benvenuto — Thibaud Perrin

Il mare ti aspetta.

Dérive è gratuito, nel tuo browser, su un telefono o su una scrivania. Cuffie in testa, remi in acqua.

Prendi il mare

Ho fatto Dérive da solo: ogni riga di codice, ogni animale e ogni relitto modellati in Blender, ogni nota della musica. È stato un lavoro lento, e felice; spero che un po’ di quella calma ti raggiunga, remi fermi, mentre passa una balena. — Thibaud Perrin. Qualcosa da dirmi? Scrivimi.