Guia para iniciantes
O que acontece com uma textura dentro da GPU
Um PNG de 300 KB pode ocupar, sem você perceber, 5 MB de memória gráfica. Este guia mostra por quê, como as GPUs reduzem texturas com compressão em blocos e como escolher um formato. Cada ideia vem com algo que você pode testar.
Capítulo 1
Tamanho do arquivo não é tamanho na memória
PNG e JPEG foram feitos para armazenar e enviar imagens. Antes de a GPU desenhar uma textura, a imagem é descompactada em texels brutos, normalmente com 4 bytes cada.
A GPU amostra esses texels milhões de vezes por quadro, então eles precisam estar prontos para leitura. Por isso, o uso de memória depende apenas da resolução e do formato de pixel, não de quão bem o arquivo foi comprimido. Os mipmaps, cópias reduzidas usadas em superfícies distantes, acrescentam cerca de um terço.
- RGBA832 bits por texel213 MiBReferência21,3 MiB por textura
- BC7 · ASTC 4×48 bits por texel53,3 MiB4× menor5,3 MiB por textura
- BC1 · ETC2 RGB4 bits por texel26,7 MiB8× menor2,7 MiB por textura
- ASTC 6×63,56 bits por texel23,8 MiB9× menor2,4 MiB por textura
- ASTC 8×82 bits por texel13,3 MiB16× menor1,3 MiB por textura
- ASTC 12×120,89 bits por texel6 MiB35,7× menor612 KiB por textura
Os formatos em blocos são arredondados para blocos inteiros em cada nível de mip, então os números correspondem ao que a GPU aloca.
Capítulo 2
Por que a GPU não pode manter PNGs
Quando um shader amostra uma textura, ele pode pedir qualquer texel, em qualquer ordem. O hardware precisa encontrá-lo na hora.
PNG e JPEG usam codificação de comprimento variável: para chegar a um pixel no meio, é preciso decodificar tudo o que vem antes. Os formatos de GPU têm taxa fixa: cada bloco 4×4 usa exatamente o mesmo número de bytes, então o endereço de qualquer texel é uma simples multiplicação. A textura fica comprimida na memória e a unidade de textura decodifica os blocos enquanto os lê.
Use as setas do teclado para mover a seleção.
- Texel selecionado
- x 13, y 18
- Seu bloco
- coluna 3, linha 4
- Endereço no BC1
- (4 × 8 + 3) × 8 bytes = byte 280
Os 64 blocos como ficam na memória
O mesmo texel em um PNG
Primeiro é preciso descompactar as linhas 0 a 18 (19 de 32)
Capítulo 3
Dentro de um bloco 4×4
O BC1, o formato mais antigo de uso amplo, mostra a ideia com mais clareza. Ele guarda um bloco de 16 texels em apenas 8 bytes.
O codificador escolhe duas cores de extremidade. O decodificador as mistura em quatro cores sobre uma linha reta, e cada texel guarda um número de 2 bits que aponta para a mais próxima. Blocos com mudanças suaves de cor se mantêm bem; blocos que misturam várias cores sem relação, não.
Capítulo 4
Muitos formatos, compromissos diferentes
Formatos mais novos usam seus bits com mais inteligência que o BC1: mais extremidades, várias linhas de cor dentro de um bloco, alfa melhor ou a escolha do tamanho do bloco.
BC7 e ASTC 4×4 usam 8 bits por texel e ficam muito próximos do original. O ASTC troca qualidade por tamanho por meio do tamanho do bloco: um bloco sempre tem 128 bits, então um bloco 12×12 custa menos de um bit por texel. O Basis Universal segue outro caminho: distribui um único arquivo compacto e o transcodifica no dispositivo para um formato que aquela GPU suporta.
| Formato | Bits por texel | Alfa | Plataformas comuns | Ideal para |
|---|---|---|---|---|
| BC1 | 4 | 1 bit | Desktop, consoles | Cor opaca com pouca memória disponível |
| BC3 | 8 | Sim | Desktop, consoles | Cor com alfa suave em conteúdo antigo |
| BC4 | 4 | Canais de dados | Desktop, consoles | Um canal: máscaras, rugosidade, altura |
| BC5 | 8 | Canais de dados | Desktop, consoles | Mapas de normais (X e Y) |
| BC6H | 8 | Não | Desktop, consoles | Cor HDR, como skyboxes e lightmaps |
| BC7 | 8 | Sim | Desktop, consoles | Cor de alta qualidade, com ou sem alfa |
| ETC1 | 4 | Não | Quase todos os Android | Cor opaca em dispositivos muito antigos |
| ETC2 | 4–8 | Sim | Android, iOS | Alternativa mobile com amplo suporte |
| ASTC | 0.89–8 | Sim | Android e iOS recentes, Apple Silicon | Qualidade ajustável no mobile |
| PVRTC | 2–4 | Sim | iPhone e iPad antigos | Apenas dispositivos Apple antigos |
| Basis ETC1S | Depende do destino | Sim | Qualquer GPU, via KTX2 | Downloads pequenos que rodam em qualquer GPU |
| Basis UASTC | Depende do destino | Sim | Qualquer GPU, via KTX2 | Alta qualidade que roda em qualquer GPU |
Clique em “Executar codificadores” para comprimir a amostra. Na primeira vez, os codificadores são baixados.
Capítulo 5
Como escolher um formato
Duas perguntas reduzem a escolha rapidamente: quais GPUs precisam carregar a textura e que tipo de dado ela contém?
Texturas de cor, mapas de normais e máscaras de um canal reagem de forma diferente à compressão, e as plataformas desktop, mobile e web suportam famílias de formatos diferentes. Escolha o seu caso para ter um bom ponto de partida e depois confira o resultado com suas próprias texturas.
Comece com
ASTC 6×6
Considere também: ASTC 4×4 · ETC2 RGB
O ASTC funciona nas GPUs Android e iOS recentes. 6×6 é um bom equilíbrio; use 4×4 para os recursos principais e ETC2 para aparelhos antigos.
Abrir o codificador ASTCCapítulo 6
Dicas práticas
Alguns hábitos evitam a maioria dos problemas de compressão de texturas.
- 01
Marque cor como sRGB e dados como lineares
Texturas de albedo e de UI são sRGB. Mapas de normais, rugosidade e outros dados devem continuar lineares, ou a iluminação ficará errada.
- 02
Dê aos mapas de normais um formato próprio
Use formatos de dois canais, como BC5 ou EAC RG11, e reconstrua Z no shader. Formatos de cor desperdiçam bits e criam relevos visíveis.
- 03
Gere mipmaps
Eles acrescentam cerca de 33% de memória, mas impedem o tremido em superfícies distantes e deixam a amostragem mais rápida.
- 04
Use dimensões compatíveis com os blocos
A maioria dos formatos trabalha com blocos 4×4, então tamanhos divisíveis por 4 evitam preenchimento. Formatos antigos como o PVRTC também exigem tamanhos quadrados em potência de dois.
- 05
Confira conteúdo real em aparelhos reais
Compare o resultado decodificado com o original em tamanho real e confirme que suas GPUs de destino suportam o formato.
Perguntas frequentes
A compressão de texturas de GPU é sem perdas?
Não. BC, ETC, ASTC e PVRTC são formatos com perdas e tamanho fixo por bloco. Quanto de qualidade se perde depende do formato, do tamanho do bloco e da imagem.
Por que não usar texturas PNG ou JPEG diretamente?
Elas baixam mais rápido, mas a GPU não consegue amostrá-las, então são decodificadas em texels brutos e ocupam a memória inteira. Os formatos de GPU continuam pequenos também na memória.
Qual é o melhor formato de textura?
O BC7 é um ótimo padrão no desktop, o ASTC em aparelhos móveis recentes e o KTX2 com Basis Universal quando um único arquivo precisa funcionar em várias GPUs, como na web.
O que significa bits por texel?
É o custo médio de armazenamento de um texel. O RGBA8 bruto usa 32 bits, o BC1 usa 4, o BC7 usa 8 e o ASTC vai de 8 até cerca de 0,89, conforme o tamanho do bloco.
Teste com suas próprias texturas
Todos os codificadores rodam localmente no seu navegador. Envie um PNG ou JPEG, escolha um formato e compare o resultado.