Colordepth a 24 bit non è sufficiente?


30

Ho notato che in gradienti molto morbidi, la colordepth a 24 bit non è sufficiente in quanto puoi vedere le transizioni del colore. Questo sporge di più nelle scene buie o nei cieli notturni.

Perché nessuno cambia la profondità di campo in due byte per canale? So che sarebbe un sacco di lavoro e un sacco di hardware dovrebbe essere rivalutato, ma lo trovo un po 'fastidioso. Non credo davvero che la tecnologia dell'hardware non sia abbastanza matura.

Allora perché nessuno lo sta facendo?

Ecco una foto di "The War Z" in cui puoi vedere cosa intendo:

Le transizioni di colore di War Z.


12
L'immagine è in formato JPEG, anche quella può produrre artefatti. Puoi presentare un esempio in formato lossless?
Imperatore Orionii,

Ma stai scherzando? Ti lamenti per la profondità di bit ma carichi un file JPEG?
Tara,

1
Esattamente. Non c'è bisogno di un formato senza perdita quando JPG sta dimostrando in modo significativo cosa intendo. A proposito: non è stata la compressione a causare questo effetto. Salva le tue risorse, amico ...
Liess Jemai,

Risposte:


19

Più o meno lo hai detto tu stesso: "Lo so, sarebbe un sacco di lavoro e molto hardware dovrebbe essere sostituito." Mentre la fine hardware-grafica delle cose sarebbe in realtà relativamente semplice (se costosa - il raddoppio della dimensione di tutte le trame e buffer di frame è tutt'altro che banale), l '"ecosistema" per immagini con una maggiore profondità di colore semplicemente non è a posto per tipo di estensione che rende questa una spesa utile per conto di nessuno, poiché nessun produttore di LCD si sta concentrando sul tentativo di ottenere fino a 16 bit per pixel (anche se ci sono stati alcuni esperimenti a 10BPP, che si adatta comodamente ancora un segnale RGB in un 32- bit channel).

In breve, è semplicemente troppo lavoro per quello che la maggior parte delle persone considera ancora poco guadagno. Potrebbe anche essere "un po 'fastidioso", ma quel livello di fastidio è così scarso che altri miglioramenti della qualità dell'immagine hanno avuto la priorità.


1
Sebbene non direttamente accessibili agli utenti finali, alcuni monitor di fascia alta da 27/30 "rivolti ai professionisti dell'immagine / video sono 14 bit internamente / 10 esternamente e utilizzano i 4 bit aggiuntivi per memorizzare una tabella di ricerca per facilitare la calibrazione dei colori sul display.
Dan Neely,

@DanNeely: ogni "utente finale" può averne uno per un paio di migliaia di dollari USA. Hanno anche bisogno di una scheda grafica di livello professionale, come una Quadro. Considerando ciò che alcune persone pagano per la loro TV e sistema audio, questo non è male.
Zan Lynx,

@ZanLynx Ho usato la frase rivolta ai professionisti invece che solo ai professionisti deliberatamente. Chiunque può acquistare l'intero stack; ma i prezzi sono così alti e benefici così rari che poche persone lo fanno. ex solo l'1,17% degli utenti di Steam ha 2560 display. E il monitor è l'unica parte dello stack necessario che è probabile che un utente esperto finisca per ottenere accidentalmente perché alcuni (tutti?) Dei display 2560 di anno modello del 2011 dei fornitori tradizionali includevano il colore 10 / 14bit; e le importazioni coreane più economiche non erano ampiamente disponibili per un po 'di tempo dopo. Le schede Quadro / etc non offrono nulla ai giocatori rispetto allo standard.
Dan Neely,

1
È possibile che tale banda sia in realtà un'ottimizzazione testuale per ridurre la quantità di lavoro che rende il cielo? Quando creo un gradiente a 24 bit in GIMP non sembra così. Vedere static.inky.ws/image/4306/gradient.png per un gradiente a 24 bit.
ldrumm

2
@ldrumm no, non proprio, hai davvero approfittato della gamma più estrema e hai abilitato il dithering in gimp, dai un'occhiata a questo esempio con il dithering (leggera banda visibile) e qui senza dithering . Il problema è che non puoi semplicemente post-processare universalmente il dithering nelle trame e la maggior parte delle trame non viene creata usando le sfumature.Se sono dipinte a mano e hanno una qualche forma di grande area con una sfumatura tra 2 colori piuttosto simili poi ci saranno le bande
PeterT

44

Sì, non sei la prima persona a notare questo . :) Con gli attuali rapporti di contrasto elevato, 8 bit per componente non sono sufficienti per creare una sfumatura uniforme senza bande visibili, a meno che non venga utilizzato il dithering.

L'uso di più di 8 bit per canale su un display è chiamato " deep color " dai produttori di display. Non è molto diffuso a causa di un problema con pollo e uova. Un display a colori profondi è inutile senza una scheda video in grado di produrre colori profondi e un motore di gioco che supporta il rendering a colori profondi. Allo stesso modo, non ha senso un motore di gioco o una scheda video che supporti colori profondi senza display. Quindi non c'è molto incentivo per i produttori di hardware e gli sviluppatori di giochi ad aggiungere supporto per questa tecnologia, poiché da entrambe le estremità non esiste un mercato che giustifichi il costo dello sviluppo.


Inoltre, ci sono altri modi per correggere le bande grazie alla precisione limitata a 8 bit. Come accennato in precedenza, i motori di gioco possono utilizzare il dithering per nascondere le bande.


(Immagine di un gatto con una tavolozza di 256 colori, senza e con retinatura. Creato dall'utente Wapcaplet di Wikipedia , utilizzato con licenza CC-By-SA 3.0 .)

L'aggiunta di una leggera retinatura di ± 0,5 / 255 prima di scrivere il valore di pixel nel framebuffer è estremamente efficace per nascondere le strisce su gradienti morbidi ed è sostanzialmente impercettibile. Se utilizzi un motore HDR, lo fai durante la fase di modifica del toner.


Infine, come altri hanno notato, la compressione delle trame può essere una fonte più grande di artefatti simili a bande nell'immagine rispetto alla precisione a 8 bit. Questo potrebbe essere ciò che sta succedendo con il cielo in quella foto, anche se è difficile da dire: ha così tanta compressione JPEG su di esso che qualsiasi artefatto dovuto alla compressione DXT è praticamente sommerso.


+1 - una risposta eccellente, e avevo completamente perso la probabilità che il bendaggio avesse altre cause.
Steven Stadnicki,

1
+1 per aver notato che il file è un jpeg. Un esempio senza perdita di dati da parte dell'OP impedirebbe un giudizio insufficiente a causa del rumore nei dati.
ldrumm,

@ldrumm Anche un gioco / motore che non è terribile ...
Brian Ortiz,

Ho aggiunto delle foto per sottolineare la differenza che il dithering può fare. Sentiti libero di tornare se non ti piace :)
BlueRaja - Danny Pflughoeft

13

Vale anche la pena notare che molti pannelli LCD non sono nemmeno 8 bit per canale. Quelli più economici tendono a usare meno bit e utilizzare vari trucchi per cercare di nasconderlo. Ad esempio, potrebbero passare rapidamente tra due colori adiacenti per rappresentare quello in mezzo. http://www.anandtech.com/show/1557/3

Ci sono alcuni dettagli su come DXGI supporta 10 bit per canale e più luminoso dei colori bianchi su http://msdn.microsoft.com/en-us/library/windows/desktop/jj635732%28v=vs.85%29.aspx

D3D ha anche supportato più di 8 bit per canale per anni. Non c'è nulla che possa impedire a uno sviluppatore di fare un dithering da 16 bit per canale a 8 bit se pensano che sia una buona idea.

Naturalmente ciò non sarà di grande aiuto se i dati di origine (trama, ecc.) Sono solo 8 bit (o più probabilmente DXT1, che in realtà è 5-6-5 bit per canale). Credo che sia quello che succede con il cielo in quello screenshot (una sfocatura gaussiana di 8 bpp lo rende molto più fluido per me) ma è difficile esserne certi.


10

La risposta di Steven Stadnicki è corretta: i giochi usano raramente trame di precisione più elevata perché richiedono troppa memoria di trama e, di conseguenza, troppa larghezza di banda di memoria quando campionano la trama in un pixel shader. Tuttavia, ci sono soluzioni che non richiedono grandi trame. (Pubblicherei questo come commento, ma è troppo lungo.)

Homeworld risolve questo problema codificando l'immagine del cielo come gradienti di vertice . Questa tecnica funziona alla grande per immagini di grandi dimensioni a bassa frequenza (ad es. Gradienti lisci) - come i cieli - in cui la trama copre un numero enorme di pixel di gioco.

Un'altra possibile soluzione è applicare la normalizzazione dell'istogramma all'immagine del cielo. Se i dati di trama si trovano in un intervallo di valori ristretto, come un cielo notturno scuro, la maggior parte dei bit in ciascun canale di colore non trasporta dati utili. Invece, fai questo:

  • Crea la trama originale in un formato a 16 bit, come un TIFF a 16 bit.
  • Quando prepari le trame per il motore di gioco, trova il pixel più scuro presente nell'immagine e tieni traccia di questo come offset. Supponiamo che questo valore di pixel sia 0,1 in un intervallo possibile di 0-1.
  • Quindi, trova il pixel più luminoso e sottrai il pixel più scuro per ottenere l'intervallo di valori nell'immagine. Quindi, se il pixel più luminoso è ancora piuttosto scuro - diciamo 0.35 - l'intervallo è solo 0,35 - 0,1 = 0,25. Nell'immagine è presente solo il 25% dell'intervallo di valori.
  • Genera la tua trama di gioco compressa in DXT / BC . Sottrai il valore più scuro da ogni pixel e moltiplica per utilizzare l'intera gamma di colori. Nel calcolo di esempio sottraggiamo il nostro valore scuro di 0,1 e, poiché è presente solo il 25% dell'intervallo di valori disponibile, moltiplichiamo ogni valore di pixel per 4x per creare la trama del gioco. Assicurati di fare tutto questo prima di quantizzare l'immagine sorgente a 16 bit fino all'ingresso 8bpp al compressore DXT. L'immagine di output ora utilizzerà l'intero intervallo di valori supportati dal formato di gioco. Stiamo allocando tutti i nostri bit per rappresentare i valori effettivamente presenti nell'immagine.
  • Memorizza da qualche parte l'offset del valore scuro (0,1) e l'intervallo (0,25) nei metadati. Passale come input al tuo pixel shader.
  • Nel codice pixel shader, campiona la tua texture spostata ed espansa, convertila in un valore float e quindi esegui una moltiplicazione / aggiunta per ripristinare il valore del colore originale. In altre parole, moltiplicare per 0,25 e aggiungere 0,1 per ripristinare il valore memorizzato nell'immagine di origine.

Assicurarsi che il codice shader sia gamma corretto . Se esegui la matematica (illuminazione e post-elaborazione) su campioni di trama che non vengono convertiti dallo spazio colore sRGB allo spazio lineare, vedrai artefatti di bande come quello che descrivi. La correzione gamma è stata creata per aiutare ad alleviare questo tipo di problema assegnando più bit a valori scuri in cui i tuoi occhi sono più sensibili alle variazioni di valore. Ma puoi facilmente rompere le cose se non tieni conto della correzione gamma durante il calcolo, ad esempio illuminazione, esposizione o post-elaborazione FX. Le domande frequenti sulla gamma sono utili.


1

24 bit non è abbastanza, ma è molto più comune che problemi come questo siano causati da algoritmi di compressione delle immagini, aliasing o altri artefatti digitali. Inoltre, non trascurare il ruolo della tecnologia di visualizzazione: indipendentemente dagli ingressi digitali, il display potrebbe non produrre i passaggi appropriati nella luminosità effettiva.

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.