Quindi ho creato una texture. Ho salvato quella RGB con compressione BC7, quindi aggiunto il canale alfa [mappa speculare] con diversi livelli di scala di grigi e salvato nuovamente il file come RGBA con compressione BC7. Il file risultante ha la stessa dimensione di quello senza alfa, ma contiene informazioni aggiuntive -alpha channel. Comè possibile? Non puoi avere la torta e mangiare la torta a quanto ho capito, quindi sono stati fatti dei compromessi per garantire le stesse dimensioni?
Sto usando Photoshop con il plug-in Intel DDS.
Risposta
BC7 codifica sempre in modo efficace 4 canali. Questo fa parte della natura del formato. Attivare alpha significa che il compressore leggerà e utilizzerà il valore alfa nellimmagine sorgente, ma è tutto.
Tutte le immagini compresse BC7 di una data dimensione hanno la stessa dimensione, poiché BC7 comprime ogni 4×4 gruppo di texel in 128 bit. Ma questo non significa che abbiano la stessa qualità .
BC7 è un formato di codifica adattivo. Sebbene ogni blocco abbia una dimensione fissa (sia spaziale che bit per bit), ogni blocco memorizza il numero di canali che il blocco viene effettivamente compresso e il modo in cui si correlano tra loro. Le specifiche sono complesse , ma il vantaggio generale è che il compressore calcola per blocco quale modalità di compressione funziona meglio per un particolare blocco. Se il compressore può guardare un blocco e vedere che lalfa per tutti i texel è 1.0, allora può spendere più bit dei 128 bit per i colori e meno per lalfa.
Come tale, una trama " senza alpha " è esattamente come una trama con alfa in cui ogni texel ha alfa 1. Questi blocchi trascorreranno la maggior parte bit sulle parti non alfa dei texel, sprecando solo pochi bit su un campo " mode " che fa sapere al decompressore che lalfa è una costante 1.0.
Ciò significa anche che, se la trama ha unalfa variabile, ma parti di essa hanno unalfa costante, BC7 può codificare queste aree alfa costanti con meno bit, in modo che più bit possono essere spesi per migliorare la codifica dei colori.
Quindi non dovresti pensare che ci sia un problema perché i due interruttori di compressione sono usciti con lo stesso numero di byte.
Risposta
Ecco un ar articolo sul formato BCn: cliccami . È scritto da Nathan Reed, che è piuttosto attivo su questo sito. Quindi probabilmente passerà e potrebbe rispondere alla tua domanda con maggiori dettagli, anche se penso che larticolo spiegherà tutto ciò che devi sapere.
La parte più rilevante per la tua domanda sembra essere questa sezione del articolo:
BC sta per “block compression” e i formati BCn funzionano tutti in termini di Blocchi di pixel 4 × 4. Tutte le immagini vengono suddivise in questi piccoli blocchi e ogni blocco è autonomo: i dati per decodificarlo sono tutti in un blocco contiguo in memoria . Inoltre, la dimensione di ogni blocco compresso è fissa: 8 o 16 byte , a seconda del formato BCn utilizzato. Questo rappresenta un rapporto di compressione 4: 1 o 8: 1, se limmagine sorgente è in formato RGBA a 8 bit.
Finché il tuo pixel count non cambia, non cambia neanche la dimensione della texture. Tuttavia, più canali utilizzi (solo 3 e 4 sono supportati da BC7 secondo la documentazione Microsoft ), meno informazioni puoi memorizzare per canale colore in un bloccare. Ciò significa che si perdono più informazioni a causa della compressione quando si utilizza RGBA invece di RGB.