Cada plataforma, un destino: guía para elegir tu esquema de compresión
Los 4 artículos anteriores explicaron las herramientas de compresión de vértices y texturas. Pero saber usar una herramienta es una cosa; saber cuál usar y en qué contexto es otra muy distinta. Este artículo responde exactamente a eso, y está pensado para que tomes decisiones con confianza al terminar de leerlo.
Al final, deberías poder responder: ¿en qué plataforma corre mi proyecto? ¿El cuello de botella del primer render es la descarga o la memoria de video? ¿Qué esquema de compresión aplico a texturas y vértices?
Primero lo primero: el escenario manda, no la herramienta
Todo este artículo se resume en un principio fundamental, que este serie ha repetido hasta la saciedad:
No existe el «mejor» esquema de compresión, solo el que mejor se adapta a tu escenario.
Tres variables determinan la elección:
- Plataforma/Dispositivo: PC de escritorio, navegador móvil, visor de realidad virtual, miniprogramas… las capacidades varían enormemente.
- Tipo de uso: ¿Es una visualización puntual (como la página de producto de una tienda online) o una experiencia inmersiva prolongada (como un juego de VR)?
- Cuello de botella principal: ¿Es la velocidad de descarga, la memoria de video insuficiente, o la decodificación que bloquea el primer render?
Primero identifica el cuello de botella y luego elige la herramienta. La siguiente matriz condensa esta lógica.
La matriz de decisión clave: plataforma × esquema recomendado
Esta es la tabla más importante del artículo. Dividida por plataforma, ofrece la recomendación para texturas y vértices, junto con la razón.
| Plataforma / Escenario | Esquema de texturas | Esquema de vértices | Cuello de botella principal | Razón clave |
|---|---|---|---|---|
| Web de escritorio (PC) | KTX2 o WebP | MeshOpt / Cuantización | Velocidad de descarga | Memoria de video amplia; prioriza archivos ligeros y carga rápida |
| Web móvil (navegador) | KTX2 (obligatorio) | MeshOpt | Memoria de video | La memoria móvil es limitada; texturas con compresión por bloques |
| WebXR / Visores VR | KTX2 (obligatorio) | MeshOpt + LOD | Memoria de video + FPS | La memoria insuficiente crashea; la caída de FPS provoca mareos |
| Miniprogramas (WeChat) | KTX2 / WebP | MeshOpt / Cuantización pura | Tamaño del paquete + compatibilidad | Límite de tamaño; evita decodificadores pesados |
| Visualización de producto e-commerce | WebP (ligero) / KTX2 (preciso) | MeshOpt | Velocidad del primer render | Carga instantánea; prioriza el peso sobre la calidad |
| Escenas grandes / Gemelo digital | KTX2 (obligatorio) | MeshOpt + Draco + LOD | Memoria de video + draw calls | Muchas texturas y modelos; compresión integral |
Algunas conclusiones que conviene recordar:
- Si la memoria de video es el cuello de botella, KTX2 es obligatorio (móvil, VR, escenas grandes)
- Si la descarga es el problema y hay memoria de video de sobra, WebP es suficiente (escritorio, e-commerce)
- En entornos sensibles al tamaño del paquete (miniprogramas), prioriza MeshOpt sobre Draco: decodificador pequeño y buena compatibilidad
- Draco solo se considera para modelos muy grandes; en la mayoría de modelos medianos y pequeños, MeshOpt es más equilibrado
Comparativa completa de formatos de textura
Saber que «hay que usar KTX2» no es suficiente. Veamos todas las dimensiones de los formatos de textura:
| Formato | Tamaño de archivo | Uso de memoria de video | Velocidad de subida | Compatibilidad | Calidad de imagen | Caso de uso recomendado |
|---|---|---|---|---|---|---|
| PNG | Grande | Grande (descomprimido) | Lenta | Muy amplia | Sin pérdidas | Valores numéricos precisos/transparencia, o plataformas antiguas |
| JPG | Muy pequeño | Grande (descomprimido) | Lenta | Muy amplia | Con pérdidas | Mapas de color, prioridad en transferencia de red |
| WebP | Muy pequeño | Grande (descomprimido) | Lenta | Amplia | Alta | Web de escritorio, prioridad en velocidad de descarga |
| AVIF | Aún menor | Grande (descomprimido) | Lenta | En adopción | Alta | Plataformas nuevas, compresión extrema |
| KTX2 (ETC1S) | Pequeño | Muy pequeño | Rápida | Requiere transcodificación | Media (suficiente para color) | Mapas de color, móvil/VR |
| KTX2 (UASTC) | Medio | Pequeño | Rápida | Requiere transcodificación | Alta | Mapas de normales/datos |
Observa que las tres primeras filas (PNG/JPG/WebP/AVIF) tienen un uso de memoria de video «Grande»: sin importar lo pequeño que sea el archivo en disco, al cargarlo en la GPU se descomprime a los píxeles originales. Es la limitación fundamental de los formatos tradicionales.
La estrategia híbrida es habitual: los mapas de color clave usan KTX2 para garantizar la memoria de video, y los mapas secundarios (como un pequeño emissive) usan WebP para simplificar. No es necesario convertir todo a KTX2; distribuye según el cuello de botella.
Diagrama de decisión: paso a paso
La matriz es el resultado; el diagrama te muestra cómo llegar a él.
¿Dónde corre tu proyecto?
│
├─ Web de escritorio (memoria de video amplia)
│ └─ ¿El primer render es lento?
│ ├─ Sí → WebP (o AVIF) + MeshOpt [prioriza velocidad de descarga]
│ └─ No, pero hay muchos modelos → KTX2 + MeshOpt [prepara para el futuro]
│
├─ Web móvil / VR / Escenas grandes (memoria de video limitada)
│ └─ Texturas: KTX2 obligatorio (color ETC1S, datos UASTC)
│ └─ ¿Malla de vértices muy densa?
│ ├─ Sí → + Draco [compresión extrema, acepta decodificación lenta]
│ └─ No → + MeshOpt [equilibrado]
│
└─ Miniprogramas / Entornos limitados
└─ ¿Sensible al tamaño del paquete?
├─ Sí → Cuantización pura o MeshOpt + WebP [sin decodificador o muy pequeño]
└─ No → MeshOpt + KTX2 [combinación estándar]
Compresión de vértices vs. texturas: ¿dónde invertir?
Una pregunta frecuente: con presupuesto limitado, ¿qué optimizo primero? Depende de la composición del modelo:
| Características del modelo | Prioridad de inversión | Razón |
|---|---|---|
| Personaje/producto PBR (muchas texturas) | Compresión de texturas | Las texturas ocupan el 80%+; invertir en vértices tiene poco retorno |
| Modelo CAD/escaneado (vértices densos, pocas texturas) | Compresión de vértices | Los vértices son el volumen principal |
| Personaje animado (huesos + skinning) | Ambos, pero vértices primero (fuera de Draco) | Los datos de animación también pesan; Draco tiene soporte débil para animación |
| Arquitectura/escena (grande, texturas medias) | Texturas + LOD | Las texturas ahorran memoria de video; el LOD ahorra draw calls |
Un orden aproximado de retorno de inversión: Texturas KTX2 > Vértices MeshOpt/Cuantización > Simplificación geométrica (LOD) > Vértices Draco. Empieza por lo que más beneficio aporta.
Estrategia híbrida: texturas clave en KTX2, secundarias en WebP
No todas las texturas merecen convertirse a KTX2. Un material PBR típico tiene 5-6 mapas; convertirlos todos a KTX2 es mucho trabajo y a veces innecesario.
Una división práctica:
- KTX2 obligatorio: albedo (grande, color), normal (sensible a la precisión), roughness/metallic (afectan la iluminación)
- WebP/JPG aceptable: emissive (normalmente pequeño), AO (frecuencias medias-bajas), normales de detalle (si existen)
El criterio: ¿La textura es grande? ¿Tiene detalles de alta frecuencia? ¿Se muestrea con frecuencia? Si las tres respuestas son sí → KTX2; si ninguna → formato tradicional para simplificar.
Automatización: gltf-transform, un comando para todo
El comando optimize de gltf-transform es la bala de plata para la mayoría de los casos: detecta automáticamente el tipo de textura, comprime según la estrategia recomendada y opcionalmente procesa los vértices.
# Instalación
npm install -g @gltf-transform/cli
# Optimización estándar: texturas KTX2 + vértices MeshOpt + limpieza
gltf-transform optimize model.glb model-optimized.glb \
--texture-compress basisu \
--meshopt
Parámetros:
| Parámetro | Función | Por defecto |
|---|---|---|
--texture-compress basisu | Comprime texturas a KTX2 (elige ETC1S/UASTC automáticamente) | Desactivado |
--meshopt | Activa compresión MeshOpt en vértices | Desactivado |
--simplify | Simplificación geométrica (reduce vértices, con pérdidas) | Desactivado |
--weld | Fusiona vértices duplicados | Activado |
--prune | Elimina nodos/materiales no utilizados | Activado |
Una combinación «compresión agresiva» para móvil:
gltf-transform optimize model.glb model-mobile.glb \
--texture-compress basisu \
--meshopt \
--simplify --simplify-ratio 0.5 \
--prune --weld
Una combinación «suave» para escritorio (conserva detalles, solo comprime texturas y vértices):
gltf-transform optimize model.glb model-desktop.glb \
--texture-compress webp \
--meshopt
¿Sin ganas de escribir scripts? Usa la compresión online de Any3D
¿No quieres instalar Node ni configurar una cadena de herramientas? Compresión online de Any3D procesa directamente en el navegador: selecciona un GLB, ajusta los parámetros visualmente según la plataforma (móvil/escritorio/VR), y el modelo nunca se sube al servidor (todo se procesa localmente). Exporta la versión comprimida con un clic. Usa la misma base que gltf-transform, pero sin fricción. El próximo artículo, sobre el flujo completo de extremo a extremo, conectará todo el proceso.
Resumen rápido
- Memoria de video es el cuello de botella → KTX2, sin discusión
- Descarga es el problema y hay memoria de sobra → WebP/AVIF también sirve
- Sensible al tamaño del decodificador → MeshOpt > Cuantización pura > Draco
- Modelos muy grandes → solo entonces considera Draco
- En la duda →
gltf-transform optimizey ajusta si hace falta
Siguiente paso
Con el marco de selección listo, llega el artículo final: partiendo de un modelo real, recorreremos todo el flujo —exportación desde Blender, compresión de texturas, compresión de vértices, carga en el motor— con un script automatizado completo y una tabla de referencia rápida de toda la serie.