Do Blender ao Ar: Compressão de Ponta a Ponta na Prática
Ao longo da série, já falamos sobre ferramentas, princípios e critérios de escolha. Neste último artigo, vamos amarrar tudo em um pipeline funcional: partindo de um modelo real do Blender, comprimindo passo a passo, registrando as mudanças de tamanho de arquivo, VRAM e tempo de carregamento em cada etapa, e ver se conseguimos transformar um "gordinho" de 50MB em um modelo enxuto de 5MB que abre instantaneamente no celular.
Público-alvo: quem já leu os 5 artigos anteriores e está pronto para colocar a mão na massa. Este artigo não traz conceitos novos — apenas fluxos, comandos e scripts que você pode copiar e executar.
Ponto de Partida: Um Modelo PBR Real
Vamos usar um modelo típico de vitrine de e-commerce como amostra: um modelo de produto de alta precisão, com texturas PBR completas.
| Métrica Inicial | Valor |
|---|---|
| Arquivo fonte do Blender | ~120MB (incluindo high-poly não exportado) |
| GLB exportado (float32 + PNG) | ~50MB |
| Número de vértices | ~180 mil |
| Texturas | 6 × 4096×4096 (albedo, normal, roughness, metallic, AO, emissive) |
| Uso de VRAM (6 texturas totalmente descomprimidas) | ~520MB |
| Meta | Arquivo ≤ 5MB, VRAM controlada, abertura instantânea no mobile |
Um arquivo de 50MB e 520MB de VRAM — esse modelo quebraria qualquer celular. Vamos resolver isso passo a passo.
Passo 0: Exportação Correta no Blender
O primeiro gargalo da compressão é a exportação. Muita gente já perde sangue aqui.
Configurações críticas ao exportar glTF do Blender:
- Formato:
glTF Binary (.glb)(arquivo único, fácil de transmitir) - Geometria: Marque
NormalseTangents(normal maps PBR precisam de tangentes) - UV: Garanta que está exportando (ativado por padrão)
- Texturas:
AutomaticouJPEG(o formato aqui não importa, vamos recomprimir depois, mas precisa exportar) - Compressão: Não marque a compressão de malha nativa do Blender — usaremos ferramentas mais profissionais
- Transformações:
+Y Up(padrão glTF) - Dados: Exporte apenas o necessário (animações, câmeras e luzes desnecessárias não devem ser exportadas para reduzir o tamanho)
O model.glb exportado: 50MB, 6 texturas PNG, vértices float32. Essa é nossa linha de base.
A primeira armadilha comum está aqui: o Blender exporta por padrão malhas não utilizadas e objetos auxiliares ocultos. Antes de exportar, use
File > Clean Up > Purge Orphanse selecione apenas os objetos desejados no Outliner.
Visão Geral do Pipeline de Ponta a Ponta
Vamos desenhar o fluxo completo para ter uma visão panorâmica:
Arquivo fonte do Blender
│ Exportar .glb (float32 + PNG) 50MB
▼
[1] Remover redundâncias + soldar vértices duplicados (gltf-transform) ~45MB
│
[2] Compressão de vértices: MeshOpt (gltfpack / gltf-transform) ~30MB
│
[3] Compressão de texturas: PNG → KTX2 (ETC1S/UASTC) ~6MB
│
[4] (Opcional) Simplificação geométrica LOD (simplify) ~4-5MB
▼
model-final.glb final ~5MB
│
Carregamento no motor (Three.js / Babylon.js) → transcodificação em runtime → publicação
Os números de cada etapa serão acompanhados na tabela abaixo.
Ferramentas: Qual Escolher
Existem várias ferramentas de compressão. Vamos comparar para não errar na escolha:
| Ferramenta | Pontos Fortes | Pontos Fracos | Ideal Para |
|---|---|---|---|
| gltf-transform | Versátil, texturas + vértices em um só lugar, API scriptável | Taxa de compressão extrema menor que ferramentas especializadas | Recomendado como principal para a maioria dos casos |
| gltfpack | Especialista em compressão de vértices, suporte nativo a MeshOpt | Capacidade de compressão de texturas fraca | Malhas densas, controle fino do MeshOpt |
| toktx | Mais profissional em compressão de texturas, mais parâmetros | Só processa texturas, não o modelo inteiro | Ajuste fino de texturas individuais |
| gltf-pipeline | Clássico, suporta Draco | Manutenção inativa, poucos recursos | Projetos antigos que já usam Draco |
| Ferramentas online (gltf.report) | Zero instalação | Não adequado para automação ou lote | Testes, tarefas pontuais |
Fluxo principal recomendado: use gltf-transform para todo o processo, complemente com gltfpack para vértices e toktx para ajustar texturas individuais. Todos os passos abaixo usam gltf-transform.
Passo 1: Remover Redundâncias + Soldar
Modelos frequentemente têm vértices duplicados, nós e materiais não utilizados. Vamos limpar primeiro.
gltf-transform optimize model.glb step1.glb --weld --prune
| Etapa | Tamanho do Arquivo | VRAM | Mudança |
|---|---|---|---|
| Linha de base | 50MB | ~520MB | — |
| Passo 1: Remover redundâncias | 45MB | ~520MB | -5MB (VRAM não muda, texturas ainda lá) |
A VRAM quase não mudou — isso é esperado. A remoção de redundâncias economiza principalmente vértices e estrutura; as texturas são as grandes consumidoras de VRAM.
Passo 2: Compressão de Vértices com MeshOpt
gltf-transform optimize step1.glb step2.glb --meshopt --weld --prune
--meshopt quantiza os vértices para 16 bits e aplica codificação sem perdas MeshOpt, adicionando automaticamente a extensão EXT_meshopt_compression.
| Etapa | Tamanho do Arquivo | VRAM | Mudança |
|---|---|---|---|
| Passo 1 | 45MB | ~520MB | — |
| Passo 2 + MeshOpt | 30MB | ~520MB | -15MB (parte de vértices) |
VRAM ainda em ~520MB? Sim — porque os vértices ocupam uma fração pequena da VRAM (10-20%). Cortar vértices tem impacto limitado na VRAM. O verdadeiro devorador de VRAM são as texturas — resolvemos isso no próximo passo.
Passo 3: Compressão de Texturas PNG → KTX2
Este é o passo com melhor custo-benefício.
gltf-transform optimize step2.glb step3.glb \
--texture-compress basisu \
--meshopt --weld --prune
--texture-compress basisu detecta automaticamente cada textura: texturas de cor (albedo, emissive) usam ETC1S; texturas de dados (normal, roughness, metallic, AO) usam UASTC.
| Etapa | Tamanho do Arquivo | VRAM | Mudança |
|---|---|---|---|
| Passo 2 | 30MB | ~520MB | — |
| Passo 3 + KTX2 | 6MB | ~70MB | -24MB arquivo / -450MB VRAM |
Este é o ponto de virada de todo o pipeline:
- Arquivo cai de 30MB para 6MB
- VRAM cai de 520MB para ~70MB — porque as 6 texturas 4096 passam de "pixels brutos descomprimidos" para "block compression", cada uma caindo de ~87MB para ~11-14MB
A VRAM caiu uma ordem de magnitude — é isso que determina se o modelo roda ou não no mobile.
Passo 4: (Opcional) Simplificação Geométrica
Se você quer um arquivo ainda menor e a cena permite reduzir a precisão dos vértices, adicione simplificação geométrica.
gltf-transform optimize step3.glb final.glb \
--texture-compress basisu \
--meshopt \
--simplify --simplify-ratio 0.5 \
--weld --prune
--simplify-ratio 0.5 significa manter aproximadamente 50% dos vértices.
| Etapa | Tamanho do Arquivo | VRAM | Mudança |
|---|---|---|---|
| Passo 3 | 6MB | ~70MB | — |
| Passo 4 + Simplificação 0.5 | 4.5MB | ~70MB | -1.5MB (VRAM praticamente inalterada) |
A simplificação economiza principalmente tamanho de arquivo, com pouco impacto na VRAM. O custo é a perda de detalhes do modelo — perceptível em visualização aproximada. Para páginas de produto de e-commerce, geralmente não recomendamos simplificação excessiva; para arquitetura e cenas grandes, é muito adequada.
Tabela de Acompanhamento de Resultados
Vamos ver o panorama completo das quatro etapas (com base na amostra acima, números apenas para ilustrar a ordem de grandeza):
| Etapa | Tamanho do Arquivo | VRAM | Redução Acumulada |
|---|---|---|---|
| Linha de base (float32 + PNG) | 50MB | ~520MB | — |
| + Remover redundâncias/soldar | 45MB | ~520MB | -10% |
| + MeshOpt vértices | 30MB | ~520MB | -40% |
| + Texturas KTX2 | 6MB | ~70MB | -88% arquivo / -87% VRAM |
| + Simplificação geométrica (0.5) | 4.5MB | ~70MB | -91% arquivo |
Conclusão: A compressão de texturas é responsável pela maior parte da economia de tamanho e VRAM. Compressão de vértices é o bônus; compressão de texturas é o essencial. Isso confirma exatamente o que dissemos no primeiro artigo — texturas ocupam 80% do volume, otimizá-las traz o maior retorno.
Versão em Um Comando: Compressão Tudo-em-Um
Se você não quer ver passo a passo, faça toda a otimização de uma vez:
gltf-transform optimize model.glb model-final.glb \
--texture-compress basisu \
--meshopt \
--simplify --simplify-ratio 0.5 \
--weld --prune
Este único comando = remover redundâncias + soldar + MeshOpt de vértices + texturas KTX2 + simplificação geométrica. Para 90% dos casos, isso é suficiente. Fazer passo a passo é principalmente para entender e ajustar parâmetros.
Não Quer Montar Ambiente? Use a Compressão Online do Any3D
Os comandos e scripts do gltf-transform acima exigem instalar Node, configurar ferramentas e decorar vários parâmetros. A ferramenta de compressão online do Any3D elimina tudo isso:
- Sem baixar scripts, sem instalar ambiente — abra a página e use
- O modelo não é enviado para servidores — todo o processamento acontece localmente no navegador, o arquivo nunca sai do seu dispositivo
- Configuração visual — texturas KTX2, vértices MeshOpt, simplificação geométrica, ajuste com sliders e pré-visualização em tempo real
- Múltiplas versões em um clique — exporte resultados comprimidos para plataformas mobile / desktop / VR
Escolha um GLB, selecione a plataforma alvo, clique e receba o modelo comprimido. Por baixo dos panos é o mesmo motor dos comandos acima (gltf-transform), mas sem barreiras e sem tocar em terminal.
FAQ: Armadilhas Comuns
Modelo fica preto / texturas não aparecem após compressão
- 99% é espaço de cor: textura de cor sem sRGB. No Three.js,
texture.colorSpace = THREE.SRGBColorSpace. - Esqueceu
--srgbpara texturas de cor no toktx.
Normal map comprimida com iluminação errada
- Normal map usou ETC1S — troque para UASTC.
- Normal map está no estilo DirectX (canal G apontando para baixo), mas o motor espera OpenGL — precisa inverter o canal G.
Carregamento travado na primeira tela no mobile
- Verifique se está carregando o decodificador Draco wasm (requisição extra). No mobile, prefira MeshOpt.
- Caminho do transcoder KTX2 configurado errado, falha na transcodificação e fallback para descompressão via CPU.
Arquivo ficou maior após compressão
- Texturas muito pequenas (< 128px) não valem a pena para KTX2 — block compression tem overhead fixo.
- Modelo já foi comprimido antes; recomprimir não traz ganho (ou até traz prejuízo).
Malha quebrada após simplificação
--simplify-ratiomuito baixo — reduza para 0.7-0.8.- Simplificação funciona bem em superfícies duras (mecânica, arquitetura), mas tende a quebrar superfícies orgânicas (personagens).
KTX2 falha ao carregar em alguns navegadores
- Safari antigo / WebView antigo não suportam. Prepare fallback PNG/WebP, ou use o campo
fallbackda extensãoKHR_texture_basisupara fornecer textura reserva.
Tabela de Referência Rápida da Série
A essência dos 6 artigos condensada em uma tabela. Vale salvar.
Composição de Volume
| Componente | Proporção | Ferramenta de Otimização |
|---|---|---|
| Texturas | 70-85% | KTX2 (maior ganho) |
| Dados de vértices | 10-20% | MeshOpt / Quantização / Draco |
| Dados de animação | 0-15% | Reduzir keyframes / comprimir |
| Outros | < 2% | Remover redundâncias |
Fórmula de VRAM
VRAM formato tradicional = largura * altura * 4 bytes * 1.333 (com mipmaps)
VRAM KTX2 block compression ≈ fórmula acima / 4 (ETC1S) ou / 2 (UASTC)
Seleção de Compressão de Vértices
| Cenário | Recomendação |
|---|---|
| Zero dependências, mais simples | Quantização pura (KHR_mesh_quantization) |
| Melhor equilíbrio para Web | MeshOpt |
| Taxa de compressão extrema, pode esperar decodificação | Draco |
| Mini-apps / sensível a tamanho de pacote | Quantização pura / MeshOpt, evitar Draco |
Seleção de Compressão de Texturas
| Tipo de Textura | Codificação Recomendada |
|---|---|
| albedo / emissive (cor) | KTX2 ETC1S |
| normal / roughness / metallic / AO (dados) | KTX2 UASTC |
| Web desktop, prioriza velocidade de download | WebP / AVIF |
| Texturas pequenas (< 128px) | Manter PNG, não usar KTX2 |
Comando Único
# Otimização completa (texturas + vértices + simplificação)
gltf-transform optimize model.glb model-final.glb \
--texture-compress basisu --meshopt \
--simplify --simplify-ratio 0.5 --weld --prune
Referência por Plataforma
| Plataforma | Texturas | Vértices |
|---|---|---|
| Web desktop | WebP / KTX2 |