BC6H vs BC7 Texture Formats: Quality and Channel Trade-offs
DirectX Block Compression formats BC6H and BC7 both compress textures to a memory footprint of 8 bits per pixel (16 bytes per 4x4 block), but they target fundamentally different data types. BC6H is built specifically for High Dynamic Range (HDR) content supporting 16-bit floating-point color channels without alpha support. In contrast, BC7 is designed for high-fidelity Standard Dynamic Range (SDR) 8-bit color channels with optional, high-precision alpha support. Choosing between them depends strictly on whether your pipeline prioritizes dynamic range or alpha channel integration.
Channel Support and Data Formats
The primary functional divergence between BC6H and BC7 lies in channel capability:
- BC6H (RGB only): BC6H supports only three channels:
Red, Green, and Blue. It does not support an alpha channel. The format
operates on 16-bit floating-point (FP16/half-float) values per channel.
It is exposed in DirectX through two variants:
DXGI_FORMAT_BC6H_UF16(unsigned, values \(\ge 0.0\)) andDXGI_FORMAT_BC6H_SF16(signed, allowing negative color values). - BC7 (RGB or RGBA): BC7 supports either RGB or RGBA
configurations with up to 8 bits of precision per channel. It operates
on 8-bit unsigned normalized integers
(
DXGI_FORMAT_BC7_UNORMandDXGI_FORMAT_BC7_UNORM_SRGB). BC7 provides multiple internal modes that balance bit allocation between RGB color and alpha, enabling dedicated alpha precision or combined color-alpha interpolation.
If an asset requires an alpha channel, BC6H cannot be used directly. Packing an alpha channel alongside BC6H data requires splitting the texture into a separate monochrome texture or utilizing a secondary compressed format.
Dynamic Range and Precision Trade-offs
Dynamic range dictates the visual fidelity of these two formats:
- BC6H for HDR: BC6H preserves values significantly higher than \(1.0\), which is essential for physically based rendering. It captures extreme contrast ratios without clamping, preventing color banding and clipping in bright highlights. However, compressing wide floating-point ranges into 16-byte blocks can introduce luminance error or color shifting if adjacent texels in a 4x4 block have drastically different magnitudes.
- BC7 for SDR: BC7 strictly clamps data to the range of \([0.0, 1.0]\). It cannot represent values above standard white. Within that SDR range, however, BC7 allocates bits efficiently using up to three color partitions per block and dual-plane modes (allowing color and alpha to be interpolated independently). This results in virtually artifact-free reproduction of standard 8-bit textures, drastically outperforming legacy formats like BC1 and BC3.
Compression Quality and Artifact Profile
Because both formats use identical storage ratios (1 byte per pixel), their compression artifacts manifest differently based on data complexity:
- BC6H Artifacts: Quantization noise in BC6H typically appears as hue shifting or blocky luminance gradients in regions with extreme dynamic range variations, such as a sharp transition from a dark shadow to a high-intensity light source. Because endpoints are stored in floating-point space, subtle low-light details can sometimes lose precision if a high-intensity texel shares the same 4x4 block.
- BC7 Artifacts: BC7 artifacts typically appear as mild block edge boundaries or minor color bleeding in dense, noisy textures. However, because BC7 features eight distinct encoding modes, the compressor can dynamically pick the best mode per block—such as reserving extra bits for smooth alpha gradients or optimizing for complex color variation across partition boundaries.
Summary of Use Cases
- Use BC6H for: Environment skyboxes, HDR lightmaps, radiance cubemaps, emissive textures that require bloom intensities exceeding 1.0, and any floating-point mathematical data lacking alpha.
- Use BC7 for: Albedo/diffuse maps with or without transparency, packed PBR material maps (roughness, metalness, ambient occlusion), UI textures, and standard SDR normal maps where quality surpasses BC5.