關閉
標題:glb 瘦身方法 輸出 meshopt 與 draco
內容:
glb_to_small_glb.sh
#!/bin/bash
set -e
INPUT="$1"
OUTPUT="$2"
MODE="$3" # meshopt | draco
if [ -z "$INPUT" ] || [ -z "$OUTPUT" ]; then
echo "Usage: $0 <input.glb> <output.glb> [meshopt|draco]"
exit 1
fi
# 預設模式
if [ -z "$MODE" ]; then
MODE="meshopt"
fi
if [ "$MODE" != "meshopt" ] && [ "$MODE" != "draco" ]; then
echo "❌ Invalid mode: $MODE (use meshopt or draco)"
exit 1
fi
echo "🚀 Processing: $INPUT -> $OUTPUT"
# 建立一個唯一的暫存檔
TEMP_GLB="$(mktemp --suffix=.glb)"
# --- 核心優化流程 ---
# 1. resize: 限制貼圖大小 (瘦身最有效) - 設為 2048 或 1024
# 2. dedup/prune: 清理垃圾
# 3. reorder: 優化頂點索引排列 (對壓縮有幫助)
# 4. quantize: 幾何量化 (減少精度以利壓縮) - 注意:若有 GIS 需求請小心 generic 參數
# 5. uastc: 貼圖轉 KTX2 (畫質/大小平衡)
# 6. draco: 幾何最終壓縮 (比 meshopt 更小)
# 注意:這裡使用指令串聯,減少 IO 讀寫
gltf-transform resize "$INPUT" "$TEMP_GLB" --width 2048 --height 2048
gltf-transform dedup "$TEMP_GLB" "$TEMP_GLB"
gltf-transform prune "$TEMP_GLB" "$TEMP_GLB"
# 這裡分段處理,避免記憶體爆掉 (若檔案極大)
# 如果你想要用 meshopt 而不是 draco,請替換最後一行
echo "Compressing Textures (UASTC) & Geometry (Draco)..."
gltf-transform uastc "$TEMP_GLB" "$TEMP_GLB" \
--level 2 --rdo 1.0 --zstd 18
gltf-transform quantize "$TEMP_GLB" "$TEMP_GLB"
# 最終壓縮 (選擇 Draco 以獲得最小體積)
# 若怕屬性消失可加參數: --quantize-generic 16
if [ "$MODE" = "draco" ]; then
gltf-transform draco "$TEMP_GLB" "$OUTPUT" --quantize-color 16
else
gltf-transform meshopt "$TEMP_GLB" "$OUTPUT" --level medium
fi
echo "✅ Done! Created: $OUTPUT"
# Clean up
rm -f "$TEMP_GLB"