メッシュベイカー
2021年1月26日 (火) 07:27時点におけるAdministrator (トーク | 投稿記録)による版
概要
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();
}
}