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.

Unos 10 minutos5 demos interactivas
Empezar a leer

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.

PruébaloCalculadora de memoria gráficaCambia la resolución y el número de texturas para ver cuánta memoria de GPU necesitan las mismas texturas en cada formato.
Resolución
  • RGBA8
    32 bits por téxel
    213 MiB
    Referencia
    21,3 MiB por textura
  • BC7 · ASTC 4×4
    8 bits por téxel
    53,3 MiB
    4× más pequeño
    5,3 MiB por textura
  • BC1 · ETC2 RGB
    4 bits por téxel
    26,7 MiB
    8× más pequeño
    2,7 MiB por textura
  • ASTC 6×6
    3,56 bits por téxel
    23,8 MiB
    9× más pequeño
    2,4 MiB por textura
  • ASTC 8×8
    2 bits por téxel
    13,3 MiB
    16× más pequeño
    1,3 MiB por textura
  • ASTC 12×12
    0,89 bits por téxel
    6 MiB
    35,7× más pequeño
    612 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.

PruébaloEncuentra un téxelHaz clic en cualquier téxel de esta textura de 32×32. Un formato por bloques puede calcular dónde está guardado; un PNG no.

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

0511

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.

PruébaloExplorador de bloques BC1Elige un bloque de 4×4 de la textura de ejemplo y mira exactamente cómo lo guarda BC1.
Bloque 12, 4

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.

Formatos de textura de GPU habituales
FormatoBits por téxelAlfaPlataformas habitualesIdeal para
BC141 bitEscritorio, consolasColor opaco con poca memoria disponible
BC38SíEscritorio, consolasColor con alfa suave en contenido antiguo
BC44Canales de datosEscritorio, consolasUn canal: máscaras, rugosidad, altura
BC58Canales de datosEscritorio, consolasMapas de normales (X e Y)
BC6H8NoEscritorio, consolasColor HDR, como skyboxes y lightmaps
BC78SíEscritorio, consolasColor de alta calidad, con o sin alfa
ETC14NoCasi todos los AndroidColor opaco en dispositivos muy antiguos
ETC24–8SíAndroid, iOSAlternativa móvil con amplia compatibilidad
ASTC0.89–8SíAndroid e iOS recientes, Apple SiliconCalidad ajustable en móviles
PVRTC2–4SíiPhone y iPad antiguosSolo dispositivos Apple antiguos
Basis ETC1SDepende del destinoSíCualquier GPU, mediante KTX2Descargas pequeñas que funcionan en cualquier GPU
Basis UASTCDepende del destinoSíCualquier GPU, mediante KTX2Alta calidad que funciona en cualquier GPU
PruébaloEjecuta los codificadores realesComprime la muestra de 512×512 con los mismos codificadores WebAssembly que usan nuestras herramientas y compara una zona ampliada.
Se ejecuta en tu navegador. No se sube nada.
Zona a ampliar
Original
RGBA8
1 MiB en memoria de GPU
BC1
BC1
4 bits por téxel
128 KiB en memoria de GPU
BC7
BC7
8 bits por téxel
256 KiB en memoria de GPU
ASTC 6×6
ASTC 6×6
3,56 bits por téxel
116 KiB en memoria de GPU
ASTC 12×12
ASTC 12×12
0,89 bits por téxel
29 KiB en memoria de 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.

PruébaloSelector de formatoElige dónde se usa la textura y qué contiene.
¿Dónde se ejecutará?
¿Qué contiene la textura?

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 ASTC

Capítulo 6

Consejos prácticos

Unos pocos hábitos evitan la mayoría de los problemas de compresión de texturas.

  1. 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.

  2. 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.

  3. 03

    Genera mipmaps

    Añaden alrededor de un 33 % de memoria, pero evitan el parpadeo de las superficies lejanas y aceleran el muestreo.

  4. 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.

  5. 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.