Quanta precisione (metà, virgola mobile, doppia, ecc.) È sufficiente per una classe di colori?


8

Mentre leggevo su come le applicazioni in tempo reale gestiscono il colore con OpneGL, ho notato che alcuni esempi hanno implementato Color come una raccolta di 4 floats, mentre altri ne hanno usato 4 doubles. Ho anche visto alcuni esempi di compressione dei vertici nel campo dello sviluppo del gioco che hanno raccomandato di salvare i colori come 4 short.

Tutto ciò mi ha fatto desiderare di saperne di più: qual è la precisione limite che OpenGl (o hardware) gestisce per i colori? Ancora più importante, tuttavia, quali sono i limiti di precisione al di sopra dei quali le differenze di colore diventano impossibili da notare?

Ho l'impressione che apprendere più attentamente su ciò mi aiuterebbe a pensare e decidere meglio come implementare una classe di colori per diverse applicazioni e scenari (ad es. Fare delle scelte di scambio tra memoria, velocità e varietà di colori).

Grazie per le tue idee su questo.

Risposte:


6

I colori visualizzati sul display o salvati nei formati di file di immagine standard utilizzano 8 bit per componente. Quindi per memorizzare questi colori è sufficiente usare quattro byte ( unsigned char). Questi colori di solito usano lo spazio cromatico sRGB , che include una trasformazione "gamma" non lineare che ridistribuisce la precisione per renderla un po 'più uniforme dal punto di vista percettivo, quindi in realtà è abbastanza vicina al limite di come gli umani possano già percepire con precisione le differenze di colore. (Tuttavia, la gamma sRGB è solo un sottoinsieme di tutti i colori che sono fisicamente percepibili. Le gamme più ampie hanno bisogno di più bit.)

Tuttavia, se stai generando o elaborando colori nei software di grafica (e non solo caricandoli / memorizzandoli), ci sono vari motivi per cui potresti voler usare una maggiore precisione.

  • L'esecuzione di operazioni sui colori, come la regolazione di luminosità e contrasto, fusione alfa, correzione gamma, ecc., Tende a perdere precisione. Potresti voler memorizzare i colori come 16-bit o più internamente per darti maggiore headroom di precisione. Altrimenti, il ripetuto arrotondamento a 8 bit dopo ogni operazione può causare una progressiva perdita di qualità.
  • Allo stesso modo, quando si lavora con colori lineari (non i colori con codifica gamma sRGB) per l'illuminazione matematica, è necessaria una precisione aggiuntiva per garantire una precisione sufficiente quando alla fine si converte nuovamente in sRGB.
  • Potrebbe essere più veloce e più conveniente lavorare con colori a virgola mobile anziché a colori interi. Ciò è particolarmente vero nelle GPU, in cui le istruzioni matematiche intere hanno solo una frazione del throughput delle istruzioni float. Ma anche sulle CPU è certamente più facile e probabilmente più veloce convertire i colori in float, eseguire un sacco di operazioni e poi riconvertire in numero intero, piuttosto che provare a fare tutto con la matematica a punto fisso intero.
  • Se esegui il rendering HDR, avrai bisogno di oltre 8 bit di precisione per gestire la gamma cromatica più ampia e la gamma di intensità. I nuovi display HDR appena iniziati accettano immagini con 10 o 12 bit per componente.

L'uso doubleper i colori è eccessivo, ma l'utilizzo floatper la rappresentazione interna dei colori è comune per tutti i motivi sopra. Quando si lavora con GPU, half(float a 16 bit) è anche comune, poiché supportano quel formato nell'hardware.


Ottima risposta, grazie! Non ho capito l'ultima parte: usare a halfnon avrebbe comportato gli stessi problemi che hai menzionato prima, a causa della mancanza di precisione? Pensavo che ciò sarebbe particolarmente importante per la GPU, a causa dei numerosi calcoli del colore che vengono spesso eseguiti negli shader
AndrewSteer,

1
@AndrewSteer A ha half16 bit, inclusi 11 bit effettivi di precisione della mantissa, quindi sebbene non sia così preciso come float, è ancora sufficiente per la maggior parte delle operazioni di colore. (Forse non è del tutto sufficiente se stai emettendo un display HDR di alta gamma; non ne sono sicuro.)
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.