「メッシュベイカー」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) (→概要) |
Administrator (トーク | 投稿記録) |
||
1行目: | 1行目: | ||
− | '''メッシュベイカー''' | + | '''メッシュベイカー'''([[英語]]:mesh baker)とは、[[3DCG]]において[[ドローコール]]を減らすべく、背景などに使用されるビルなどの複数の3Dモデルを、事前に「1つのモデル」に結合してしまう手法である。 |
==概要== | ==概要== | ||
43行目: | 43行目: | ||
==関連項目== | ==関連項目== | ||
− | |||
*[[ドローコール]] | *[[ドローコール]] | ||
*[[ハードウェアインスタンジング]] | *[[ハードウェアインスタンジング]] | ||
*[[遅延レンダリング]] | *[[遅延レンダリング]] | ||
+ | |||
+ | [[category: 3DCG]] |
2020年4月14日 (火) 08:59時点における版
メッシュベイカー(英語:mesh baker)とは、3DCGにおいてドローコールを減らすべく、背景などに使用されるビルなどの複数の3Dモデルを、事前に「1つのモデル」に結合してしまう手法である。
概要
100ポリゴンのモデルを100個表示したいとする。普通にやればドローコールは100回も発生する。そこで事前に「10000ポリゴンの1モデル」に結合してしまえばドローコールが1回で済む。
主にハードウェアインスタンジングが使えない環境や、ハードウェアインスタンジングは使えるが形状の異なるモデルが多数存在する場合に有効である。
結合処理はCPUで行われる比較的重たい処理であるため、基本的に「動かないもの」にしか使えない。主にマップ上の建築物などのように動かないモデル群に適用される。
インデックスバッファのサイズに注意
モデルを結合する際にはハードウェア的に「インデックスバッファの最大サイズ」に注意すること。多くの環境ではインデックスバッファの最大サイズは「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();
}
}