Guía para principiantes
Qué le pasa a una textura dentro de la GPU
Un PNG de 300 KB puede ocupar sin que lo notes 5 MB de memoria gráfica. Esta guía explica por qué, cómo las GPU reducen las texturas con compresión por bloques y cómo elegir un formato. Cada idea viene con algo que puedes probar.
Capítulo 1
El tamaño del archivo no es el tamaño en memoria
PNG y JPEG están pensados para guardar y enviar imágenes. Antes de que la GPU pueda dibujar una textura, la imagen se descomprime en téxeles sin procesar, normalmente de 4 bytes cada uno.
La GPU muestrea esos téxeles millones de veces por fotograma, así que deben estar listos para leerse. Por eso el uso de memoria depende solo de la resolución y del formato de píxel, no de lo bien que se comprimió el archivo. Los mipmaps, las copias reducidas que se usan en superficies lejanas, añaden aproximadamente un tercio más.
- RGBA832 bits por téxel213 MiBReferencia21,3 MiB por textura
- BC7 · ASTC 4×48 bits por téxel53,3 MiB4× más pequeño5,3 MiB por textura
- BC1 · ETC2 RGB4 bits por téxel26,7 MiB8× más pequeño2,7 MiB por textura
- ASTC 6×63,56 bits por téxel23,8 MiB9× más pequeño2,4 MiB por textura
- ASTC 8×82 bits por téxel13,3 MiB16× más pequeño1,3 MiB por textura
- ASTC 12×120,89 bits por téxel6 MiB35,7× más pequeño612 KiB por textura
Los formatos por bloques se redondean a bloques completos en cada nivel de mip, así que las cifras coinciden con lo que reserva la GPU.
Capítulo 2
Por qué la GPU no puede quedarse con los PNG
Cuando un shader muestrea una textura, puede pedir cualquier téxel en cualquier orden. El hardware tiene que encontrarlo al instante.
PNG y JPEG usan codificación de longitud variable: para llegar a un píxel del medio hay que decodificar primero todo lo anterior. Los formatos de GPU son de tasa fija: cada bloque de 4×4 ocupa exactamente los mismos bytes, así que la dirección de cualquier téxel se obtiene con una simple multiplicación. La textura permanece comprimida en memoria y la unidad de texturas decodifica los bloques al leerlos.
Usa las flechas del teclado para mover la selección.
- Téxel seleccionado
- x 13, y 18
- Su bloque
- columna 3, fila 4
- Dirección en BC1
- (4 × 8 + 3) × 8 bytes = byte 280
Los 64 bloques tal como están en memoria
El mismo téxel en un PNG
Primero hay que descomprimir las filas 0 a 18 (19 de 32)
Capítulo 3
Dentro de un bloque de 4×4
BC1, el formato más antiguo de uso extendido, muestra la idea con mayor claridad. Guarda un bloque de 16 téxeles en solo 8 bytes.
El codificador elige dos colores extremos. El decodificador los mezcla para obtener cuatro colores sobre una línea recta, y cada téxel guarda un número de 2 bits que señala el más cercano. Los bloques con cambios de color suaves se conservan bien; los que mezclan varios colores sin relación, no.
Capítulo 4
Muchos formatos, distintos compromisos
Los formatos más nuevos aprovechan mejor sus bits que BC1: más extremos, varias líneas de color dentro de un bloque, mejor canal alfa o la posibilidad de elegir el tamaño del bloque.
BC7 y ASTC 4×4 usan 8 bits por téxel y se ven muy parecidos al original. ASTC intercambia calidad por tamaño mediante el tamaño de bloque: un bloque siempre ocupa 128 bits, así que uno de 12×12 cuesta menos de un bit por téxel. Basis Universal sigue otro camino: distribuye un único archivo compacto y lo transcodifica en el dispositivo al formato que admita esa GPU.
| Formato | Bits por téxel | Alfa | Plataformas habituales | Ideal para |
|---|---|---|---|---|
| BC1 | 4 | 1 bit | Escritorio, consolas | Color opaco con poca memoria disponible |
| BC3 | 8 | Sí | Escritorio, consolas | Color con alfa suave en contenido antiguo |
| BC4 | 4 | Canales de datos | Escritorio, consolas | Un canal: máscaras, rugosidad, altura |
| BC5 | 8 | Canales de datos | Escritorio, consolas | Mapas de normales (X e Y) |
| BC6H | 8 | No | Escritorio, consolas | Color HDR, como skyboxes y lightmaps |
| BC7 | 8 | Sí | Escritorio, consolas | Color de alta calidad, con o sin alfa |
| ETC1 | 4 | No | Casi todos los Android | Color opaco en dispositivos muy antiguos |
| ETC2 | 4–8 | Sí | Android, iOS | Alternativa móvil con amplia compatibilidad |
| ASTC | 0.89–8 | Sí | Android e iOS recientes, Apple Silicon | Calidad ajustable en móviles |
| PVRTC | 2–4 | Sí | iPhone y iPad antiguos | Solo dispositivos Apple antiguos |
| Basis ETC1S | Depende del destino | Sí | Cualquier GPU, mediante KTX2 | Descargas pequeñas que funcionan en cualquier GPU |
| Basis UASTC | Depende del destino | Sí | Cualquier GPU, mediante KTX2 | Alta calidad que funciona en cualquier GPU |
Pulsa «Ejecutar codificadores» para comprimir la muestra. La primera vez se descargan los codificadores.
Capítulo 5
Cómo elegir un formato
Dos preguntas reducen las opciones rápidamente: ¿qué GPU tienen que cargar la textura y qué tipo de datos contiene?
Las texturas de color, los mapas de normales y las máscaras de un solo canal reaccionan de forma distinta a la compresión, y las plataformas de escritorio, móviles y web admiten familias de formatos diferentes. Elige tu caso para tener un buen punto de partida y luego comprueba el resultado con tus propias texturas.
Empieza con
ASTC 6×6
Considera también: ASTC 4×4 · ETC2 RGB
ASTC funciona en las GPU de Android e iOS recientes. 6×6 es un buen equilibrio; usa 4×4 para recursos clave y ETC2 para dispositivos antiguos.
Abrir el codificador ASTCCapítulo 6
Consejos prácticos
Unos pocos hábitos evitan la mayoría de los problemas de compresión de texturas.
- 01
Marca el color como sRGB y los datos como lineales
Las texturas de albedo y de UI son sRGB. Los mapas de normales, rugosidad y otros datos deben quedarse en lineal o la iluminación será incorrecta.
- 02
Da a los mapas de normales su propio formato
Usa formatos de dos canales como BC5 o EAC RG11 y reconstruye Z en el shader. Los formatos de color desperdician bits y añaden relieves visibles.
- 03
Genera mipmaps
Añaden alrededor de un 33 % de memoria, pero evitan el parpadeo de las superficies lejanas y aceleran el muestreo.
- 04
Usa dimensiones compatibles con los bloques
La mayoría de los formatos trabajan con bloques de 4×4, así que los tamaños divisibles entre 4 evitan el relleno. Formatos antiguos como PVRTC también exigen tamaños cuadrados y potencias de dos.
- 05
Revisa contenido real en dispositivos reales
Compara el resultado decodificado con el original a tamaño completo y confirma que tus GPU de destino admiten el formato.
Preguntas frecuentes
¿La compresión de texturas de GPU es sin pérdidas?
No. BC, ETC, ASTC y PVRTC son formatos con pérdidas y un tamaño fijo por bloque. Cuánta calidad se pierde depende del formato, del tamaño de bloque y de la imagen.
¿Por qué no usar directamente texturas PNG o JPEG?
Se descargan más rápido, pero la GPU no puede muestrearlas, así que se decodifican a téxeles sin procesar y ocupan toda la memoria. Los formatos de GPU también se mantienen pequeños en memoria.
¿Cuál es el mejor formato de textura?
BC7 es una buena opción por defecto en escritorio, ASTC en dispositivos móviles recientes, y KTX2 con Basis Universal cuando un mismo archivo debe funcionar en muchas GPU, como en la web.
¿Qué significa bits por téxel?
Es el coste medio de almacenamiento de un téxel. RGBA8 sin comprimir usa 32 bits, BC1 usa 4, BC7 usa 8 y ASTC va de 8 hasta unos 0,89 según el tamaño de bloque.
Pruébalo con tus propias texturas
Todos los codificadores se ejecutan localmente en tu navegador. Sube un PNG o un JPEG, elige un formato y compara el resultado.