メインメニューを開く

メッシュベイカー英語:mesh baker)とは、3DCGにおいてドローコールを減らすべく、背景などに使用されるビルなどの複数の3Dモデルを、事前に「1つのモデル」に結合してしまう手法である。

概要編集

100ポリゴンのモデルを100個表示したいとする。普通にやればドローコールは100回も発生する。そこで「100ポリゴンの100モデル」を事前に「10000ポリゴンの1モデル」に結合してしまえばドローコールが1回で済む。

主にハードウェアインスタンシングが使えない環境や、ハードウェアインスタンシングは使えるが形状の異なるモデルが多数存在する場合に有効である。

結合処理はCPUで行われる比較的重たい処理であるため、ゲームのビルド時に事前に結合しておいたり、またゲームを起動した一発目(Now Loading)で結合を行うのが定番である。このため基本的には「動かないもの」にしか使えない。主にマップ上の建築物などのように動かないモデル群に適用される。

インデックスバッファのサイズに注意編集

モデルを結合する際にはハードウェア的に「インデックスバッファの最大サイズ」に注意すること。多くの環境ではインデックスバッファの最大サイズは「16ビット整数(最大値65535)」となっている。PCでは32ビットが使えることもあるが、スマホなんかも考慮する場合は16ビットで設計しておくのが無難である。

このような環境を考慮して65535インデックスの範囲内になるように結合して、最終的な取得は配列にするといい感じである。

// 概略説明用の架空のソースコードである。
// 動かないよ。
class MashBaker {
    List<Model> _list;

    void Add(Model model) {
        var current = _list.LastOrDefault();
        if (current == null) {
            current = new Model();
            _list.Add(current);
        }

        // インデックスバッファのサイズ制限に注意        
        var ibcount = current.IndexBuffer.Count + model.IndexBuffer.Count;
        if (65535 < ibcount) {
            current = new Model();
            _list.Add(current);
        }

        // モデルを結合する
        current.Merge(model);
    }

    Model[] ToModels() {
        return list.ToArray();
    }
}


関連項目編集