BC7 texture met alpha heeft dezelfde grootte als BC7 zonder alpha

Dus ik heb een texture gemaakt. Ik heb de RGB met BC7 compressie bewaard, vervolgens alfakanaal [spiegelende kaart] met verschillende grijstinten toegevoegd, en het bestand opnieuw opgeslagen als RGBA met BC7-compressie. Het resulterende bestand heeft dezelfde grootte als het bestand zonder alfa, maar het bevat aanvullende informatie -alfakanaal. Hoe is het mogelijk? Je kunt geen cake hebben en geen cake eten zoals ik begrijp, dus zijn er compromissen gesloten om dezelfde grootte te garanderen?

Ik gebruik Photoshop met intel DDS-plug-in.

Antwoord

BC7 codeert altijd effectief 4 kanalen. Dat is een deel van de aard van het formaat. Alpha inschakelen betekent dat de compressor de alpha-waarde in je bronafbeelding leest en gebruikt, maar dat is alles.

Alle gecomprimeerde BC7-afbeeldingen van een bepaalde dimensie hebben dezelfde grootte, aangezien BC7 elke 4×4 comprimeert groep texels in 128-bits. Maar dat betekent niet dat ze dezelfde kwaliteit hebben.

BC7 is een adaptief coderingsformaat. Hoewel elk blok een vaste grootte heeft (zowel ruimtelijk als bitsgewijs), slaat elk blok op hoeveel kanalen dat blok daadwerkelijk comprimeert en de manier waarop ze met elkaar correleren. De details zijn complex , maar het algemene voordeel is dat de compressor per blok uitzoekt welke manier van compressie het beste werkt voor een bepaald blok. Als de compressor naar een blok kan kijken en ziet dat de alpha voor alle texels 1,0 is, dan kan hij meer bits van de 128 bits aan de kleuren besteden en minder aan de alpha.

Als zodanig is een texture " zonder alpha " is precies zoals een texture met alpha waar elke tekst een alpha van 1 heeft. Deze blokken besteden het grootste deel van hun bits op de niet-alfa-delen van de texels, maar verspilt slechts een paar bits in een " modus " veld dat de decompressor laat weten dat de alfa is een constante 1.0.

Dit betekent ook dat, als je textuur een variërende alfa heeft, maar delen ervan een constante alfa hebben, BC7 deze constante alfa-gebieden met minder bits kan coderen, zodat meer bits kunnen worden besteed aan verbeterde kleurcodering.

U hoeft dus niet het gevoel te hebben dat er een probleem is, omdat de twee compressieschakelaars hetzelfde aantal bytes hadden.

Answer

Hier is een ar artikel over het BCn-formaat: klik op mij . Het is geschreven door Nathan Reed, die behoorlijk actief is op deze site. Dus hij zal waarschijnlijk langskomen en uw vraag met meer details beantwoorden, ook al denk ik dat het artikel alles zal uitleggen wat u moet weten.

Het meest relevante deel voor uw vraag lijkt dit gedeelte uit de artikel:

BC staat voor “blokcompressie”, en de BCn-formaten werken allemaal in termen van 4 × 4 blokken pixels. Alle afbeeldingen worden opgedeeld in deze kleine blokken en elk blok is op zichzelf staand: de gegevens om deze te decoderen bevinden zich allemaal in één aaneengesloten blok in het geheugen . Bovendien staat de grootte van elk gecomprimeerd blok vast: ofwel 8 of 16 bytes , afhankelijk van het BCn-formaat dat wordt gebruikt. Dit vertegenwoordigt een compressieverhouding van 4: 1 of 8: 1, als de bronafbeelding de 8-bits RGBA-indeling heeft.

Dus zolang uw pixel aantal verandert niet, de grootte van de textuur verandert ook niet. Hoe meer kanalen u echter gebruikt (alleen 3 en 4 worden door BC7 ondersteund volgens de Microsoft-documentatie ), hoe minder informatie u per kleurkanaal kunt opslaan in een blok. Dit betekent dat u meer informatie verliest door compressie wanneer u RGBA gebruikt in plaats van RGB.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *