Comment diable obtenez-vous des couleurs décentes avec 2BPP?

11

J'ai étudié les textures PowerVR et j'ai rencontré plusieurs textures qui sont apparemment de 2 bits par pixel. Franchement, cela m'étonne. Comment obtenir une conservation des couleurs à moitié décente alors que vous n'avez que 4 états possibles par pi par pixel? J'adorerais toutes les ressources qui parlent de la compression derrière un tel exploit. Merci!

Toji
la source
Avec JPG, vous pouvez obtenir une couleur décente avec moins de 1BPP :)
Ivan Kuckir

Réponses:

13

Le codage PVRTC 2BPP, tel qu'introduit dans cet article, divise une image en blocs de 8 x 4 texels et comprime chaque bloc de telle sorte que seules deux couleurs RVB sont stockées pour chaque bloc de 32 texels.

Aucun des trente-deux texels ne stocke sa propre couleur - chaque texel ne stocke que des informations sur la façon de se fondre entre les deux couleurs RVB de son bloc 8x4-texel.

Si l'image source contient un bloc de texels 8x4 avec un arc-en-ciel de 32 couleurs, la compression PVRTC 2BPP fera très mal le maintien de sa qualité, car dans PVRTC 2BPP, chaque bloc de texels 8x4 n'a que deux couleurs RVB avec lesquelles se fondre.

bmcnett
la source
Fascinant! Merci beaucoup. Malheureusement, j'ai beaucoup de mal à charger le papier auquel vous avez lié. Peut-être qu'il est hébergé sur EC2 d'Amazon? ;)
Toji
6

La compression de texture ne comprime pas les pixels. Il comprime des blocs de pixels. Lorsqu'un pixel individuel est référencé, le GPU calcule quel bloc représente le pixel. Ensuite, il traite tout le bloc pour obtenir la couleur de ce pixel.

Un exemple

Supposons que la taille du bloc est de 4x4 pixels sur une texture RVB. Non compressé, chaque bloc consomme des 4x4x3 = 48octets dans la mémoire de texture.
Maintenant, l'algorithme de compression calculera la moyenne de chaque canal (RVB) et la stockera avec le bloc (3 octets). Donnons maintenant à chaque pixel 2 bits pour ajuster la moyenne afin que le pixel soit plus proche de sa couleur d'origine. C'est un autre 4x4x2x3/8 = 12octet.
Le nombre total d'octets utilisés par ce compresseur nouvellement inventé est de 15 octets par bloc, soit un taux de compression de 31,25%.

Mon compresseur mythique utilise 7,5 bpp. Ce n'est pas aussi bon que le pvrtc 2 bpp peut atteindre, mais maintenant vous avez une idée approximative de la façon dont 2 bbp pourraient être atteints.

mise à jour:
je viens de regarder la page wikipedia pour pvrtc . Il semble que pvrtc n'utilise pas la compression basée sur des blocs traditionnels. Voici un article qui décrit le fonctionnement de la compression basée sur des blocs et comment pvrtc diffère. À noter en particulier: les filtres basés sur des blocs peuvent produire des images d'aspect décent en utilisant 4 bpp (pas d'alpha), tandis que nvrtc peut le faire avec 2 bpp.

deft_code
la source
1

@Toji, le site sur lequel se trouve le journal est un peu capricieux mais cela a fonctionné pour moi ce matin. A défaut, si vous avez accès à ACM / SIGGRAPH, il est hébergé ici . Étrangement, il était également sur le IMG / site du développeur PowerVR (inscription gratuite) , mais je ne peux pas sembler trouver la partie droite. :-(

[UPDATE] Il est toujours sur le site IMG ici [/ UPDATE]

@bmcnet: PVRTC ne divise pas la texture en blocs comme, par exemple, ETC ou S3TC. FWIW, j'ai fait des expériences avec des textures basées sur des blocs mais je n'ai pas trouvé de moyen de regrouper suffisamment de données dans des blocs autonomes et d'obtenir toujours les résultats que je voulais. Au lieu de cela, c'est un peu plus un système de compression de texture «global». Il dispose de 2 images basse résolution qu'il met à l'échelle bilinéaire jusqu'à la résolution cible, puis les mélange ensemble texel par texel.

Simon F
la source