GLB

GLBファイルとは

テクスチャを内側に抱えた glTF。依存ファイルだらけのフォルダーではなく、1 ファイルで済みます。

GLB とは何か

GLB はバイナリ形式です。これを知っているプログラムにしか意味を持ちません。 ピクセルではなく図形と座標を保存するので、どんな大きさでも鮮明なままです。看板の大きさまで引き伸ばしたロゴでも、失うものはありません。 ウェブと完成したファイルの受け渡しのために使われます。

拡張子は .glb、正式名称は Binary glTF です。ただしどちらも、そのファイルが中に何を持てるかほどには多くを語りません。このページの残りは、その中身についての話です。

GLB はどこから来たのか

Khronos Group が 2016 年に公開しました。 仕様は glTF 2.0 です。

古さが役に立つのは、ごく実務的な理由からです。形式が古いほど、それを覚える時間が多くのプログラムに与えられてきたということだからです。

仕様は公開されています

仕様書がそのまま公開されているので、中身を推し量るのではなく文書を読んで実装できます。この形式が数多くのプログラムに載っているのはそのためであり、20 年前に書かれたファイルが今も開けるのもそのためです。ただし「仕様が公開されている」ことと「使用料が要らない」ことは別の話です。中でコーデックを包んでいる形式では、特許のライセンスは仕様書が答えていない別の問題として残ります。

捨てられるものはありません

GLB ファイルは中身をそのまま保存します。保存し直しても何も変わらないので、開いて、直して、また保存する——それを何度繰り返しても劣化は積み上がりません。これが、渡すための形式ではなく作業のための形式である理由です。

複数のフレームを持てます

GLB ファイルは静止した 1 枚ではなく、アニメーションまるごとを保存できます。変換の前に知っておくべきことです。1 フレームしか持てない変換先は、最初の 1 枚を取って残りを落とします。しかもたいていは、何も言わずにです。

GLB を開けるのは何か

Blender、three.js、Babylon.jsが読めますし、同じ種類のプログラムならたいてい読めます。

ファイルが開かないとき、形式が悪いことはめったにありません。たいていはプログラムのほうが形式より古いのです。もっと古い形式に変換してしまうのが確実な逃げ道で、このサイトの残りの部分はそのためにあります。

ブラウザーで開く

これを読めるブラウザーはありません。

これを変換するいちばんよくある理由がこれです。形式が悪いのではありません。ファイルを見せたい場所が、それを読めないというだけのことです。

作業のための形式です

GLB は、開いて手を入れるために作られています。作業が続いているあいだはこの形式でファイルを持ち、完成したものが必要になるたびに、ここから書き出してください。

同じモデルを、一つのファイルに

GLB は glTF を一つのバイナリコンテナに詰め込んだものです。シーンを記述する JSON、ジオメトリのバッファー、すべてのテクスチャーが、小さなヘッダーとともに一つのファイルに収まります。何かが足されているわけでも省かれているわけでもありません。GLB を展開すれば、本来フォルダーに散らばっているはずの .gltf と .bin、画像がそのまま出てきます。

これが唯一にして最大の違いであり、ウェブで公開されている 3D の大半が GLB である理由です。仲間のファイルを伴わない .gltf は、存在しないデータを参照しているシーン記述にすぎず、それを送るのは MTL を伴わない OBJ を送るのと同じ失敗です。

なぜ一つのファイルであることがここでは特に重要か

3D モデルは、ほとんどのアセットより散らばりやすいパーツを持っています。バイナリのバッファー、ベースカラーのテクスチャー、法線マップ、ラフネスマップ、オクルージョンマップ、発光マップ。一つのオブジェクトが八つのファイルになることもあり、シーン全体では数十になることもあります。

一つのファイルにまとめることで、丸ごと一種類の失敗がなくなります。テクスチャーの欠落、壊れた相対パス、一段階間違って圧縮されたフォルダーといったものです。通信の往復も減ります。ブラウザーが GLB を取得するときのリクエストは一回で済みますが、.gltf の場合は八回になり、モバイル回線ではその時間の差はバイト数の差以上に大きく効いてきます。

拡張現実が前提としているもの

Android では、Scene Viewer は GLB を受け取り、多くのサイトが 3D 表示に使う model-viewer 要素も GLB を主なソースとして受け取ります。商品ページでスマートフォンをかざすと部屋に現れるモデルは、そこから来ています。

iOS は覚えておく価値のある例外です。Apple の Quick Look は独自の USDZ という形式を使うため、両方のプラットフォームで拡張現実に対応するサイトは、GLB と USDZ を並べて公開します。model-viewer 要素はどちらも受け取り、プラットフォームに応じて選び分けます。商品ページに一つではなく二つのファイルが用意されているのはこのためです。

ウェブページに載せられる大きさに抑える

容量を左右するのはジオメトリではなく、たいていテクスチャーです。4K のマップを四枚持つモデルは、それだけで三十メガバイトになり、それを 1K や 2K に落としても、実際にモデルが表示されるサイズでは見た目にほとんど影響しません。まずここから手を付けます。

次に、メッシュには Draco を使うと、ジオメトリがしばしば五分の一から十分の一の大きさになります。テクスチャーには Basis Universal を使った KTX2 を使うと、グラフィックスカードがメモリー上でも圧縮したまま保持できるようになります。両方を組み合わせれば、四十メガバイトの書き出しが三メガバイト未満に収まることも珍しくありません。どちらも拡張機能なので、対応していないビューアーではファイルを開けなくなります。パイプラインの最後に組み込み、原本には使わないようにしてください。

GLB が唯一苦手なこと

編集と確認です。.gltf は人が読める JSON なので、誤ったマテリアルの値や間違ったスケールのノードをテキストエディターで見つけて直せ、バージョン管理システムも二つのリビジョンの間で意味のある差分を表示できます。

GLB は不透明です。何かを変えるには展開して編集し、詰め直す必要があり、GLB ファイルを保持するリポジトリはコミットのたびに新しい完全なバイナリを保存することになります。このサイトの他の場面と同じ考え方が当てはまります。.gltf とその素材一式を作業用の原本として保管し、GLB は配信のためのビルド成果物として作り出す、という使い分けです。

GLB はどこで受け入れられているか

十年前の形式としては、かなり広く受け入れられています。あらゆるウェブ 3D ライブラリー、Blender、Unity、Unreal、Godot、Substance、Sketchfab、Android の AR ビューアー、主要なアセットマーケットプレイスが対応しています。Microsoft Office も文書やスライドに埋め込めます。

受け入れられないのは、古いパイプラインを前提にした分野です。3D プリントには STL や 3MF が求められ、CAD には独自の形式があり、映像や VFX の分野では USD や Alembic が使われます。GLB はリアルタイム配信のための形式であり、製造や映像の仕事をこの形式に求めるのは、そもそも見当違いのファイルを求めていることになります。

相互の変換

GLB と glTF は、同じデータを違う包み方にしているだけなので、どちら向きの変換も無損失です。どちらか一方を読めるソフトは、もう一方も読めます。変換は翻訳ではなく、詰め込みと展開の作業にすぎません。

OBJ や FBX、モデリングソフトからの変換では、マテリアルに注意が必要です。GLB が使う物理ベースの語彙には OBJ の MTL に対応するものがなく、取り込んだモデルは、テクスチャー付きの正しい状態ではなく、灰色のままの正しい形状として届きます。印刷用に STL へ変換する場合は、形状以外のマテリアル、テクスチャー、アニメーション、シーンの階層構造がすべて失われ、たいていスライサーに受け入れられる前にメッシュの修復が必要になります。

基本情報

GLBフォーマットの識別子と出自。
拡張子.glb
メディアタイプmodel/gltf-binary
公開元Khronos Group
初版2016
仕様glTF 2.0

GLB ファイルについてのよくある質問

GLB と glTF の違いは何ですか

包み方だけの違いです。.gltf は別のバイナリバッファーとテクスチャーファイルを参照する JSON で、モデルはフォルダーの形をとります。.glb はそのすべてを一つのバイナリファイルに詰め込みます。どちら向きの変換も無損失です。

GLB ファイルを開くには

Blender が直接開け、Unity、Unreal、Godot も同様です。ちょっと確認したいだけなら、ウェブベースの glTF ビューアーで十分です。Microsoft Office も文書やスライドに埋め込めます。

なぜ GLB ファイルがこんなに大きいのですか

ほとんどの場合、ジオメトリではなくテクスチャーが原因です。4K のマップを四枚持つだけで三十メガバイトになります。まずそれらを 1K や 2K に落とし、そのうえでメッシュに Draco、テクスチャーに KTX2 を適用してください。

GLB を拡張現実に使えますか

Android では使えます。Scene Viewer は GLB を直接受け取ります。iOS は Apple 独自の USDZ を使うため、両方に対応するサイトは GLB と USDZ を並べて公開し、model-viewer 要素に選ばせます。

モデルは GLB として保存すべきですか

配信用のコピーとしてはそうすべきです。作業用の原本としては向きません。.gltf は人が読める JSON で、テキストエディターで直せ、バージョン管理でも意味のある差分が見えますが、GLB は不透明で、コミットのたびに新しいバイナリ全体を保存することになります。

GLB を 3D 印刷できますか

まず STL や 3MF に変換し、メッシュの修復が必要になると考えておいてください。リアルタイム描画向けに作られたモデルは水密になっていないことが多く、画面上では完璧に見えても厚みのない面があり、そのままでは印刷できません。