come funziona l'HDR?


17

Sto cercando di capire cos'è l'HDR e come funziona.

Comprendo i concetti di base e ho una leggera idea di come viene implementato con D3D / hlsl.

Tuttavia è ancora piuttosto nebbioso.

Supponiamo che stia riproducendo una sfera con una trama della terra e un piccolo elenco di vertici che funga da stelle, come potrei renderlo in HDR?

Ecco alcune cose di cui sono confuso:

  • Immagino, non posso usare solo un formato immagine di base per la trama poiché i valori sarebbero limitati a [0, 255] e bloccati a [0, 1] in uno shader. Lo stesso vale per il back buffer, presumo che il formato debba essere un formato in virgola mobile?

  • Quali sono gli altri passaggi coinvolti? Sicuramente ci deve essere qualcosa di più del semplice uso di formati a virgola mobile per eseguire il rendering su una destinazione di rendering e quindi applicare un po 'di fioritura come processo post? (considerando che l'output sarà comunque di 8 pb)

Fondamentalmente, quali sono i passaggi per l'HDR? Come funziona ? Non riesco a trovare buoni articoli / articoli che descrivano il processo, oltre a questo , ma sembra sfogliare un po 'le basi, quindi è confuso.

Risposte:


19

Le tecniche HDR ti consentono di simulare una gamma di dettagli maggiore di quella che puoi visualizzare sullo schermo rispetto alle tradizionali luci / trame. Puoi confrontarlo con il comportamento dell'occhio quando esposto a diverse quantità di luce - quando c'è troppa luce l'occhio lascia entrare meno luce in modo che le cose siano ancora nel tuo raggio visibile. Quando non c'è abbastanza luce, l'iride si apre di più in modo da poter vedere più dettagli.

bit-tech.net Confronto HDR

Il lato destro di questa immagine sta usando l'HDR. Sfrutta maggiormente la gamma di colori, i colori scuri sono più scuri e le aree chiare sono più luminose. In confronto il lato sinistro dell'immagine sembra un po 'piatto.

I passaggi di base sono:

  1. Rendi la tua scena su texture a virgola mobile (con un formato come A16B16G16R16F) usando altre trame a virgola mobile sui tuoi modelli e / o luci che potrebbero avere una luminosità superiore a 1.0f.

  2. Per visualizzare questa trama, la gamma di colori visibili deve essere convertita in qualcosa di visualizzabile sullo schermo: questo processo è chiamato mappatura dei toni e una varietà di equazioni di mappatura dei toni diverse può essere utilizzata per ottenere effetti diversi. Questo è un must in quanto i monitor non possono visualizzare l'intera gamma di colori o luminescenza che possiamo memorizzare in texture in virgola mobile (sarebbe bello se fosse possibile, ma sarebbe anche un pericolo accecante ...).

  3. Bloom e altri effetti collaterali vengono aggiunti per esagerare ulteriormente la differenza di luminescenza delle cose rese. La fioritura viene calcolata dal buffer a virgola mobile e combinata con l'immagine mappata dei toni.

Spero possa aiutare


So che questa è una (molto) vecchia domanda, ma mi puoi riferire a un algoritmo di mappatura dei toni buono ma semplice?
JSQuareD,

6

Tecnicamente, HDR significa semplicemente utilizzare una gamma più ampia di valori possibili per la grafica. Di solito sei limitato a 256 valori discreti per i canali rosso, verde e blu, il che significa che se hai 2 elementi, uno due volte più luminoso dell'altro e un terzo che è 10.000 volte più luminoso del primo, non c'è in questo modo puoi rappresentare correttamente tutti e 3 nella stessa scena - o rendi l'oggetto luminoso solo 256x più luminoso del primo, oppure rendi entrambi gli oggetti opachi completamente neri (perdendo il contrasto tra loro) e quindi l'oggetto luminoso è infinitamente più luminoso di entrambi.

Questo è facile da risolvere usando i valori in virgola mobile per i valori rosso / verde / blu, ma ora hai il problema di come visualizzarlo su un dispositivo grafico che gestisce solo un numero fisso di valori discreti per canale (es. 256) . Quindi la seconda parte del problema è come mappare i valori in virgola mobile nell'intervallo limitato. La banale soluzione è ridimensionare tutti i valori in modo proporzionale nell'intervallo discreto, ma ciò significherebbe che 1 pixel molto luminoso potrebbe rendere nero il resto dello schermo, ecc. A volte questo è quello che vuoi, a volte no - vedi la mappatura dei toni di CiscoIPPhone link per esempi su come affrontare questo problema.

In genere non sono le tue trame che devono essere archiviate in un nuovo formato - è quando viene applicata l'illuminazione ad esse che devi essere in grado di ospitare valori più grandi. Ovviamente comunque se hai fonti di luce cotte in una trama - ad es. uno sfondo stellato - potresti volere un formato di risoluzione più elevato lì. O fai semplicemente in modo che lo shader ridimensioni i valori di tali materiali quando arriva il momento di renderli.


5

I computer rappresentavano tradizionalmente ogni pixel sullo schermo come solo 24 bit in memoria: 8 per il rosso, 8 per il verde e 8 per il blu. Questo è quasi abbastanza bit che un essere umano non noterebbe se ne aggiungessi altri, e il byte a 8 bit è molto conveniente per i microprocessori, quindi è quello che ha bloccato.

Mentre 8 bit è quasi una precisione sufficiente per visualizzare un'immagine, non è sicuramente sufficiente per calcolare un'immagine. In vari punti durante il calcolo di un'immagine, sono richiesti almeno 32 bit di precisione.

Questo è il motivo per cui i pixel shader calcolano i colori con precisione a 32 bit, anche quando si esegue il rendering in un'immagine di precisione a 8 bit. Altrimenti, ad esempio, non è possibile dividere un valore per 1000 e successivamente moltiplicarlo per 1000, poiché la divisione di qualsiasi valore a 8 bit per 1000 risulta in zero.

Vi è stata una tendenza nella grafica 3D in tempo reale verso il mantenimento di tutta la grafica con precisione> 8 bit fino all'ultimo momento possibile, momento in cui gli> 8 bit di rosso vengono sottoposti a downsampling a 8 bit e così via per il verde e il blu.

HDR si riferisce all'atto del rendering di immagini con una precisione superiore a 8 bit. Nei videogiochi TV contemporanei, la precisione a 16 bit è la norma e questo può essere "sufficiente" nei videogiochi per gli anni a venire.


2

Un aspetto di cui penso sia la chiave per l'HDR è l'applicazione corretta della gamma monitor.

Il monitor che stai guardando produce luce in funzione dei pixel di input. Potresti aspettarti che un pixel con valore 255 produca (circa) 255 volte più luce di un pixel con valore 1. Questo non è il caso. Con una gamma standard di monitor di 2,3, è 255 ^ 2,3 volte più luminosa, o circa 340000!

Chiunque produca contenuti (produttori di macchine fotografiche) lo sa o (se sei un designer) lo compensi implicitamente.

Questo va bene se rendi semplicemente le bitmap (beh, la maggior parte delle volte), ma se le usi come trame in una scena 3D è una storia diversa. Se si desidera modellare correttamente l'interazione con la luce, è necessario utilizzare i calcoli della luce lineare in tutta la pipeline di rendering. Questo significa

  • correggendo le trame per gamma

  • renderizza tutto con luce lineare (dove hai bisogno di molta precisione grazie all'elevata gamma dinamica di luce),

  • applicare la trasformazione gamma inversa del monitor come ultima cosa prima di mettere l'immagine sullo schermo.

Quando apporti questa modifica a una scena esistente, con opere d'arte, luci, ecc. Esistenti, probabilmente devi correggere molte intensità e trame della luce, perché sono state scelte per apparire belle quando si riproduce con luce non lineare. Quindi non è una funzione che puoi semplicemente "attivare" e aspettarti che tutto appaia meglio così.


2
La gamma è sicuramente importante e la chiave per ottenere correttamente il rendering basato fisicamente, ma non ha direttamente a che fare con HDR, IMO.
Nathan Reed,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.