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.

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:
- 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.
- Estrazione di feature: alcuni layer convoluzionali estraggono feature locali dai dati di colore/depth/motion del frame corrente.
- Campionamento della history: l'output del frame precedente viene campionato alle posizioni reprojected usando i motion vector. Già a risoluzione (alta) di output.
- 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.
- Ricostruzione: un percorso di decoder fa upsampling delle feature fuse alla risoluzione di output e produce il colore high-res.
- 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).

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:
- 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).
- 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.
- 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.

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.