Kris

De Blender al despliegue: compresión end-to-end en la práctica

Compresión 3DPipelineCompresión de texturasCompresión de vérticesglTF

Hasta ahora, en esta serie hemos cubierto herramientas, principios y criterios de selección. En este último artículo, juntamos todo en una tubería funcional: partimos de un modelo real de Blender, lo comprimimos paso a paso, registramos los cambios en tamaño de archivo, uso de VRAM y tiempo de carga, y al final vemos si logramos que pase de un pesado de 50 MB a un modelo de 5 MB que se abra al instante en un móvil.

Público objetivo: quienes ya han leído los 5 artículos anteriores y están listos para poner manos a la obra. Este artículo no introduce nuevos conceptos; solo contiene procesos, comandos y scripts que se pueden reproducir.

Punto de partida: un modelo PBR real

Tomamos como muestra un modelo de producto de e‑commerce muy típico: un modelo de alta precisión con texturas PBR completas.

Indicador inicialValor
Archivo fuente de Blender~120 MB (incluye el high‑poly no exportado)
GLB exportado (float32 + PNG)~50 MB
Número de vérticesAprox. 180.000
Texturas6 de 4096×4096 (albedo, normal, roughness, metallic, AO, emissive)
VRAM usada (6 texturas sin comprimir)~520 MB
ObjetivoArchivo ≤ 5 MB, VRAM controlada, apertura instantánea en móvil

50 MB de archivo, 520 MB de VRAM: este modelo directamente petaría en un dispositivo móvil. Vamos paso a paso.

Paso 0: exportar correctamente desde Blender

El primer filtro de compresión es la exportación. Mucha gente pierde sangre aquí.

Ajustes clave al exportar glTF desde Blender:

  • Formato: glTF Binary (.glb) (archivo único, fácil de transportar)
  • Geometría: marcar Normals, Tangents (las normal maps PBR necesitan tangentes)
  • UV: asegurarse de exportar (activado por defecto)
  • Texturas: Automatic o JPEG (el formato de textura en este paso da igual, luego las re‑comprimiremos, pero hay que asegurarse de que se exporten)
  • Compresión: no marcar la compresión de malla de Blender; usaremos herramientas más especializadas
  • Transformación: +Y Up (estándar glTF)
  • Datos: marcar solo lo necesario (animaciones, cámaras, luces no se exportan si no se necesitan, así se reduce el tamaño)

Tras la exportación, model.glb: 50 MB, 6 texturas PNG, vértices float32. Esta es nuestra línea de base.

Un error común aquí: Blender exporta por defecto mallas no utilizadas y objetos auxiliares ocultos. Antes de exportar, ve a File > Clean Up > Purge Orphans y en el Outliner selecciona solo los objetos que quieras exportar.

Panorama completo de la tubería end‑to‑end

Dibujemos el flujo completo para tener una visión general:

Archivo fuente de Blender
   │   Exportar .glb (float32 + PNG)            50 MB
   ▼
[1] Eliminar redundancias + soldar vértices duplicados (gltf-transform)   ~45 MB
   │
[2] Compresión de vértices: MeshOpt (gltfpack / gltf-transform) ~30 MB
   │
[3] Compresión de texturas: PNG → KTX2 (ETC1S/UASTC)     ~6 MB
   │
[4] (Opcional) Simplificación geométrica LOD (simplify)         ~4-5 MB
   ▼
model-final.glb final                              ~5 MB
   │
Carga en el motor (Three.js / Babylon.js) → transcodificación en tiempo de ejecución → despliegue

Los números de cada paso se irán registrando en la tabla siguiente en tiempo real.

Cadena de herramientas: ¿cuál elegir?

Hay varias herramientas de compresión. Comparemos para no equivocarse:

HerramientaFortalezasDebilidadesAdecuada para
gltf-transformVersátil, texturas+vértices en un solo comando, programableLa tasa de compresión extrema es menor que herramientas especializadasRecomendado como principal, la mayoría de casos
gltfpackExperto en compresión de vértices, soporte nativo de MeshOptCapacidad de compresión de texturas débilVértices densos, se quiere control fino de MeshOpt
toktxMás profesional en compresión de texturas, parámetros completosSolo procesa texturas, no el modelo completoAjuste fino de texturas individuales
gltf-pipelineClásico, soporta DracoNo se mantiene activamente, pocas funcionesProyectos antiguos que ya usan Draco
Herramientas online (gltf.report)Sin instalaciónNo apto para automatización, lotes grandesExperimentos, tareas únicas

Recomendación principal: usar gltf-transform para todo el flujo, y cuando sea necesario complementar con gltfpack para vértices y toktx para texturas individuales. Todos los pasos siguientes se basan en gltf-transform.

Paso 1: Eliminar redundancias + soldar

Los modelos suelen tener vértices duplicados, nodos y materiales no utilizados. Limpiemos primero.

gltf-transform optimize model.glb step1.glb --weld --prune
FaseTamaño archivoVRAMCambio
Línea de base50 MB~520 MB
Paso 1: limpieza45 MB~520 MB-5 MB (la VRAM no cambia porque las texturas siguen ahí)

La VRAM casi no se mueve, es esperado: la limpieza afecta principalmente a vértices y estructura; las texturas son las que dominan la VRAM.

Paso 2: Compresión de vértices con MeshOpt

gltf-transform optimize step1.glb step2.glb --meshopt --weld --prune

--meshopt cuantifica los vértices a 16 bits y los codifica sin pérdida con MeshOpt, añadiendo automáticamente la extensión EXT_meshopt_compression.

FaseTamaño archivoVRAMCambio
Paso 145 MB~520 MB
Paso 2 + MeshOpt30 MB~520 MB-15 MB (parte de vértices)

¿La VRAM sigue en ~520 MB? Sí, porque los vértices ocupan poco en VRAM (10-20%), reducir vértices tiene un impacto limitado. El verdadero monstruo de la VRAM son las texturas, las abordamos en el siguiente paso.

Paso 3: Compresión de texturas PNG → KTX2

Este paso es el que ofrece la mejor relación calidad‑beneficio.

gltf-transform optimize step2.glb step3.glb \
  --texture-compress basisu \
  --meshopt --weld --prune

--texture-compress basisu detecta automáticamente cada textura: las de color (albedo, emissive) usa ETC1S, las de datos (normal, roughness, metallic, AO) usa UASTC.

FaseTamaño archivoVRAMCambio
Paso 230 MB~520 MB
Paso 3 + KTX26 MB~70 MB-24 MB de archivo / -450 MB de VRAM

Este paso es el punto de inflexión de toda la tubería:

  • El archivo pasa de 30 MB a 6 MB
  • La VRAM pasa de ~520 MB a ~70 MB — porque las 6 texturas de 4096 pasan de «píxeles originales sin comprimir» a «compresión por bloques», cada una de ~87 MB a ~11-14 MB

La VRAM se reduce en un orden de magnitud; eso es lo que realmente determina si un modelo puede cargarse en un móvil.

Paso 4: (Opcional) Simplificación geométrica

Si se quiere reducir aún más el tamaño y la escena lo permite (bajando la precisión de los vértices), se puede añadir simplificación 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 conservar aproximadamente el 50% de los vértices.

FaseTamaño archivoVRAMCambio
Paso 36 MB~70 MB
Paso 4 + simplificación 0.54.5 MB~70 MB-1.5 MB (VRAM casi no cambia)

La simplificación reduce principalmente el tamaño del archivo, afecta poco a la VRAM. El coste es una pérdida de detalle del modelo: se nota al verlo de cerca. En páginas de producto de e‑commerce no se recomienda simplificar demasiado; en arquitectura/escenas grandes es muy adecuado.

Tabla resumen de impacto

Veamos los cuatro pasos juntos (basados en la muestra anterior, los números son solo para ilustrar órdenes de magnitud):

PasoTamaño archivoVRAMReducción acumulada
Línea de base (float32+PNG)50 MB~520 MB
+ Limpieza y soldadura45 MB~520 MB-10%
+ MeshOpt en vértices30 MB~520 MB-40%
+ KTX2 en texturas6 MB~70 MB-88% archivo / -87% VRAM
+ Simplificación (0.5)4.5 MB~70 MB-91% archivo

Conclusión: la compresión de texturas aporta la mayor parte de la reducción de tamaño y VRAM. La compresión de vértices es la guinda, la de texturas es el plato fuerte. Esto coincide con lo dicho en el primer artículo: las texturas ocupan el 80% del volumen, optimizarlas da el mayor rendimiento.

Versión en un solo comando: para vagos con un solo clic

Si no quieres ver los pasos por separado, optimiza todo de una vez:

gltf-transform optimize model.glb model-final.glb \
  --texture-compress basisu \
  --meshopt \
  --simplify --simplify-ratio 0.5 \
  --weld --prune

Este comando = limpieza + soldadura + MeshOpt en vértices + KTX2 en texturas + simplificación geométrica. Vale para el 90% de los casos; los pasos separados son para entender y ajustar parámetros.

¿No quieres montar el entorno? Usa la compresión online de Any3D

Los comandos y scripts de gltf-transform anteriores requieren instalar Node, configurar la cadena de herramientas y recordar muchos parámetros. La herramienta de compresión online de Any3D se encarga de todo eso:

  • No necesitas descargar scripts ni instalar nada — abre la web y usa
  • El modelo no se sube al servidor — todo se procesa localmente en tu navegador, el archivo no sale de tu dispositivo
  • Configuración visual — texturas KTX2, vértices MeshOpt, simplificación geométrica, ajusta con sliders y previsualiza en tiempo real
  • Múltiples versiones con un clic — exporta el resultado comprimido para plataformas móvil / escritorio / VR

Elige un GLB, selecciona la plataforma objetivo, pulsa y obtén el modelo comprimido. Por debajo usa el mismo motor que la línea de comandos (gltf-transform), pero sin barreras y sin tocar la terminal.

FAQ de errores comunes

El modelo se vuelve negro / las texturas no se muestran al comprimir

  • El 99% de las veces es el espacio de color: falta asignar sRGB a las texturas de color. En Three.js: texture.colorSpace = THREE.SRGBColorSpace.
  • Al usar toktx, olvidar --srgb en las texturas de color.

Las normal maps se ven mal después de comprimir

  • La normal map se comprimió con ETC1S; cambia a UASTC.
  • La normal map está en estilo DirectX (canal verde hacia abajo) y el motor espera OpenGL (necesita invertir el canal G).

La carga en móvil se queda bloqueada en la pantalla de inicio

  • Comprueba si se está cargando el wasm del decodificador Draco (petición adicional). En móvil prioriza MeshOpt.
  • Ruta del transcodificador KTX2 incorrecta; falla la transcodificación y se cae a descompresión por CPU.

El archivo comprimido es más grande que el original

  • Las texturas son demasiado pequeñas (< 128 px); comprimir a KTX2 no compensa porque la compresión por bloques tiene un overhead fijo.
  • El modelo ya estaba comprimido antes; volver a comprimir no aporta beneficio (incluso puede ser negativo).

El modelo simplificado tiene agujeros o roturas

  • --simplify-ratio demasiado bajo; prueba con 0.7-0.8.
  • La simplificación es buena para superficies duras (mecánica, arquitectura), pero en superficies orgánicas (personajes) tiende a romperse.

KTX2 no carga en algunos navegadores

  • Safari antiguo / WebView antiguo no lo soportan. Prepara un fallback con PNG/WebP, o usa el campo fallback de la extensión KHR_texture_basisu para proporcionar texturas alternativas.

Hoja de referencia rápida de la serie

El resumen de los 6 artículos en una tabla. Recomiendo guardarla.

Composición del volumen

ComponentePorcentajeHerramientas de optimización
Texturas70-85%KTX2 (mayor rendimiento)
Vértices10-20%MeshOpt / cuantificación / Draco
Animaciones0-15%Red
Apóyanos