Here's one idea for an 128-bit per 4x4 block format (8 bits/texel) that mashes together ETC1+BC7. One thing I learned from ETC1 is that a lot of bits can be saved by forcing each subset's principle axis to always lie along the intensity direction. With a strong encoder, this constraint isn't as bad as one would think.
The format only has two modes: opaque and transparent. The opaque mode has 3 subsets, and the transparent mode has 2 subsets for RGB and 1 subset for alpha. Each color has 1 shared pbit, and each mode has 16 partitions for colors.
The color encoding is "RGB PBit IntensityTable". The intensity tables could be borrowed from ETC1 and expanded to 8 entries. For the transparent blocks, two 8-bit alpha values are specified (like BC4), and by borrowing degeneracy breaking from BC7 we can shave one bit from the alpha selectors. "CompRot" is a BC7-style component rotation, so any of the channels can be encoded into alpha.
Some things I like about this format: equal precision for all components, and there are only two simple modes. The opaque mode is powerful but simple: always 3 subsets, with color and selector precision better than BC1 and even better than BC7's 3 subset modes. The transparent mode is more powerful than BC3 for RGB (better color precision, and 2 subsets), but weaker for alpha (2 bit selectors vs. 3).
The main downside is that each subset's endpoints are constrained to lie along the intensity axis. I've seen commercial games ship with normal maps encoded into ETC1 and DXT1 so I know this isn't a total deal breaker.
Opaque block:
ModeBit 1
Partition 4
Color0 777 1 3
Color1 777 1 3
Color2 777 1 3
Color selectors;
3 3 3 3
3 3 3 3
3 3 3 3
3 3 3 3
Total bits: 128
Transparent block:
ModeBit 1
Partition 4
Color0 666 3
Color1 666 3
AlphaLoHi 8 8
CompRot 2
Color selectors:
2 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2
Alpha selectors:
1 2 2 2
2 2 2 2
2 2 2 2
2 2 2 2
Total bits: 128
A strong encoder would adaptively choose between opaque blocks and transparent blocks using various component rotations, to minimize overall error. Transparent blocks can be used even on all-opaque textures.
I have no idea if this format is useful. On a rainy day I'll make a simple encoder and compare it against BC1 and BC7.
No comments:
Post a Comment