Hubbry Logo
search
logo

Ericsson Texture Compression

logo
Community Hub0 Subscribers
Read side by side
from Wikipedia

Ericsson Texture Compression (ETC) is a lossy texture compression technique developed in collaboration with Ericsson Research in early 2005. It was originally developed under the name iPACKMAN[1] and based on an earlier compression scheme called PACKMAN.[2]

ETC1

[edit]

The original 'ETC1' compression scheme provides 6x compression of 24-bit RGB data. It does not port the compression of images with Alpha components, although there are work-arounds for this.[3]

ETC1 takes 4x4 groups of pixel data and compresses each into a single 64-bit word. The 4×4 pixel group is first divided into two 4×2 chunks - either horizontally or vertically. Each half is given a base color - either using 4/4/4 RGB or by giving one of them a 5/5/5 RGB and having the other be a 3/3/3 bit offset from that base. Each 4×2 region also has a 3-bit brightness range selection. Each pixel is then offset from the base color by adding one of four signed values to the base color for its half of the 4×4 group.

This format is a part of the OpenGL ES graphics standard extensions[4] for embedded devices such as mobile phones and has been approved by the Khronos Group for use in the WebGL graphics standard for browser-side World Wide Web graphics. [citation needed]

Android version 2.2 (Froyo) includes support for ETC1.[5][3]

ETC2

[edit]

The 'ETC2' scheme expands ETC1 in a backwards-compatible way to provide higher quality RGB compression,[6] as well as compression of RGBA (RGB plus alpha).

The following ETC2 codecs are mandatory in OpenGL ES 3.0[7] and OpenGL 4.3:[8]

  • GL_COMPRESSED_RGB8_ETC2 — Compresses RGB888 data, the followup of ETC1.
  • GL_COMPRESSED_RGBA8_ETC2_EAC — Compresses RGBA8888 data with full alpha support.
  • GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 — Compresses RGBA data where pixels are either fully transparent or fully opaque.

sRGB variants of the above codecs are also available.

EAC

[edit]

EAC is built on the same principles as ETC1/ETC2 but is used for one- or two-channel data. The following four EAC codecs are included as mandatory in OpenGL ES 3.0 and OpenGL 4.3:

  • GL_COMPRESSED_R11_EAC — one channel unsigned data
  • GL_COMPRESSED_SIGNED_R11_EAC — one channel signed data
  • GL_COMPRESSED_RG11_EAC — two channel unsigned data
  • GL_COMPRESSED_SIGNED_RG11_EAC — two channel signed data

Encoding

[edit]

The RGBA and RG11 formats are encoded in 128 bits per 4x4 block, while the rest are encoded in 64 bits per block. For RGBA, the RGB channels are encoded in a regular 64-bit block, while the A channel gets its own 64-bit block. RG11 formats are encoded similarly, with one 64-bit block per component.

Software

[edit]

A software utility called ETCPACK for compression and decompression of ETC1/ETC2 textures is available for free download in code form from Ericsson on GitHub.[9]

See also

[edit]

References

[edit]
[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
Ericsson Texture Compression (ETC) is a family of lossy image compression algorithms designed for efficient storage and real-time decompression of textures in graphics hardware, particularly for mobile and embedded devices, achieving a fixed bitrate of 4 bits per pixel (bpp) while maintaining low decoding complexity.[1] Developed in collaboration with Ericsson Research, the initial version, known as ETC1 or iPACKMAN, was introduced in 2005 by researchers Jacob Ström and Tomas Akenine-Möller at Lund University, building on prior work like PACKMAN to address bandwidth limitations in handheld graphics by compressing 4×4 pixel blocks into 64 bits using subblock partitioning, base colors, and luminance modifiers from a predefined codebook.[1] ETC1 gained widespread adoption as an optional format in OpenGL ES 2.0 and was natively supported in Android devices starting from version 2.2, enabling reduced memory footprint and power consumption in mobile rendering pipelines.[2] Subsequent enhancements led to ETC2 and the related Ericsson AC (EAC) formats, finalized around 2012 as part of the Khronos Group's standards, with ETC2 providing backward compatibility to ETC1 alongside improvements such as punch-through alpha support, sRGB encoding, and higher visual quality—approximately 1 dB better in peak signal-to-noise ratio (PSNR) than ETC1 and competitors like S3TC/DXT.[2] ETC2 and EAC became mandatory in OpenGL ES 3.0 and OpenGL 4.3, extending capabilities to RGBA textures (with 1-bit or full alpha) and single- or dual-channel formats (R or RG) at 4–8 bpp, making them suitable for a broad range of applications including games and real-time visualization on resource-constrained hardware.[2] These formats excel in scenarios with uniform chrominance but varying luminance, outperforming earlier mobile compression schemes like PVRTC by 1.6 dB in PSNR, and Ericsson provides open-source compression tools like ETCPACK for developers targeting these standards.[1][3]

Overview

Introduction

Ericsson Texture Compression (ETC) is a family of lossy texture compression codecs developed by Ericsson Research to reduce memory bandwidth requirements in real-time graphics applications, particularly on resource-constrained mobile devices.[2] Introduced in collaboration with hardware vendors in the mid-2000s, ETC enables efficient storage and transmission of texture data by minimizing bus congestion and power consumption without significantly compromising visual fidelity.[2][3] At its core, ETC compresses textures by encoding 4×4 pixel blocks into fixed bit rates, such as 4 bits per pixel (bpp) for RGB data, allowing GPUs to decode and rasterize images rapidly while preserving perceptual quality.[2] This fixed-rate approach ensures predictable memory usage, making it suitable for embedded systems where variable compression ratios could introduce inefficiencies.[2] The ETC family encompasses several formats tailored to different needs: ETC1 provides RGB-only compression at 4 bpp, EAC handles single-channel (e.g., red) or dual-channel (e.g., red-green) data at 4 or 8 bpp for applications like normal maps, and ETC2 extends ETC1 with full RGBA support, including alpha blending and punchthrough modes for enhanced quality (up to 1.0 dB improvement over ETC1).[2] ETC2 maintains backward compatibility with ETC1, facilitating adoption across platforms.[2][3] Key advantages of ETC include hardware-accelerated decoding in fixed-function pipelines, which eliminates decompression artifacts during rendering, and standardized support in APIs like OpenGL ES 3.0 and OpenGL 4.3, enabling widespread use on over 370 million Android devices as of 2012.[2] These features make ETC a cornerstone for mobile game development and graphics optimization.[2][3]

History and Development

Ericsson Texture Compression (ETC) originated from research efforts at Ericsson Research aimed at optimizing texture storage for resource-constrained mobile devices. The foundational work began with the PACKMAN algorithm, introduced in 2004 as a lossy compression scheme designed to reduce memory bandwidth demands in mobile phones and PDAs, where bus widths were typically limited to 16 or 32 bits per cycle.[4] This was followed in early 2005 by iPACKMAN, a refined extension developed in collaboration with external academic partners, which improved image quality while maintaining low hardware complexity for real-time decompression.[5] iPACKMAN, later renamed ETC1, focused on RGB texture compression and was specifically tailored to address bandwidth bottlenecks in early mobile GPUs, enabling more efficient rendering without excessive power consumption or pipeline stalls.[5] ETC1 gained formal recognition through standardization in the OpenGL ES 2.0 specification, released in 2007, which included it as an optional texture compression format to support embedded graphics applications.[6] Practical adoption accelerated with its integration into Android version 2.2 (Froyo) in 2010, and by 2012 it was available on over 370 million devices, establishing it as a de facto standard for mobile texture compression.[2] However, ETC1's limitations, such as the absence of native alpha channel support and inadequate handling of single- or two-channel textures like normal maps, prompted further development. To overcome these shortcomings, Ericsson Research introduced EAC (Ericsson Texture Compression for one- and two-channel textures) around 2010, providing specialized compression for R and RG formats with both unsigned and signed variants.[2] This innovation culminated in ETC2, a unified extension released in 2012 that incorporated EAC alongside enhancements to ETC1, including full alpha support and backward compatibility. ETC2 was standardized as mandatory in OpenGL ES 3.0 and OpenGL 4.3 that same year, ensuring widespread hardware support and higher quality compression—approximately 1.0 dB better in PSNR than ETC1—while continuing to prioritize efficiency for mobile and embedded systems.[2]

Formats

ETC1

Ericsson Texture Compression 1 (ETC1) is a lossy compression format designed for RGB textures, achieving a fixed rate of 4 bits per pixel by encoding 4×4 pixel blocks in 64 bits. This provides a 6:1 compression ratio for 24-bit RGB data, enabling efficient storage and transmission in resource-constrained environments such as mobile graphics. Developed by Ericsson Research, ETC1 was standardized in OpenGL ES 2.0 via the OES_compressed_ETC1_RGB8_texture extension and became widely adopted on Android devices.[7][2] Each 64-bit block is divided into two 4×2 or 2×4 subblocks, determined by a flip bit (bit 32: 0 for horizontal, 1 for vertical orientation). The upper 32 bits (63–32) encode the base colors and mode, while the lower 32 bits (31–0) contain 2-bit indices for each of the 16 pixels. Two encoding modes are supported: individual mode (diffbit 33 = 0), which uses separate 4:4:4 RGB base colors for each subblock (12 bits per subblock: R1 bits 63–60, G1 55–52, B1 47–44; R2 59–56, G2 51–48, B2 43–40), and differential mode (diffbit 33 = 1), which uses a shared 5:5:5 RGB base for the first subblock (R1' 63–59, G1' 55–51, B1' 47–43) modified by 3-bit signed differentials for the second (dR 58–56, dG 50–48, dB 42–40, ranging from -4 to +3). Each subblock also includes a 3-bit table selector (codeword 1: bits 39–37; codeword 2: 36–34) that indexes one of eight predefined 4-entry intensity modifier tables, applied to the base color based on the 2-bit pixel index (e.g., index 00 adds the first table entry, clamped to [0, 255]). These tables provide relative brightness adjustments, such as [-8, -2, 2, 8] for table 0, to approximate per-pixel colors within the subblock.[7] ETC1 supports only 2D textures without borders, producing an INVALID_OPERATION error for non-zero borders in OpenGL. It lacks native alpha channel support, requiring separate textures for transparency in applications like games. Additionally, the limited color precision and fixed subblock structure can lead to visible artifacts, particularly in high-contrast or detailed images where the intensity modifiers fail to capture fine gradients accurately. All valid ETC1 blocks are backwards compatible with the later ETC2 format, allowing seamless loading as RGB data without alpha.[7][2]

EAC

Ericsson Texture Compression's EAC (Ericsson Android Compression) format is designed for compressing single- or dual-channel texture data, such as luminance or chrominance components, at a fixed rate of 4 bits per pixel. For one-channel data (e.g., R11 EAC), a 4×4 texel block is encoded into 64 bits, while two-channel data (e.g., RG11 EAC) uses 128 bits, consisting of two independent 64-bit blocks side by side. This enables efficient storage of non-RGB data like alpha channels or normal map components without correlating channels, distinguishing it from multi-channel color formats.[8] The base structure of an EAC block centers on a single intensity value per channel, unlike subblock-based approaches in RGB formats, with an 8-bit base codeword defining the primary intensity level for the entire 4×4 block. This base codeword occupies bits 63–56 (for little-endian byte order), followed by a 4-bit index (bits 55–52) selecting one of 16 predefined multiplier tables and a 4-bit table selector (bits 51–48) for further refinement. The remaining 48 bits (47–0) provide 3-bit indices for each of the 16 texels, referencing offset values from the selected multiplier table to adjust the base intensity. These offsets are quantized, typically drawing from tables with values like -1, -2, -3, -10, 0, 1, 2, and 9, scaled relative to a base delta for granular control over intensity variations.[8] EAC supports both unsigned and signed modes to accommodate different data ranges. In unsigned mode, values span 0 to 2047 (approximately 11-bit precision after scaling), suitable for non-negative data, while signed mode covers -1024 to 1023, ideal for bidirectional values like displacement in height maps. Decoding involves computing each texel's value as the clamped sum of the scaled base codeword and the texel-specific modifier from the multiplier table, using formulas such as value=\clamp(base×8+[4](/page/84)+modifier×multiplier×8,[0](/page/0),2047)\text{value} = \clamp(\text{base} \times 8 + [4](/page/8-4) + \text{modifier} \times \text{multiplier} \times 8, [0](/page/0), 2047) for unsigned R11 EAC and value=\clamp(base×8+modifier×multiplier×8,[0](/page/0),2047)[1024](/page/1024)\text{value} = \clamp(\text{base} \times 8 + \text{modifier} \times \text{multiplier} \times 8, [0](/page/0), 2047) - [1024](/page/1024) for signed R11 EAC; these operations ensure linear output for direct shader use. For RG11 EAC, the process applies independently to each channel's block.[8] EAC is primarily applied to alpha channels for transparency in textures, single-component height or displacement maps, and paired components (e.g., X and Y) in normal maps, where channel independence preserves detail without RGB assumptions. A key aspect is that EAC blocks are not interpretable by ETC1 or base ETC2 RGB decoders, necessitating dedicated hardware or software handling, though implementations often reuse ETC2 alpha decoding logic with minor modifications like truncation. In practice, EAC integrates with ETC2 for full RGBA textures by attaching an R11 EAC block for alpha to an ETC1-compatible RGB block.[8]

ETC2

ETC2, or Ericsson Texture Compression 2, extends the original ETC1 format by unifying it with the Enhanced AC (EAC) format to provide comprehensive support for RGBA textures, including alpha transparency, while maintaining the 4x4 texel block structure.[8] This unification allows for compressed RGBA8888 textures at 8 bits per pixel using 128-bit blocks, where the first 64 bits handle RGB data via an ETC1-compatible scheme and the remaining 64 bits manage the alpha channel through EAC.[8] ETC2 also supports sRGB color space variants, enabling accurate gamma correction during decoding for nonlinear color representation.[8] The format defines several encoding modes to optimize for different texture characteristics. In the RGB + separate alpha mode, a 128-bit block combines a 64-bit ETC1 RGB sub-block with a 64-bit EAC alpha sub-block, where the alpha is computed as a base codeword modified by a multiplier and per-pixel indices, yielding 8-bit alpha values per texel.[8] The punch-through alpha mode uses a single 64-bit block to encode RGB data in 63 bits alongside a 1-bit alpha threshold, allowing binary transparency (0 or 255 per texel) where transparent pixels have RGB set to (0,0,0); this mode selects from differential, T, H, or planar RGB encoding based on bit patterns.[8] For smooth gradients on planar surfaces, the T-mode employs a 64-bit block with two RGB444 base colors (24 bits total), a 3-bit distance selector indexing predefined deltas, and 32 bits of 2-bit per-pixel indices to select among four derived colors using a T-shaped interpolation pattern for smooth horizontal gradients.[9][8] ETC2 ensures backwards compatibility by treating valid ETC1 blocks as opaque RGB in ETC2 decoders, falling back seamlessly for RGB-only textures without alpha.[8] It defines mandatory compressed formats in graphics APIs, such as GL_COMPRESSED_RGBA8_ETC2 for RGBA8888 and GL_COMPRESSED_RGB8_ETC2 for RGB8, integrated into OpenGL ES 3.0 and later specifications.[8] Compared to ETC1, ETC2 introduces native alpha channel support, eliminating the need for separate textures or overlays, and provides punch-through alpha for efficient handling of sharp transparent edges in sprites or UI elements.[9] Additionally, modes like T-mode and planar reduce artifacts in gradients and flat areas by using invalid ETC1 bit combinations to signal advanced encoding, achieving approximately 1 dB higher PSNR quality on average for RGB compression.[9][10]

Technical Specifications

Block Structure

Ericsson Texture Compression (ETC) formats employ a standardized block structure to achieve fixed-rate compression suitable for real-time graphics rendering. Each block represents a 4×4 array of pixels, enabling efficient memory usage and random access in texture sampling. This 4×4 partitioning is universal across ETC variants, including ETC1, EAC, and ETC2, with RGB data compressed at 64 bits per block (4 bits per pixel) and RGBA at 128 bits per block (8 bits per pixel) to accommodate alpha channels.[8][11] The block is divided into two 4×2 subblocks, each covering 8 pixels, to facilitate parallel processing and local color adaptation. The orientation of these subblocks—either horizontal (two 2×4 regions side-by-side) or vertical (two 4×2 regions stacked)—is determined by a single flip bit in the block header, allowing flexibility in handling varying texture gradients without increasing bit overhead. This subblock division is a core feature shared by ETC1 and ETC2 RGB modes, promoting hardware-friendly decoding.[7][8] Bit allocation within a 64-bit RGB block typically includes a compact header (e.g., 2 bits for mode selection like differential or individual, plus the flip bit), base colors or intensities (around 32 bits total, such as 16 bits per subblock in RGB565-like encoding), modifier table indices (3–4 bits per subblock to select from predefined offset tables), and pixel indices (2 bits per pixel, totaling 32 bits for the 16 pixels to reference modifiers). For RGBA blocks, this structure is extended by pairing two 64-bit blocks or using dedicated alpha encoding in EAC. These allocations ensure a balance between color fidelity and compression ratio, with headers and indices enabling differential encoding for smoother gradients.[7][8][11] Textures using ETC must align blocks on 4×4 boundaries to maintain decoding efficiency; if dimensions are not multiples of 4, padding is applied to the nearest multiple, ensuring complete blocks without partial encoding. This alignment requirement supports direct GPU access and avoids artifacts in mipmapping.[8][11] Pixel values are reconstructed using a general formula that adds a selected modifier to a base color:
Pixel color=base color+mi \text{Pixel color} = \text{base color} + m_i
where $ m_i $ is the modifier value from the chosen table, indexed by the 2-bit pixel codeword and clamped to the valid range (e.g., [0, 255] for 8-bit channels). Base colors are typically expanded from quantized representations (e.g., 4–5 bits per channel) before applying modifiers, providing perceptual quality through luminance adjustments. This additive model is foundational across ETC formats, with table values derived from 8–16 predefined sets of offsets (e.g., ±8, ±2 levels).[7][8]

Encoding Modes

Ericsson Texture Compression employs two primary encoding modes—differential and individual—to represent colors within each 4x4 texel block, allowing adaptation to varying color distributions while maintaining a fixed 64-bit block size. These modes are selected during encoding to minimize reconstruction error, with a flip bit providing additional flexibility in subblock assignment. The differential mode uses a shared base color for both subblocks, derived from a 5-bit RGB codeword, while the second subblock's base color is obtained by adding component-wise 3-bit signed deltas (ranging from -4 to +3 in the 5-bit domain, yielding effective 8-bit differences of approximately -32 to +24 after bit replication). Per-pixel 2-bit indices then select offsets from a 4-entry modifier table, applied uniformly across RGB components for luminance adjustment; the table is chosen via a 3-bit selector from 8 predefined sets, with representative offsets such as -8, -2, 2, and 8 in the base table.[7][1] The individual mode, suited for high-detail areas with disparate subblock colors, encodes independent base colors for each subblock using 4-bit RGB codewords (RGB444), extended to 8 bits via replication (value × 17). Similar to differential mode, 2-bit per-pixel indices access a 4-entry modifier table per subblock, with the same 8 selectable tables providing offsets; this approach avoids delta computation, prioritizing direct color specification at the cost of fewer bits for intensity variation. In extensions like ETC2, punchthrough transparency is supported in individual and differential modes by replacing the flip bit with a transparent bit and using a dedicated pixel index to indicate alpha=0, providing binary alpha (0 or 255) without full per-pixel alpha storage.[8][1] A flip bit (1 bit) swaps subblock assignments to optimize partitioning, alternating between horizontal (two 4×2 subblocks) and vertical (two 2×4 subblocks) layouts for better alignment with image gradients. Full implementations use 3 bits per subblock for finer granularity across the 8 tables.[7] Encoding selects the optimal configuration by evaluating combinations of modes, orientations, and modifier table selections (8 per subblock) along with base color quantizations, choosing the one with the lowest error, typically measured as mean squared error (MSE). The error metric is computed as the sum of squared differences between original and reconstructed pixels:
e2=i=116[(RoiRri)2+(GoiGri)2+(BoiBri)2] e^2 = \sum_{i=1}^{16} \left[ (R_o^i - R_r^i)^2 + (G_o^i - G_r^i)^2 + (B_o^i - B_r^i)^2 \right]
where subscripts oo and rr denote original and reconstructed values for the 16 texels, often weighted perceptually (e.g., factors of 0.299 for R, 0.587 for G, 0.114 for B) to align with human vision.[1][8]

Additional Modes in ETC2

ETC2 introduces two further encoding modes beyond differential and individual to improve quality in specific cases, while maintaining the 64-bit block size. The T-mode encodes a T-shaped color distribution using a base color (RGB666, 18 bits), a 2-bit rotation code to orient the T, an intensity modifier table (3 bits), and a distance table index (4 bits from 8 tables with values like 0, 21, 43, 85), with 2-bit per-pixel indices selecting combinations of base, stem, and crossbar colors. This mode is suited for textures with linear gradients plus a perpendicular stem. The Planar mode supports smooth color planes using three 8-bit corner colors (24 bits total: top-left, top-right, bottom-left), a 2-bit orientation bit, and 2-bit per-pixel indices to interpolate positions within the plane via bilinear-like computation, clamped to [0, 255]. These modes are selected via header bits (e.g., 2 bits for mode ID) and provide higher fidelity for gradients and uniform areas compared to subblock-based modes, with encoding evaluating them alongside the original modes for minimal error.[8]

Implementation

Encoding Techniques

Encoding textures in Ericsson Texture Compression (ETC) formats involves selecting optimal parameters for each 4x4 texel block to minimize visual artifacts while adhering to the fixed bit budget. Brute-force encoding exhaustively evaluates all possible mode configurations and parameter combinations per block to find the one that best approximates the original texels, typically using mean squared error (MSE) as the objective. For ETC1, this approach is computationally feasible due to its limited modes—individual and differential—with approximately 10^5 to 10^6 configurations per block arising from sub-block partitioning (2 options), modifier table selection (8 options), and color quantization.[12][8] However, for ETC2, the expanded set of five modes (individual, differential, T, H, and planar) increases complexity dramatically, leading to around 2^24 trials per block when accounting for mode-specific partitions, endpoint selections, and modifier assignments, rendering exhaustive search impractical for real-time or large-scale applications.[13][8] To address the performance bottleneck, heuristic optimizations approximate the optimal encoding by pruning the search space based on block characteristics. Threshold-based mode selection, for instance, uses luminance differences to pre-select promising modes: low-contrast blocks favor planar mode, while high-contrast ones prioritize T or H modes, skipping up to 80% of evaluations.[12] Perceptual metrics enhance these heuristics by weighting errors according to human visual sensitivity, such as emphasizing luminance over chrominance (e.g., via weighted MSE where green channel errors are multiplied by 2-4) or integrating into rendering pipelines to simulate post-decompression appearance.[13][14] These methods, often accelerated with SIMD instructions like SSE/AVX2, achieve near-optimal quality at 10-100x the speed of brute force while targeting real-time constraints under 1 ms per texture.[12] For RGBA textures, the workflow separates RGB and alpha channels to leverage ETC's strengths: RGB is encoded using ETC1 or ETC2 modes within a 64-bit block, while alpha is handled independently via EAC in a separate 64-bit block, enabling 128 bits total per 4x4 block.[8] This decoupling allows optimized encoding for each component, with dithering applied to the alpha channel during quantization to mitigate banding artifacts in smooth gradients by introducing controlled noise that distributes errors across texels. Despite these advances, ETC encoding presents significant challenges, including prolonged times—often seconds per texture for high-quality results on standard hardware—due to the need for iterative mode and parameter refinement.[12] Trade-offs between quality and speed are inherent, as faster heuristics may introduce artifacts like blocky edges in complex regions, and there is no lossless mode, ensuring all compression is lossy by design.[8] Notably, ETC2 encoding can be 100-1000x slower than S3TC equivalents owing to its richer mode set and finer parameter granularity.[12]

Software Tools

ETCPACK is the official open-source library provided by Ericsson for compressing and decompressing textures in the ETC1, ETC2, and EAC formats.[3] Released publicly around 2012, it is implemented in C++ and includes a command-line utility named etcpack for batch processing of textures from input formats like PPM to ETC-compressed outputs.[15] The library supports RGB8 and RGBA textures via ETC2, as well as single-channel (R) and dual-channel (RG) compression through EAC, ensuring compatibility with OpenGL ES 3.0 and OpenGL 4.3 standards.[3] A faster alternative, etcpak (developed by wolfpld), offers improved performance for ETC compression and is commonly used in modern workflows as of 2023.[16] Major game engines such as Unity and Unreal Engine provide built-in support for ETC compression, allowing developers to import and compress textures directly within the editor without external plugins for basic functionality.[17] For ETC1 specifically, Imagination Technologies' PVRTexTool offers a command-line interface (PVRTexToolCLI) that enables high-quality offline compression, often used in asset pipelines for mobile-targeted content.[18] Additional open-source and free tools include AMD's Compressonator, which provides GPU-accelerated encoding for ETC2 formats, supporting real-time previews and batch operations on Windows and Linux platforms. For runtime decompression, Mesa3D incorporates the etcdec utility in its source code, offering a lightweight C implementation for decoding ETC1 and ETC2 blocks without hardware acceleration, suitable for software fallbacks in open-source graphics drivers. Decompression of ETC textures is typically handled via fixed-function hardware on supported GPUs, incurring no significant CPU overhead during rendering. In contrast, encoding ranges from real-time approximations using simplified heuristics for interactive tools to offline high-quality methods that exhaustively search parameter spaces for optimal compression ratios. ETCPACK's last major update occurred around 2015, though its reference implementation remains compatible with modern GPUs supporting the Khronos standards.[19]

Adoption and Standards

Graphics APIs

Ericsson Texture Compression (ETC) formats have been integrated into several major graphics APIs through standardized extensions and core specifications, enabling efficient use of compressed textures in cross-platform rendering applications. In OpenGL ES, the ETC1 format was introduced via the OES_compressed_ETC1_RGB8_texture extension, ratified by the Khronos Board of Promoters in July 2005 and last modified in April 2008, which allows for 4x4 pixel block compression of RGB data without alpha.[7] Subsequently, ETC2 and EAC formats became mandatory in the core specification of OpenGL ES 3.0, released on August 6, 2012, providing developers with reliable support for RGB, RGBA, and single/dual-channel signed/unsigned textures across compliant mobile devices.[20] [2] For desktop OpenGL, ETC2 and EAC support was added to the core profile in version 4.3, also released on August 6, 2012, aligning desktop capabilities with mobile standards and eliminating the need for platform-specific texture sets.[21] Prior to this, limited ETC support was available through vendor extensions such as those derived from OpenGL ES compatibility features, though widespread adoption occurred with the core inclusion.[22] WebGL adopted ETC formats to facilitate compressed texture usage in web browsers. ETC1 was supported in WebGL 1.0, released in March 2011, through the WEBGL_compressed_texture_etc1 extension, which maps to the OES_compressed_ETC1_RGB8_texture format for RGB compression.[23] ETC2 and EAC became part of the core in WebGL 2.0, announced on February 27, 2017 and based on OpenGL ES 3.0, enabling high-quality, hardware-accelerated texture rendering directly in HTML5 canvases without additional extensions.[24] [25] In Vulkan, ETC2 formats have been supported since version 1.0, released on February 16, 2016, via dedicated enums such as VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK and VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, allowing explicit control over compressed texture loading and rendering with hardware acceleration on compatible GPUs. The detailed block structures, encoding modes, and format mappings for all ETC variants across these APIs are documented in the Khronos Data Format Specification, ensuring consistency without vendor-specific deviations.[8]

Platform Usage

Ericsson Texture Compression (ETC) has seen widespread adoption in mobile platforms, particularly Android, where ETC1 became the default texture format starting with Android 2.2 (Froyo) in 2010, providing broad compatibility for OpenGL ES 2.0 devices.[2] This support extended to ETC2 with the introduction of OpenGL ES 3.0 in Android 4.3 (Jelly Bean MR2) in 2013, enabling RGBA textures and higher quality compression for nearly all subsequent Android devices.[26] ETC formats remain a staple in Android game development for texture storage, with ETC1 and ETC2 used extensively due to their universal support across billions of devices, often as the fallback for compatibility in titles targeting diverse hardware.[27] In web and browser environments, WebGL extensions enable ETC usage for HTML5 games, allowing compressed textures to load efficiently in resource-constrained settings. The WEBGL_compressed_texture_etc extension supports multiple ETC and EAC formats, facilitating deployment on mobile browsers where ETC serves as a reliable fallback for low-end devices lacking advanced compression hardware.[28][29] On consoles and PCs, ETC adoption is limited, as desktop GPUs and traditional x86 systems favor S3TC (DXT/BCn) formats for their established hardware acceleration and broader ecosystem integration. However, in ARM-based architectures like Apple's M-series chips, Metal provides optional support for ETC2, allowing developers to leverage it alongside other formats for cross-platform mobile and hybrid applications on macOS and iOS.[30][31][32] ETC is prevalent in mobile augmented reality (AR) and virtual reality (VR) applications, such as Pokémon GO, where it helps optimize performance on battery-powered devices by compressing textures without requiring decompression at runtime. Benchmarks indicate ETC achieves approximately 6x memory savings compared to uncompressed RGB textures, contributing to APK size reductions of up to 50% in graphics-intensive apps through efficient storage and bandwidth usage.[27][33] As of 2025, ETC continues to dominate mid-range mobile GPUs like ARM Mali and Qualcomm Adreno series, ensuring compatibility on the majority of active Android devices, though Adaptive Scalable Texture Compression (ASTC) is increasingly adopted for its superior quality at variable bitrates in premium titles.[26][34]

References

User Avatar
No comments yet.