When the same texture ships in two completely different shapes
A cross-platform game can ship the exact same 2K albedo set to PC, console, and iPhone, and the file you download will be encoded three times under three different rules. On Steam and Xbox Series X, that texture is almost always BC7. On an iPhone 15 Pro or any Adreno 7xx Android device, it is ASTC 4×4. Both formats land at 8 bits per pixel for the same 4×4 block, both target visually lossless quality on artist-grade content, and both have been around since the DirectX 11 / OpenGL ES 3.2 era. They are not interchangeable.
Sections: When the same texture ships in two completely different shapes · What BC7 and ASTC actually do to a 4×4 block · Why mobile chose ASTC and PC stayed on BC7 · Encoder tooling in 2026: astcenc 4.x, bc7enc_rdo, and Oodle Texture · How does HDR change the equation? · Picking a format by target platform · What this means for the next title you ship · Sources
The reason is partly hardware history, partly patent history, and partly the way each format’s block layout interacts with the rest of the texture pipeline — sampler caches, on-disk supercompression with Oodle or Kraken, and runtime decoders sitting next to the GPU’s texture units. Looking at the bc7 vs astc texture compression tradeoff in 2026 means measuring what a shipping title actually pays in disk space, sampling cost, and encode time, not the spec-sheet numbers from a 2019 walkthrough on a six-year-old MacBook Pro.

The diagram above maps the texture pipeline from a 32-bit-per-pixel source image down to whichever GPU-native compressed block the hardware sampler can read directly. BC7 and ASTC 4×4 sit in the same row at 8 bpp, but the path each takes through the encoder, the supercompressor, and the on-disk container differs at every step.
What BC7 and ASTC actually do to a 4×4 block
BC7 packs every 4×4 texel block into 128 bits and supports eight encoding modes — numbered 0 through 7 — that trade off endpoint precision, partition count, and per-pixel weight resolution. Some modes split the block into two or three subsets with separate color endpoints, which is what lets BC7 hold edges and gradients in the same block without the muddy artifacts older BC1 produced. Microsoft’s BC7 format reference documents the mode table and the bit layout for each of the eight modes.
ASTC takes a more flexible angle. The block is still 128 bits, but the footprint of that block is configurable — 4×4, 5×5, 6×6, 8×8, 10×10, all the way up to 12×12. A 4×4 ASTC block is 8 bpp, the same as BC7. A 6×6 block drops to roughly 3.56 bpp. A 12×12 block is under 1 bpp. ARM’s ASTC format overview walks through the partition tables, weight grids, and dual-plane mode that lets the format handle normal maps and decoupled alpha cleanly.
See also deep technical breakdown.
The implication for a shipping title is direct. On PC, a uniform BC7 set means every texture pays 8 bpp regardless of content. On mobile, an ASTC pipeline lets the build process pick 4×4 for hero assets the camera sees up close, 6×6 for diffuse maps on background props, and 8×8 for distant terrain and skybox cloud sheets. The VRAM and bandwidth savings on a typical mobile scene are real — measurable in tens of megabytes per scene — even though the per-block PSNR drops as the block grows. The quality gap between ASTC 4×4 and ASTC 6×6 on an albedo map is around 2 dB; on a normal map using dual-plane mode it is closer to 3.5 dB, which is why most pipelines keep normals at 4×4 even when the diffuse drops to 6×6.
| Format | Bits / pixel | HDR | Normal-map mode | PS5 / Xbox Series X|S | Switch 2 | iPhone 15+ / Apple M3-M4 | Adreno 7xx / Mali-G7xx | RTX 40/50, RDNA 3/4 |
|---|---|---|---|---|---|---|---|---|
| BC7 | 8.00 | No | Via channel-pack | Yes | Yes (Tegra T239) | Yes | No | Yes |
| BC6H | 8.00 | Yes | n/a | Yes | Yes | Yes | No | Yes |
| ASTC 4×4 | 8.00 | Optional profile | Dual-plane | No | Yes | Yes | Yes | RTX 40/50 yes; RDNA 3/4 partial |
| ASTC 6×6 | 3.56 | Optional profile | Dual-plane | No | Yes | Yes | Yes | RTX 40/50 yes; RDNA 3/4 partial |
| ASTC HDR (any block) | variable | Yes | Dual-plane | No | Yes (via Vulkan ext) | Yes | Yes | RTX 40/50 yes; RDNA 3/4 partial |
Source: Microsoft DirectX BC7 reference, ARM ASTC Format Overview, Khronos Vulkan registry, NVIDIA developer documentation, AMD GPU ISA notes, vendor data sheets for Apple A17/A18 and the Switch 2 SoC. Verified April 2026.

The radar plot above sketches the same trade in five dimensions: encode speed, decode hardware availability, on-disk shipped size after Oodle/Kraken, perceptual quality on photographic content, and quality on synthetic content like UI atlases or normal maps. BC7 wins on PC encoder maturity and console hardware coverage. ASTC wins on bits-per-pixel flexibility and on whether the same encoder pipeline can serve LDR and HDR content.
Why mobile chose ASTC and PC stayed on BC7
BCn — the family that culminates in BC7 and BC6H — was Microsoft’s bet for Direct3D, originally licensed from S3’s S3TC patents and folded into the DirectX core spec when those patents lapsed. Every desktop GPU since the GeForce 256 era has shipped a fixed-function BC decoder. By the time DirectX 11 standardized BC7 in 2009, the entire PC ecosystem already had a sampler hardware path for BC1 through BC5, and BC6H/BC7 were natural additions to existing texture units.
Mobile played a different game. ARM, Imagination, and Qualcomm all developed their own formats — PVRTC, ETC, ATC — and the resulting fragmentation was painful for cross-vendor Android titles. ARM took ASTC to the Khronos Group as a royalty-free standard, and OpenGL ES 3.2 made ASTC LDR a required feature. The format was designed from day one to give studios a single encode that any Khronos-compliant mobile GPU could sample. The variable block size was a hardware-budget decision: a single 128-bit decoder could service every footprint from 4×4 to 12×12, so no IHV had to spend extra silicon on per-bitrate decoders.
For more on this, see mobile-first engineering tradeoffs.
That history explains the present. PC vendors have no commercial reason to add ASTC — their installed games are BC7 — and mobile vendors have no reason to add BCn, because their installed games are ASTC. The two niches that actually expose both formats are Apple Silicon (Metal exposes BC and ASTC) and the Switch 2’s Tegra T239, which inherits ASTC support from the original Switch and adds BCn for PC-port compatibility. NVIDIA’s ASTC overview for game assets covers the hardware decoder architecture on Tegra GPUs in some depth. The power budget for ASTC’s larger 128-bit dual-plane decoder block is non-trivial — ARM’s Mali engineering blogs note that the decoder is among the heaviest fixed-function units in the texture pipe — but it is still cheaper than carrying decoders for every legacy format.
Encoder tooling in 2026: astcenc 4.x, bc7enc_rdo, and Oodle Texture
The 2019-2020 articles still floating near the top of search results all benchmarked astcenc 2.x and ispc_texcomp on a CPU from the late 2010s. The encoders have moved on. ARM’s astc-encoder 4.x changelog documents the SIMD and heuristic rework that pushed ASTC encode throughput several times higher than the 2.x line, with the 4.6 release retuning the cost-quality search to give a small per-block speedup at trivial PSNR loss. The 4.x branch added native arm64 support for MSVC and a shader-swizzle hint that fixes weight allocation when a shader only reads two channels of a four-channel texture. Presets run from -fast through -medium, -thorough, and -exhaustive, with a roughly 50× wall-clock difference between the endpoints.
BC7 saw a parallel evolution. Rich Geldreich’s bc7enc_rdo encoder added rate-distortion optimization that reshapes the BC7 bitstream to compress dramatically better through Kraken or LZMA, and Epic’s acquisition of RAD Game Tools made Oodle Texture the de facto BCn RDO pipeline for shipping titles. Oodle Texture’s documentation reports that non-RDO BC7 typically compresses by less than 10% under Kraken, while RDO-shaped BC7 can shrink another 20–50% on top of the same compressor without visible artifacts at an RDO lambda of around 30. On matched on-disk size after Oodle/Kraken, BC7 with RDO and ASTC 4×4 with astcenc -rdo land within about 0.5 dB PSNR on photographic content, with FLIP and SSIM also tracking within noise.
For more on this, see high-end PC build pipelines.
For cross-platform shipping, Binomial’s UASTC LDR 4×4 specification matters more than either format alone. UASTC is an intermediate encoding designed as the common subset of BC7 mode 6 and ASTC 4×4. A studio can store one UASTC file inside a KTX2 container, then transcode at install time to BC7 for PC and ASTC 4×4 for mobile with sub-millisecond per-block work and no full decode/re-encode pass. Documented quality loss versus a native ASTC encode is roughly 0.75 to 1.5 dB PSNR, which sits below the visibility threshold for almost all texture content.

The breakdown chart above splits the encoder cost-versus-quality curves for astcenc 4.x at -fast/-medium/-thorough/-exhaustive, bc7enc_rdo at increasing lambda settings, and the UASTC transcode path. The asymmetry is the practical result: BC7 has reached the point where the encoder choice (Oodle, bc7enc_rdo, ISPC) matters more than the format choice between BC7 and ASTC 4×4 on identical 8-bpp content.
How these comparisons were sourced. The numbers above were assembled from current vendor documentation as of April 2026: ARM’s astcenc 4.x release notes for encoder timing claims, Epic/RAD’s Oodle Texture product page for RDO size deltas, and Binomial’s UASTC wiki for transcode quality losses. The hardware availability table was cross-checked against the Khronos Vulkan extension registry, NVIDIA’s developer documentation, and Microsoft’s DirectX BCn spec. PSNR ranges quoted on photographic content come from the encoder maintainers’ own test corpora; perceptual differences on synthetic content (UI, normals) are content-dependent and should be re-validated per project rather than taken as universal.
How does HDR change the equation?
BC6H is a dedicated HDR format on the PC side. It packs floating-point endpoints into the same 8 bpp footprint as BC7 and is the canonical choice for skyboxes, IBL probes, and emissive textures in any DirectX 12 or Vulkan PC title. Consoles inherit the BCn family, so PS5 and Xbox Series X|S both use BC6H for the same HDR content.
ASTC handles HDR through a profile rather than a separate format. The Khronos VK_EXT_texture_compression_astc_hdr extension defines SFLOAT block formats for every ASTC footprint — 4×4 SFLOAT, 5×5 SFLOAT, and so on — and the extension is core Vulkan 1.3 with the EXT suffix dropped, though support remains an optional feature. Modern Adreno 7xx, Mali-G7xx, Apple A17/A18, and the Switch 2’s Tegra all expose ASTC HDR. RDNA 3 and 4 desktop AMD GPUs expose ASTC LDR partially; HDR support across desktop GPUs in 2026 is still uneven enough that PC builds default to BC6H regardless.
The practical recommendation: if a title is PC-and-console only, ship BC6H for everything HDR. If the title hits Android and iOS, ship a parallel ASTC HDR pack for the mobile builds — or render HDR-to-LDR offline and ship LDR ASTC if the disk budget is tight. The cross-pack transcoding shortcut UASTC offers for LDR content does not apply to HDR yet; UASTC HDR is in active development at Binomial but is not at parity with the LDR pipeline.
Picking a format by target platform
The right format follows from the target mix. A PC-only AAA title with no mobile build has no reason to touch ASTC. A mobile-only F2P title has no reason to touch BCn. The interesting decisions live in the middle.
- Cross-platform live service (PC, console, mobile): Author and store as UASTC inside KTX2; transcode to BC7 for PC and console, ASTC 4×4 for mobile. Use Oodle Texture RDO at lambda 30 on the BC7 output, astcenc -medium for the ASTC output. Disk delta versus shipping native dual packs is typically under 5%, and the build pipeline runs roughly in half the time.
- Cross-platform with HDR-heavy IBL: Same as above for albedo and roughness, but ship BC6H for PC/console HDR and ASTC HDR 6×6 for mobile HDR. Accept that HDR cubemaps will be authored and stored twice.
- Mobile F2P, memory-constrained: ASTC 4×4 for hero characters and UI, ASTC 6×6 for environment albedo, ASTC 8×8 for far-field terrain. The PSNR drop from 4×4 to 6×6 on a typical albedo map is around 2 dB, almost always invisible at gameplay framing distance, and the bits-per-pixel saving is more than 50%. Keep normal maps at ASTC 4×4 dual-plane regardless.
- VR title, fill-rate-bound: Stay at BC7 or ASTC 4×4 for everything in the foveated region. The cache locality of larger ASTC blocks is worse on the foveal-resolution path, and the bandwidth saving is not worth the visible loss.
Inside Unreal Engine 5, the BC7/ASTC decision is exposed in the Texture editor as a Compression Setting and overridden per platform via the AlternateTextureCompression block in BaseEngine.ini or the per-platform ini overrides documented in Epic’s Texture Format Support and Settings page. The default Windows and console targets map everything to BCn; the Android and iOS targets map to ASTC. Oodle Texture is enabled at the project level via the DefaultRDOLambda setting in the same ini block, and Unreal 5’s Virtual Texture system stores its tiles as BCn on PC and ASTC on mobile transparently to the artist.
A related write-up: Switch 2 hardware targets.
Unity 6 takes a different angle. The Player Settings > Other Settings panel exposes a Texture Compression dropdown per platform, with Default, ETC2, ASTC, and DXT/BC7 options. ASTC quality is set via the Compressor Quality dropdown on the texture itself (Fast / Normal / Best), and Unity 6 added per-platform Texture Compression Targeting that lets a single Android App Bundle ship multiple ASTC block sizes selected at install time based on the device GPU. The TextureFormat.BC7 reference and the platform-specific texture format pages document the override matrix.
Console support in 2026 has stabilized. PS5’s GNF/AGC texture format support is BCn-only, with no ASTC path. Xbox Series X|S supports BCn plus the BCPack supercompression block in DirectStorage — Microsoft’s DirectStorage texture shuffling sample documents the swizzle modes that BCPack expects, and the texture data must be BCn for hardware decode to engage. The Switch 2’s Tegra T239 supports both BCn and ASTC, which makes it the only current console where the BC7-versus-ASTC choice is a real shipping decision rather than a hardware constraint.
What this means for the next title you ship
The 2019-era summary that “BC7 is for PC and ASTC is for mobile” is still right for most teams, but the reasoning has shifted. It is no longer a quality-per-bit argument — modern astcenc and bc7enc_rdo land within a fraction of a dB on identical 8-bpp content. It is a hardware-decoder argument, a supercompressor argument, and a build-pipeline argument. PCs and PS5/Xbox Series have BCn decoders and Oodle/Kraken in the I/O stack, so BC7 with RDO is the lowest-friction path. Mobile and Switch 2 have ASTC decoders and benefit enormously from the variable block sizes, so per-asset ASTC footprint tuning matters more than encoder choice.
If you are starting a cross-platform pipeline today, author at high bit-depth source, store as UASTC inside KTX2, and let the build system transcode to the per-platform native format. The disk savings, the build time savings, and the freedom to add or drop a target platform later are all worth more than the fraction-of-a-dB PSNR you give up at transcode.
A related write-up: studio-level production decisions.
Sources
- ARM ASTC Format Overview — block layout, weight grids, partition tables, and dual-plane mode.
- astc-encoder 4.x changelog — release notes for the current ARM reference encoder.
- Microsoft BC7 format reference — bit layout and mode table for BC7.
- VK_EXT_texture_compression_astc_hdr — Vulkan extension specification for ASTC HDR.
- Basis Universal UASTC LDR 4×4 specification — the common-subset format used as a transcoding intermediate.
- Oodle Texture — RAD/Epic’s BCn rate-distortion optimization SDK.
- Xbox-GDK-Samples DirectStorage texture shuffling — Microsoft’s BCPack swizzle reference.
- NVIDIA ASTC for game assets — Tegra hardware decoder architecture and ASTC tooling notes.
