BPTC Texture Compression

From OpenGL Wiki
Revision as of 05:26, 24 November 2018 by Scx (talk | contribs)
Jump to navigation Jump to search
BPTC Texture Compression
Core in version 4.6
Core since version 4.2
ARB extension ARB_texture_compression_bptc

BPTC Texture Compression is the collective name for a pair of compression formats. BPTC is for unsigned normalized images, commonly referred to as BC7. It can be used for high fidelity RGB/RGBA compression. BPTC_FLOAT is for floating-point value images, commonly referred to as BC6. It can represent high dynamic range (HDR) RGB images.

Both formats use 4x4 pixel blocks, and each block in both compression format is 128-bits in size. Unlike S3 Texture Compression, the blocks are taken as byte streams, and thus they are endian-independent.

Unsigned normalized

The unsigned normalized formats come in two flavors that are mathematically equivalent: one for linear RGB values (GL_COMPRESSED_RGBA_BPTC_UNORM) and one for sRGB values(GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM). They both have an alpha channel as well.

Both this format and S3TC work based on gradients: defining a block based on a pair of colors and then linearly interpolated values between them. The general difference between this format and the nearest S3TC size equivalent (GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) is that this BPTC format allows for blocks to contain multiple gradients for different color channels. This is similar to how DXT5 has a block for RGB and a separate block for alpha. But BPTC uses a much more flexible mechanism that allows different groups of channels to be used.

Each block has a selector that picks between one of 7 different modes. The different modes represent how many channel gradients there are and which channels they map to.

Floating point

The floating point variant of the BPTC format is very similar to its unsigned counterpart. Two versions exist for signed (COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB) and unsigned (COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB) floats. The formats compress high dynamic range floating point values. No alpha channel is available.

Unlike BPTC, BPTC_FLOAT uses transformed endpoints to save more space in pixel blocks. One endpoint is stored at a high resolution, while others are stored as less precise offsets to the high precision endpoint.


For more detailed information on these formats, please refer to the ARB specification OpenGL 4.5, Appendix C.2, page 641 or the Khronos Data Format specification.

See also