Je soupçonne qu'il est en effet possible de retourner des blocs BC6-7 avec beaucoup moins de travail qu'une décompression et une recompression complètes, mais ce n'est toujours pas un pique-nique et c'est beaucoup plus complexe que de retourner des blocs BC1-5.
Tout d'abord, les BC6-7 ont une variété de modes qui peuvent être sélectionnés par bloc. Les modes ont des dispositions binaires complètement différentes, vous devrez donc à peu près écrire une routine de retournement différente pour chaque mode (il y en a ~ 20 au total, IIRC).
Une autre difficulté réside dans les modes partitionnés, où les pixels du bloc sont partitionnés en 2 ou 3 sous-ensembles, chacun avec son propre segment de ligne RVB. La partition doit être choisie dans un ensemble prédéfini; ceux pour BC6 peuvent être vus ici . Le problème est que cet ensemble de partitions n'est pas symétrique sous les retournements verticaux. Cependant, je soupçonne qu'il échange des 0 et des 1, vous vous retrouvez avec la partition # 9 (3e ligne, 2e colonne). Je n'ai pas vérifié que chaque partition peut être retournée de cette façon, ni vérifié celles de BC7 (qui comprend également des partitions avec 3 sous-ensembles). est symétrique sous une combinaison de retournements verticaux et d'interchanger les deux sous-ensembles. Par exemple, en regardant la partition # 22 (6ème ligne, 3ème colonne) sur ce lien, il n'y a pas de version inversée verticalement dans le tableau, mais si vous inversez verticalement et
Même si cela fonctionne, vous n'êtes toujours pas à la maison. Dans BC1-5, l'ordre des deux points d'extrémité du segment de ligne RVB a été utilisé pour changer de mode, mais dans BC6-7 l'ordre des points d'extrémité est choisi pour fixer un bit des indices par pixel dans chaque sous-ensemble de partition. Par conséquent, si vous modifiez la partition autour, vous devrez peut-être également échanger l'ordre des points de terminaison.
Enfin et surtout, dans BC6-7, les points d'extrémité sont souvent compressés en delta (c'est-à-dire qu'un point d'extrémité est stocké avec une précision totale et les autres sont stockés en tant que deltas de moindre précision). L'échange de sous-ensembles de partitions et de l'ordre des points de terminaison changera le point de terminaison de haute précision, vous devrez donc mélanger les bits de faible précision et annuler certains deltas.
Dans l'ensemble, il ne semble pas y avoir de showstopper fondamental (même si je n'ai pas vraiment écrit le code), mais ce serait certainement beaucoup de travail pour inverser ou faire pivoter ces formats. Si possible, je recommanderais de retourner les images dans votre pipeline d'art avant qu'elles ne soient compressées.
(BTW, la spécification la plus complète de BC6-7 que j'ai trouvée est la spécification ARB_texture_compression_bptc ; j'ai également écrit un article de blog sur les formats BCn il y a quelque temps.)