Kris

3Dモデルはなぜこんなに重いのか?

3D 圧縮glTFWebGLパフォーマンス

あなたのモデルは密かに太っている

GLBファイルをエクスポートした。10MB、まあ許容範囲だ。スマホに転送して開いてみる——白画面、カクつき、最悪の場合クラッシュ。

PCでは問題ないのに、スマホだと爆発する。これはコードのせいではない。3Dモデルには直感に反する特性がある:ディスク上とVRAM上では、サイズがまったく違うのだ。

JPG画像はディスク上で200KBしかないかもしれない。しかしGPUはJPGを知らない。GPUが理解できるのは生のピクセルデータだけだ。そのため、VRAMにアップロードされる前に、画像は完全に解凍される。2048x2048のテクスチャは、解凍後におよそ22MBのVRAMを消費する。6枚のテクスチャ(albedo、normal、roughness、metallic、AO、emissive)を使えば、マテリアル1つで132MBになる。

スマホのVRAMは合計2〜4GB程度。1つのモデルのテクスチャだけで3〜6%を消費する。シーンに10モデルあったら?

分解してみる——サイズの内訳

典型的なGLBモデルは主に3つの要素で構成される:頂点データテクスチャマップ、そしてメタデータとアニメーションだ。

実際のPBRモデルで見てみよう:

構成要素具体的な内容典型的な割合説明
テクスチャマップalbedo、normal、roughness、metallic、AOなど70-85%ほぼ常に最大の容量要因
頂点データposition、normal、UV、tangent、色10-20%モデルの複雑さに依存
アニメーションデータボーン、スキニング、キーフレーム0-15%アニメーションがある場合のみ
その他マテリアル定義、シーン構造、カメラ< 2%無視できるレベル

テクスチャマップが約80%を占めている。最適化すべきは頂点だと思いがちだが、実際に場所を取っているのはテクスチャなのだ。

3DモデルのPBRテクスチャマップ内訳

「ディスクが小さい」≠「VRAMが小さい」

3Dパフォーマンスを理解する上で、これが最も重要なポイントかもしれない。

PNGとJPGはネットワーク転送用に設計されている——ディスク上では小さく、ダウンロードが速い。しかしGPUはそれらを直接使えない。必ず生のピクセルデータに完全解凍する必要がある。計算方法:

VRAM使用量 = 幅 * 高さ * 4バイト(RGBA) * 1.333(mipmap込み)

4096x4096のRGBAテクスチャの場合:

指標数値
PNGファイルサイズ~8MB
JPGファイルサイズ~1.5MB
VRAM使用量(mipmap込み)~87MB

1.5MBのJPGが、VRAM上では87MBになる。

Mipmapとは? GPUはテクスチャの段階的に縮小されたバージョンを生成する。元のサイズから1x1ピクセルまで、各レベルは前のレベルの半分だ。これにより遠くのオブジェクトのレンダリングが高速かつクリアになるが、VRAMを約33%余分に消費する。ほぼすべての3Dアプリケーションがmipmapを使用するため、このオーバーヘッドは標準的なものだ。

つまりPNG/JPGは旅行用圧縮袋のようなものだ——圧縮すれば小さくて持ち運びに便利だが、目的地ではすべて広げなければならない。ダウンロードは速くなるが、VRAMはまったく節約できない。

ディスク保存サイズとGPU VRAM使用量の膨張比較

VRAM不足で何が起こるか

「VRAM不足」というダイアログボックスは表示されない。実際の状況はもっと悪い:

  • モバイル:白画面、またはOSがタブを強制終了
  • VRヘッドセット:フレーム落ち。VRでのフレーム落ちは「ちょっとカクつく」ではなく、吐き気を引き起こす
  • デスクトップ:テクスチャのちらつき、品質低下、レンダリングの遅延

Redditのある開発者はWebXRギャラリーを作り、Questに60枚のステレオ画像を詰め込んだ。最初は正常だったが、次第に不安定になり、最終的にクラッシュした。彼は数日かけてコードを調べたが、最後にVRAMのことを真剣に考えたことがなかったと気づいた——ただひたすらGPUにJPGを詰め込んでいただけだった。

圧縮の2つのアプローチ

3Dモデル圧縮には主に2つの方向性がある:

頂点圧縮——頂点座標、法線、UVなどのジオメトリデータをよりコンパクトな形式で格納する。例えば32ビット浮動小数点数を16ビット整数に変換する(これを量子化、quantizationと呼ぶ)。代表的なソリューション:DracoMeshOptKHR_mesh_quantization

テクスチャ圧縮——テクスチャをVRAM上でも圧縮状態に保つ。GPUはサンプリング時に個々のピクセルをリアルタイムでデコードするため、パフォーマンスのオーバーヘッドはほぼない。代表的なソリューション:KTX2 + Basis Universal

頂点圧縮テクスチャ圧縮
削減対象ジオメトリデータテクスチャ
典型的な効果50-90%削減ディスク50-70%削減、VRAM 75%削減
非可逆かはい、精度低下はい、画質低下
適したシナリオ頂点密度の高いモデルほぼすべてのPBRモデル
詳細第2回第3、4回

よくある誤解:Dracoで頂点を圧縮すれば万事解決だと思うこと。しかしテクスチャがモデルの80%を占めているのに、頂点を半分に減らしても、全体では10%しか軽くならない。両方を管理する必要がある。

すべてのシナリオに効く万能薬はない

これがシリーズ全体の核となる主張だ:

プラットフォーム、デバイス、使用方法が異なれば、必要な圧縮戦略も異なる。

シナリオ主要なボトルネック重点的に注目すべき点
デスクトップWeb表示ダウンロード速度ファイルサイズ
モバイルブラウザVRAMテクスチャ圧縮
VRヘッドセットVRAM + フレームレートテクスチャ圧縮 + 頂点簡略化
モバイルアプリパッケージサイズ + 互換性軽量ソリューション(MeshOpt)
大規模シーンVRAM + draw call全方位圧縮 + LOD

以降の各回では「Xを使えばいい」とだけ言うのではなく、Xがどのようなシナリオに適しているのか、いつ逆効果になるのか、どのような場合にYを使うべきなのかを明確に説明する。

次のステップ

今回は問題を明確にした。次回は実践だ——頂点圧縮の3つのツールを紹介する:量子化、MeshOpt、そしてDracoだ。

応援する