關閉      標題: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"