「メッシュベイカー」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) |
||
2行目: | 2行目: | ||
==概要== | ==概要== | ||
− | 100[[ポリゴン]]のモデルを100個表示したいとする。普通にやれば[[ドローコール]] | + | 100[[ポリゴン]]のモデルを100個表示したいとする。普通にやれば[[ドローコール]]は100回も発生する。そこで「100ポリゴンの100モデル」を事前に「10000ポリゴンの1モデル」に結合してしまえば[[ドローコール]]が1回で済む。 |
− | 主に[[ | + | 主に[[ハードウェアインスタンシング]]が使えない環境や、[[ハードウェアインスタンシング]]は使えるが形状の異なるモデルが多数存在する場合に有効である。 |
結合処理は[[CPU]]で行われる比較的重たい処理であるため、ゲームのビルド時に事前に結合しておいたり、またゲームを起動した一発目([[Now Loading]])で結合を行うのが定番である。このため基本的には「動かないもの」にしか使えない。主にマップ上の建築物などのように動かないモデル群に適用される。 | 結合処理は[[CPU]]で行われる比較的重たい処理であるため、ゲームのビルド時に事前に結合しておいたり、またゲームを起動した一発目([[Now Loading]])で結合を行うのが定番である。このため基本的には「動かないもの」にしか使えない。主にマップ上の建築物などのように動かないモデル群に適用される。 |
2021年1月26日 (火) 07:30時点における版
メッシュベイカー(英語: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();
}
}