DLSS Super Resolution: La Meccanica Reale

Non è magia. Reti convoluzionali, jitter, motion vector e Tensor Core.

DLSS è Deep Learning Super Sampling. Il nome "Super Sampling" è onesto: sta facendo super-sampling temporale, in spirito identico al TAAU, con una rete neurale che sostituisce le euristiche di ricostruzione calibrate a mano. Questo capitolo percorre cosa fa davvero l'algoritmo a runtime.

Generazioni, brevemente

DLSS ha avuto quattro revisioni maggiori:

  • DLSS 1.0 (2018, Battlefield V, Metro Exodus). Una CNN puramente spaziale addestrata per gioco. Funzionava da 1440p→4K ma sembrava sfocata e non piaceva. NVIDIA l'ha tranquillamente abbandonata.
  • DLSS 2.0 (2020). La riscrittura temporale. Ha preso la struttura del TAAU e sostituito le euristiche con una singola CNN generica addestrata su tutti i giochi. È la versione che ha reso famosa la tecnologia.
  • DLSS 3.5 (2023). Ha aggiunto il path Ray Reconstruction per i giochi path-traced, che sostituisce il denoiser ray-tracing separato del motore con una rete che fa denoise e upscale in un colpo solo. Stesso modello Super Resolution sotto.
  • DLSS 4 (2024–2025). Ha sostituito la CNN con un vision transformer. Ricostruzione delle feature sottili significativamente migliore e meno ghosting; costo leggermente più alto. Retrocompatibile i vecchi giochi possono optare in scambiando la DLL.

Quando diciamo "DLSS" senza qualifiche nel resto del corso, intendiamo DLSS 2 in poi. L'approccio DLSS 1 è morto.

Cosa il motore deve dare a DLSS

DLSS non è una black box che colleghi al framebuffer. È una libreria (una .dll / .so NGX di NVIDIA) che il motore chiama con input specifici:

Input Cos'è
Colore low-res Il frame attuale appena rasterizzato, a risoluzione interna (es. 1080p), con jitter applicato alla matrice di proiezione
Depth Il depth buffer dello stesso frame
Motion vectors Movimento per-pixel, alla stessa risoluzione del colore, in unità di pixel
Jitter offset Il jitter sub-pixel del frame attuale, in (x, y)
Exposure Il valore di esposizione del frame attuale (per consapevolezza tonemap)
(Opzionale) Bias / sharpness Parametri di tuning
History L'output DLSS precedente (DLSS la gestisce internamente)

Se qualcuno di questi è sbagliato, DLSS produrrà artefatti visibili. Motion vector sbagliati → ghosting. Niente jitter → niente anti-aliasing. Scaling della depth sbagliato → errori di disocclusion. Colore tonemapped quando DLSS si aspetta lineare (o viceversa) → flicker. La maggior parte dei bug DLSS nei giochi pubblicati sono lato motore, non lato rete.

Diagramma che mostra sei piccole texture che confluiscono in un blocco etichettato 'DLSS Super Resolution': colore low-res con jitter, depth buffer, motion vectors, jitter offset come singolo vettore 2D, exposure come scalare, e history buffer come freccia ricorrente dall'output all'input. Il blocco produce una singola immagine di colore high-res. Infografica pulita, sfondo scuro, etichette monospace.
DLSS si aspetta sei input ogni frame sbagliarne uno è la causa della maggior parte degli artefatti nei giochi shippati.

Preset di qualità e risoluzioni interne

DLSS espone preset di scaling che mappano a rapporti fissi di risoluzione interna:

Preset Scala interna Esempio (4K out)
DLAA 100% 3840×2160 in → 3840×2160 out
Quality 67% 2560×1440 in → 3840×2160 out
Balanced 58% 2227×1253 in → 3840×2160 out
Performance 50% 1920×1080 in → 3840×2160 out
Ultra Performance 33% 1280×720 in → 3840×2160 out

La rete è la stessa per tutti i preset. Cambia solo il rapporto tra pixel di input e di output. I preset più aggressivi chiedono alla rete di inventare di più, quindi gli artefatti diventano più visibili, ma la matematica sottostante è identica.

Cosa fa davvero la rete

Internamente, DLSS è una CNN relativamente piccola (modello Super Resolution) o un transformer (DLSS 4). Il reverse engineering di dominio pubblico e le presentazioni GDC di NVIDIA suggeriscono che la struttura sia approssimativamente:

  1. Pre-processing: tonemappa il colore di input così la rete vede uno spazio percettivamente uniforme, annulla l'offset di jitter (campiona la texture come se fosse senza jitter), impacchetta gli input in un singolo tensore.
  2. Estrazione di feature: alcuni layer convoluzionali estraggono feature locali dai dati di colore/depth/motion del frame corrente.
  3. Campionamento della history: l'output del frame precedente viene campionato alle posizioni reprojected usando i motion vector. Già a risoluzione (alta) di output.
  4. Fusione: le feature del frame corrente e quelle della history reprojected sono fuse concatenate e passate attraverso una piccola sotto-rete di fusione. Qui la rete decide, per pixel, quanto fidarsi della history.
  5. Ricostruzione: un percorso di decoder fa upsampling delle feature fuse alla risoluzione di output e produce il colore high-res.
  6. Post-processing: untonemap per riportare l'output nello spazio pre-tonemap del motore, così il motore può applicare il suo tonemap + bloom + film grain sopra.

Nella versione transformer (DLSS 4) gli stage conv sono sostituiti da blocchi di attention che operano su patch dell'immagine, il che è meglio per modellare relazioni a lungo raggio utile per le feature sottili (un cavo da 1 pixel che attraversa lo schermo).

Diagramma architetturale a livello di blocchi della DLSS Super Resolution: input (color, depth, motion, history) a sinistra, che fluiscono attraverso 'Feature Extraction' (blocchi conv), poi un blocco 'Fusion' al centro che fonde le feature della history, poi 'Reconstruction' (blocchi conv trasposta e upsample), poi l'output di colore high-res a destra. Etichettato. Infografica tecnica pulita, tema scuro, accenti verde neon in stile NVIDIA.
Encoder → fusione con la history reprojected → decoder la stessa forma per le varianti CNN (DLSS 2/3) e transformer (DLSS 4).

Come viene addestrata

NVIDIA addestra DLSS offline su un supercomputer usando:

  • Input: frame a bassa risoluzione catturati da molti giochi reali, con gli stessi dati per-frame che il motore fornirebbe a runtime (color, depth, motion, jitter, exposure).
  • Target: frame ad alta risoluzione corrispondenti renderizzati a 16× super-sampling cioè il motore ha renderizzato ogni pixel dell'immagine target come la media di 16 campioni con jitter. Queste sono le "ground truth" che la rete deve riprodurre.
  • Loss function: una combinazione di L1 pixel-space, una loss percettiva (feature VGG) e una loss di consistenza temporale che penalizza il flicker tra frame consecutivi di output.

I dati di training sono curati per includere tutti i casi che gli umani trovavano difficili da gestire movimento veloce, feature sottili, fogliame, effetti particellari, superfici trasparenti così la rete spende capacità extra su di loro.

Per questo DLSS a volte sembra meglio del nativo: la ground truth con cui è stata addestrata ha più campioni per pixel di quanti qualsiasi renderer real-time possa permettersi. Un'immagine 4K nativa con 1 campione per pixel ha aliasing. L'output DLSS 4K sta approssimando un'immagine a 16 campioni per pixel. Quindi nelle regioni in cui ha successo, è davvero più nitido del nativo + TAA.

Cosa la rete non fa

DLSS è una rete di ricostruzione immagine 2D. Non capisce geometria 3D, materiali, illuminazione o semantica della scena. Non fa girare un piccolo renderer dentro di sé. Comuni fraintendimenti da sfatare:

  • DLSS non fa ray-tracing. (Quella è Ray Reconstruction, una rete separata in DLSS 3.5+.)
  • DLSS non sa cos'è un viso, una macchina o una recinzione solo quali forme tendono a ricorrere nella distribuzione di training.
  • DLSS non chiede al motore di re-renderizzare niente. È strettamente un post-process.
  • DLSS non vede le tue texture a piena risoluzione solo l'output low-res renderizzato. Il dettaglio delle texture viene dalla normale selezione di mipmap del motore.

Dove sbaglia

Tre famiglie di artefatti dominano le lamentele degli utenti:

  1. Ghosting: un oggetto in movimento lascia una scia tenue. Causa: history non invalidata quando dovrebbe esserlo di solito perché il motion vector sotto la scia è sbagliato (punta allo sfondo statico invece che all'oggetto in movimento, o viceversa).
  2. Rottura delle feature sottili: linee elettriche, antenne, capelli sfarfallano o spariscono. Causa: a risoluzioni interne più basse, la feature è sub-pixel per troppi frame perché si accumuli; la rete si arrende invece di inventare.
  3. Fizzle di disocclusion: quando qualcosa viene scoperto (la camera si muove oltre un pilastro) la regione appena visibile sembra rumorosa per qualche frame finché la rete non ha abbastanza campioni. È fondamentale e inevitabile.
Illustrazione a 3 pannelli che mostra artefatti DLSS comuni come crop zoomati: una scia di ghosting dietro un personaggio in movimento contro un muro, una linea elettrica sottile che si spezza in tratteggi in movimento, e una regione di disocclusion dietro un oggetto in primo piano in movimento che mostra rumore e fizzle. Ognuno etichettato col nome dell'artefatto. Comparazione tecnica pulita, sfondo scuro.
Le tre famiglie di artefatti che dominano le lamentele degli utenti tutte tracciabili a precise modalità di fallimento della rete.

Perché DLSS è legato all'hardware NVIDIA

La rete gira efficientemente solo sui Tensor Cores. Senza di loro, la matematica matriciale ricade sugli shader core general-purpose e il costo gonfia a 5–10 ms per frame, il che vanificherebbe lo scopo. Le GPU AMD non hanno Tensor Cores; le GPU Arc di Intel hanno unità XMX che sono concettualmente simili ma incompatibili a livello software. Questa è la ragione (vera, tecnica) per cui DLSS è solo NVIDIA e la ragione per cui esistono FSR 2/3 e XeSS come alternative, che vedremo nel capitolo 11.

Nel prossimo capitolo guardiamo il fratello di cui quasi nessuno parla: DLAA, che è la stessa rete configurata per fare anti-aliasing senza upscaling.