Kris

Do Blender ao Ar: Compressão de Ponta a Ponta na Prática

Compressão 3DPipelineCompressão de texturaCompressão de vérticesglTF

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 InicialValor
Arquivo fonte do Blender~120MB (incluindo high-poly não exportado)
GLB exportado (float32 + PNG)~50MB
Número de vértices~180 mil
Texturas6 × 4096×4096 (albedo, normal, roughness, metallic, AO, emissive)
Uso de VRAM (6 texturas totalmente descomprimidas)~520MB
MetaArquivo ≤ 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 Normals e Tangents (normal maps PBR precisam de tangentes)
  • UV: Garanta que está exportando (ativado por padrão)
  • Texturas: Automatic ou JPEG (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 Orphans e 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:

FerramentaPontos FortesPontos FracosIdeal Para
gltf-transformVersátil, texturas + vértices em um só lugar, API scriptávelTaxa de compressão extrema menor que ferramentas especializadasRecomendado como principal para a maioria dos casos
gltfpackEspecialista em compressão de vértices, suporte nativo a MeshOptCapacidade de compressão de texturas fracaMalhas densas, controle fino do MeshOpt
toktxMais profissional em compressão de texturas, mais parâmetrosSó processa texturas, não o modelo inteiroAjuste fino de texturas individuais
gltf-pipelineClássico, suporta DracoManutenção inativa, poucos recursosProjetos antigos que já usam Draco
Ferramentas online (gltf.report)Zero instalaçãoNão adequado para automação ou loteTestes, 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
EtapaTamanho do ArquivoVRAMMudança
Linha de base50MB~520MB
Passo 1: Remover redundâncias45MB~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.

EtapaTamanho do ArquivoVRAMMudança
Passo 145MB~520MB
Passo 2 + MeshOpt30MB~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.

EtapaTamanho do ArquivoVRAMMudança
Passo 230MB~520MB
Passo 3 + KTX26MB~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.

EtapaTamanho do ArquivoVRAMMudança
Passo 36MB~70MB
Passo 4 + Simplificação 0.54.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):

EtapaTamanho do ArquivoVRAMRedução Acumulada
Linha de base (float32 + PNG)50MB~520MB
+ Remover redundâncias/soldar45MB~520MB-10%
+ MeshOpt vértices30MB~520MB-40%
+ Texturas KTX26MB~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 --srgb para 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-ratio muito 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 fallback da extensão KHR_texture_basisu para 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

ComponenteProporçãoFerramenta de Otimização
Texturas70-85%KTX2 (maior ganho)
Dados de vértices10-20%MeshOpt / Quantização / Draco
Dados de animação0-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árioRecomendação
Zero dependências, mais simplesQuantização pura (KHR_mesh_quantization)
Melhor equilíbrio para WebMeshOpt
Taxa de compressão extrema, pode esperar decodificaçãoDraco
Mini-apps / sensível a tamanho de pacoteQuantização pura / MeshOpt, evitar Draco

Seleção de Compressão de Texturas

Tipo de TexturaCodificação Recomendada
albedo / emissive (cor)KTX2 ETC1S
normal / roughness / metallic / AO (dados)KTX2 UASTC
Web desktop, prioriza velocidade de downloadWebP / 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

PlataformaTexturasVértices
Web desktopWebP / KTX2
Apoie-nos