Så jeg har laget en tekstur. Jeg har lagret RGB-en med BC7-komprimering, la deretter til alfakanal [specular map] med varierende nivåer av gråtoner, og lagret filen igjen som RGBA med BC7-komprimering. Den resulterende filen har samme størrelse som den uten alfa, men den inneholder ytterligere informasjon-alfakanal. Hvordan er det mulig? Du kan ikke ha kake og spise kake som jeg forstår, så blir det gjort kompromisser for å sikre samme størrelse?
Jeg bruker Photoshop med DDS-plugin.
Svar
BC7 koder alltid effektivt 4 kanaler. Det er en del av formatet. Å slå på alfa betyr at kompressoren vil lese og bruke alfa-verdien i kildebildet ditt, men det er alt.
Alle BC7-komprimerte bilder av en gitt dimensjon har samme størrelse, siden BC7 komprimerer hver 4×4 gruppe texler i 128-bits. Men det betyr ikke at de har samme kvalitet .
BC7 er et adaptivt kodingsformat. Mens hver blokk har en fast størrelse (både romlig og bitvis), lagrer hver blokk hvor mange kanaler som blokkerer faktisk komprimerer og måten de korrelerer med hverandre. -spesifikasjonene er komplekse , men den generelle oppsiden er at kompressoren regner ut per blokk-måte hvilken komprimeringsmåte som fungerer best for en bestemt blokk. Hvis kompressoren kan se på en blokk og se at alfa for alle tekstiler er 1.0, kan den bruke flere biter av de 128 bitene på fargene og færre på alfaen.
Som sådan, en tekstur " uten alfa " er akkurat som en tekstur med alfa der hver tekst har en alfa på 1. Disse blokkene vil bruke størstedelen av deres biter på ikke-alfadelene av texlene, bare kaster bort noen få biter i et " -modus " -felt som lar dekompressoren vite at alfa er konstant 1.0.
Dette betyr også at hvis teksturen din har en varierende alfa, men deler av den har en konstant alfa, kan BC7 kode disse konstante alfaområdene med færre biter, slik at flere biter kan brukes på forbedret fargekoding.
Så du bør ikke føle at det er et problem fordi de to kompresjonsbryterne kom ut med samme antall byte.
Svar
Her er en ar tekst om BCn-formatet: klikk meg . Den er skrevet av Nathan Reed, som er ganske aktiv på dette nettstedet. Så han vil sannsynligvis gå forbi og kanskje svare på spørsmålet ditt med flere detaljer, selv om jeg tror artikkelen vil forklare alt du trenger å vite.
Den mest relevante delen for spørsmålet ditt ser ut til å være denne delen fra artikkel:
BC står for «block compression», og BCn-formatene fungerer alle mht. 4 × 4 piksler. Alle bildene er skåret opp i disse små blokkene, og hver blokk er selvstendig – dataene for å dekode det er alt i ett sammenhengende stykke i minnet . Videre er størrelsen på hver komprimert blokk fast — enten 8 eller 16 byte , avhengig av hvilket BCn-format som brukes. Dette representerer et kompresjonsforhold på 4: 1 eller 8: 1, hvis kildebildet er i 8-biters RGBA-format.
Så lenge pixelen din er antall endres ikke, størrelsen på teksturen endres heller ikke. Jo flere kanaler du bruker (bare 3 og 4 støttes av BC7 i henhold til Microsoft-dokumentasjonen ), desto mindre informasjon kan du lagre per fargekanal i en blokkere. Dette betyr at du mister mer informasjon på grunn av komprimering når du bruker RGBA i stedet for RGB.