Condividi tramite


Uso della correzione gamma

La correzione gamma, o gamma, è il nome di un'operazione non lineare usata dai sistemi per codificare e decodificare i valori pixel nelle immagini.

Che cos'è gamma e cosa serve?

Alla fine della pipeline grafica, proprio dove l'immagine lascia il computer per completare il percorso lungo il cavo del monitor, c'è un piccolo componente hardware in grado di trasformare i valori dei pixel in tempo reale. Questo hardware usa in genere una tabella di ricerca per trasformare i pixel. Questo hardware usa i valori rosso, verde e blu provenienti dalla superficie da visualizzare per cercare i valori con correzione gamma nella tabella e quindi invia i valori corretti al monitor invece dei valori effettivi della superficie. Quindi, questa tabella di ricerca è un'opportunità per sostituire qualsiasi colore con qualsiasi altro colore. Anche se la tabella ha tale livello di potenza, l'utilizzo tipico consiste nel modificare le immagini in modo secondario per compensare le differenze nella risposta del monitoraggio. La risposta del monitor è la funzione che mette in relazione il valore numerico dei componenti rosso, verde e blu di un pixel con la luminosità visualizzata del pixel.

Questo è ciò che questa tabella era destinata, ma gli sviluppatori di giochi hanno trovato usi creativi per esso, ad esempio lampeggiando l'intero schermo rosso per effetto psicologico. Nelle app di gioco moderne, come parte della post-elaborazione di ogni fotogramma, in genere forniamo altri modi per eseguire queste operazioni. Infatti, ti consigliamo di lasciare solo la tabella gamma perché potrebbe essere in uso per calibrare la risposta del monitor, e le modifiche all'ingrosso alla gamma rampa distruggeranno questa attenta calibrazione.

La scienza della determinazione della correzione gamma è complessa e non viene presentata qui, oltre a illuminare da dove proviene il nome "gamma". Una risposta di un monitor CRT (ovvero un vetro vecchio) è una funzione complessa, ma la fisica di questi monitor significa che mostrano una risposta che può essere crudelmente rappresentata da questa funzione di alimentazione:

brightness( input ) =gamma di input

Il valore gamma è in genere vicino a un valore pari a 2,0. I monitor LCD e tutte le altre tecnologie più recenti sono appositamente progettati per presentare una risposta simile in modo che tutti i nostri software e immagini non devono essere ricalibrati per queste nuove tecnologie. Lo standard sRGB dichiara che questo valore gamma è esattamente 2,2 e questo valore è diventato uno standard ampiamente implementato.

L'occhio umano ha anche una funzione di risposta che inverte approssimativamente la funzione di alimentazione CRT. Ciò significa che la luminosità percepita di un pixel aumenta approssimativamente linearmente con i valori RGB in quel pixel.

Poiché un valore gamma di 2.2 è diventato uno standard de facto, in genere non è necessario preoccuparsi troppo della curva gamma codificata in questa tabella e può lasciarlo come mapping lineare e uno-a-uno. La corrispondenza dei colori appropriata richiede naturalmente una cura squisita con questa funzione, ma tale discussione esula dall'ambito di questo argomento. Windows include uno strumento che consente agli utenti di calibrare i propri schermi in gamma 2.2 e questo strumento usa l'hardware della tabella di ricerca per derivare una modifica sottile scelta attentamente per i computer. Gli utenti possono eseguire questo strumento cercando "calibrare il colore". Esistono anche profili di colore ben definiti per monitor specifici che automatizzano questo processo. Lo strumento "calibra colore" può rilevare questi monitor più recenti e informare gli utenti che la calibrazione è già presente.

Questa nozione di codifica di una legge di potenza in valori di colore è utile anche altrove nella pipeline grafica, soprattutto nelle trame. Per le trame, vuoi una maggiore precisione sui colori più scuri a causa della risposta oculare umana logaritmica di cui abbiamo appena parlato. È importante gestire attentamente gamma in questa parte della pipeline. Per altre informazioni, vedi Conversione dei dati per lo spazio dei colori.

La parte restante di questo argomento è incentrata solo sulla correzione gamma in questa ultima parte della pipeline, tra i dati del buffer dei frame e il monitoraggio. Se vuoi scrivere una procedura guidata di calibrazione o per creare effetti speciali in un'app a schermo intero in cui un passaggio di post-elaborazione non è pratico, ecco le informazioni necessarie.

Sfondo di gamma in Windows

I computer Windows dispongono in genere di una tabella gamma che è una tabella di ricerca che accetta un triplo di byte e restituisce un triplo di byte. Queste triplette sono 768 (256 x 3) byte di RAM. Questo comportamento va bene quando il formato di visualizzazione contiene un triplo di valori BYTE RGB, ma non è sufficientemente espressivo per descrivere le trasformazioni che potrebbe essere necessario quando il formato di visualizzazione ha un intervallo maggiore di [0,1], ad esempio i valori a virgola mobile. Le API di Windows che controllano gamma hanno seguito un'evoluzione poiché i formati di visualizzazione sono diventati più complessi.

Le prime API Windows per offrire il controllo gamma sono l'interfaccia GDI (Graphics Device Interface) di Windows SetDeviceGammaRamp e GetDeviceGammaRamp. Queste API funzionano con tre matrici di 256 voci di WORD, con ogni codifica WORD zero fino a uno, rappresentato da valori WORD 0 e 65535. La precisione aggiuntiva di un word in genere non è disponibile nelle tabelle di ricerca hardware effettive, ma queste API sono state concepite per essere flessibili. Queste API, a differenza delle altre descritte più avanti in questa sezione, consentono solo una piccola deviazione da una funzione identity. Infatti, qualsiasi voce nella rampa deve essere entro 32768 del valore identity. Questa restrizione significa che nessuna app può trasformare il display completamente nero o in un altro colore illeggibile.

L'API successiva è SetGammaRamp di Microsoft Direct3D 9, che segue lo stesso modello e formato di dati di SetDeviceGammaRamp. Il valore predefinito della rampa gamma Direct3D 9 non è particolarmente utile; è una rampa di WORD inizializzata a 0-255, non 0-65535, anche se l'API è definita in termini di 0-65535.

L'API più recente è IDXGIOutput::SetGammaControl. Questa API offre uno schema più flessibile per esprimere il controllo gamma, in quanto adatta il set di formati di visualizzazione più ampio di DXGI, inclusi dieci bit interi per canale, formati float a 16 bit e il formato di intervallo esteso XR_BIAS.

Tutte queste API operano sullo stesso hardware e modificano gli stessi valori. Le API Direct3D 9 e DXGI sono "solo scrittura". Non è possibile leggere il valore dell'hardware, modificarlo e quindi impostarlo. È possibile impostare solo la rampa. Inoltre, è possibile impostare gamma solo quando l'app è a schermo intero. Questa restrizione è un altro modo per garantire che il desktop sia sempre leggibile. Ovvero, l'app può disturbare il proprio display, ma Windows ripristinerà la gamma precedente quando l'app perde lo schermo intero (ad esempio, tramite alt-tab o CTRL-ALT-CANC).

Evoluzione dell'hardware di visualizzazione

Alcuni monitor più recenti possono visualizzare un'ampia gamma di intensità. Tuttavia, quando il formato di visualizzazione può rappresentare solo valori compresi tra zero e uno, la visualizzazione deve eseguire il mapping di zero al valore più scuro e uno al valore più luminoso. Questo valore più luminoso potrebbe essere troppo luminoso per la visualizzazione confortevole delle pagine Web con testo nero su uno sfondo bianco, ma è meraviglioso per effetti speciali eccessivamente luminosi, come la visualizzazione della luce solare scintillante da un lago o un fulmine che forca il cielo. Quindi, abbiamo bisogno di un modo per esprimere questi intervalli più ampi. DXGI 1.1 e versioni successive contiene valori di formato di visualizzazione che consentono a 1.0 di rappresentare un valore bianco confortevole e riserva valori di formato di visualizzazione più ampi per effetti speciali eccessivamente luminosi. DXGI 1.1 supporta due formati di visualizzazione che possono esprimere questi valori più ampi: DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM e virgola mobile a 16 bit. Per una descrizione completa di questi formati, vedere Dettagli del formato esteso. Successivamente, vediamo perché l'API GAMMA IDXGIOutput::SetGammaControl di DXGI richiede valori pixel maggiori di 1,0.

Funzionalità di controllo gamma in DXGI

DXGI consente al driver di visualizzazione di esprimere i controlli gamma come funzione lineare passo per passo. Questa funzione lineare dettagliata è definita dai punti di controllo di questa funzione, dall'intervallo di valori in cui la funzione può eseguire la conversione e da un'operazione facoltativa di scalabilità e offset aggiuntiva che può essere applicata dopo la conversione. Un'app può chiamare il metodo IDXGIOutput::GetGammaControlCapabilities per recuperare tutte queste funzionalità di controllo nella struttura DXGI_GAMMA_CONTROL_CAPABILITIES .

Questo grafico mostra una funzione lineare con soli quattro punti di controllo.

funzione lineare di correzione gamma

DXGI definisce i punti di controllo in base alla posizione lungo l'asse dei colori della superficie. Nel grafico precedente, le posizioni dei punti di controllo sono 0, 0,5, 0,75 e 1,0. Questi punti di controllo indicano che l'hardware può convertire i valori nell'intervallo compreso tra 0 e 1,0. DXGI elenca questi punti di controllo nel membro della matrice ControlPointPositions di DXGI_GAMMA_CONTROL_CAPABILITIES e li dichiara sempre in ordine crescente. DXGI riempie solo i primi elementi della matrice ControlPointPositions e indica il numero di elementi con il membro NumGammaControlPoints di DXGI_GAMMA_CONTROL_CAPABILITIES. Se NumGammaControlPoints è minore di 1025, DXGI lascia il resto degli elementi ControlPointPositions non definiti.

L'hardware rappresentato da questo grafico può convertire i valori in un intervallo compreso tra 0 e 1,25. DxGI imposta quindi i membri MinConvertedValue e MaxConvertedValue rispettivamente su 0,0f e 1,25f.

DXGI imposta il membro ScaleAndOffsetSupported di DXGI_GAMMA_CONTROL_CAPABILITIES per indicare se l'hardware supporta la funzionalità di scalabilità e offset. Se l'hardware supporta la scalabilità e l'offset, mantiene una semplice tabella di ricerca uno-a-uno, ma regola l'output della tabella per estendere l'output a un intervallo maggiore di [0,1]. L'hardware ridimensiona innanzitutto i valori che escono dalla tabella di ricerca e quindi li sfalsa.

Nota

Monitor diversi connessi allo stesso computer potrebbero avere diverse funzionalità di controllo gamma. Inoltre, le funzionalità di controllo gamma possono infatti cambiare a seconda della modalità di visualizzazione dell'output. Di conseguenza, ti consigliamo di chiamare sempre IDXGIOutput::GetGammaControlCapabilities per eseguire query sulle funzionalità di controllo gamma dopo che l'app entra in modalità schermo intero.

 

È possibile usare questi valori di funzionalità di controllo gamma per derivare i valori di controllo che è possibile impostare usando l'API IDXGIOutput::SetGammaControl .

Impostazione del controllo gamma con DXGI

Per impostare i controlli gamma, si passa un puntatore a una struttura DXGI_GAMMA_CONTROL quando si chiama l'API IDXGIOutput::SetGammaControl .

Impostare i membri scale e offset di DXGI_GAMMA_CONTROL per specificare i valori di scala e offset da applicare all'hardware ai valori che si ottengono dalla tabella di ricerca. È possibile impostare in modo sicuro Scale su 1 e Offset su zero ( ovvero una scala di uno non ha alcun effetto e un offset pari a zero non ha alcun effetto) se non si vuole usare la funzionalità di ridimensionamento e offset o se l'hardware non dispone di tale funzionalità.

Impostare il membro della matrice GammaCurve di DXGI_GAMMA_CONTROL su un elenco di strutture DXGI_RGB per i punti della curva gamma. Ogni elemento DXGI_RGB specifica i valori float che rappresentano i componenti rosso, verde e blu per tale punto. La curva gamma non usa valori alfa. Usare il numero ottenuto da NumGammaControlPoints di DXGI_GAMMA_CONTROL_CAPABILITIES per riempire tale numero di elementi nella matrice GammaCurve . Ogni elemento inserito nella matrice GammaCurve è l'altezza per ogni punto di controllo.

Si noti che nel grafico precedente è ora possibile controllare la posizione verticale di ogni punto di controllo ed è disponibile un controllo separato per rosso, verde e blu. Ad esempio, è possibile impostare tutti i valori verdi e blu su zero e impostare i valori rossi su una scala crescente da zero a uno. In questo scenario, l'immagine visualizzata mostra solo le sue parti rosse, con il blu e il verde che appaiono come neri. È anche possibile impostare una scala decrescente per tutti i colori, che comporta un display invertito. Qualsiasi valore inserito nella matrice GammaCurve deve essere incluso nei valori ottenuti dai membri MinConvertedValue e MaxConvertedValue di DXGI_GAMMA_CONTROL_CAPABILITIES.

Praticità del controllo gamma

I controlli gamma di DXGI si applicano solo a condizione che l'app sia a schermo intero. Windows ripristina lo stato precedente dello schermo quando l'app viene chiusa o torna alla modalità finestra. Ma Windows non ripristina lo stato gamma dell'app se l'app entra nuovamente in modalità schermo intero. L'app deve ripristinare in modo esplicito lo stato gamma quando entra nuovamente in modalità schermo intero.

Non tutti gli adattatori supportano il controllo gamma. Se un adattatore non supporta il controllo gamma, ignora le chiamate per impostare una rampa gamma.

Le app eseguite in Desktop remoto non possono controllare affatto gamma.

Il cursore del mouse, se viene implementato nell'hardware (come la maggior parte dei casi), in genere non risponde all'impostazione gamma.

Guida alla programmazione per DXGI