v3.0.0
Turian 3.0.0 はメッシュレンダラーがマテリアルをバインドする方法を変更しま
す:サブメッシュインデックスではなく、マテリアルスロット単位で。メッ
シュレンダラーは現在 materials[submesh.material_slot] を描画するため、
数千のサブメッシュを持つモデルでも、一握りのマテリアルを共有していれば、
その一握りのスロットだけで済みます。これにより、1つのメッシュに平坦化さ
れたシーン全体——数百のマテリアル——が、最初の32個で止まることなく完全に
描画できるようになります。
変更内容
MeshRendererComponent—materials配列は、サブメッシュインデック スではなくマテリアルスロット(Submesh.material_slot)でインデック スされるようになりました。GPU レンダラーとソフトウェアレンダラーの両方 がmaterials[submesh.material_slot]を参照します。- マテリアル上限 — レンダラーごとの上限が 32 から 160
(
MAX_MATERIALS)に上がりました。32個を超えるマテリアルを持つメッシュ も、すべてバインドされ描画されるようになります。 - GPU サブメッシュ — 32個の上限がなくなりました。メッシュのすべての サブメッシュが毎フレーム描画されます。
- シーンファイル —
material_guidsは(以前はサブメッシュごとだった ものが)マテリアルスロットごとに保存されるようになりました。シーン のversionフィールドは1から2に上がります。 - クック済みメッシュ形式(TMSH)は変更なし — 再クックは不要です。変更 されたのはシーン/コンポーネントの形式のみです。
影響を受けるもの
マルチマテリアルモデルにマテリアルを割り当てるシーンを持つプロジェクト、
および古い位置ベース(サブメッシュ単位)のバインディングを前提として
MeshRendererComponent.materials / material_count を読み書きするゲーム
コード。
アップグレード手順
1. 3.0.0 へアップデートする
3.0.0 SDK をダ ウンロードします。SDK は自己完結型なので、移行中は 2.x の SDK をそのまま並 行してインストールしておけます(リリースポリシー を参照)。
2. シーンファイルを移行する
古いシーンは引き続き読み込めます——v1 シーンのマテリアルバインディングはメ
モリ上で再構築され、警告が記録されます。プロジェクト全体でこの変換を一括
で永続化するには、アセットが少なくとも一度はインポートされたプロジェクト
に対してマイグレーターを実行します(Studio で開く、または
turian-cli import を実行すると、これが行われます——マイグレーターはスロ
ットごとにマテリアルを再構築するために、各モデルのクック済みアーティファ
クトを必要とします):
turian-cli migrate path/to/project
このコマンドはすべてのシーンをスキャンし、まだ古い形式のものを書き換え、 何を変更したかを報告します。生成された差分をコミットしてください。 (Studio でシーンを開くとロード時に移行され、ダーティとしてマークされる ため、保存すればそれも永続化されます——CLI はその一括版に過ぎません。)
手動でのサブメッシュ単位の上書きはリセットされます。 2.x のサブメ ッシュ単位の形式は、マテリアルスロットへ曖昧さなくマッピングすることが できないため、移行はモデルのスロットのデフォルトから各モデルレンダ ラーのテーブルを再構築し、警告を記録します。特定のサブメッシュに手動で デフォルト以外のマテリアルを割り当てていた場合は、移行後にインスペクタ ーでスロット単位に再割り当てしてください。自動割り当てされたマテリアル を使用していたプロジェクト(一般的なケース)では、それ以上の対応は不要 です。
3. ゲームコードを更新する
レンダラーのマテリアルをサブメッシュインデックスで割り当てたり読み取った りしていたコードの場合:
// 2.x — materials[i] はサブメッシュ i にバインドされる
renderer.materials[submesh_index] = my_material_ref;
// 3.0.0 — materials[slot] はサブメッシュの material_slot でバインドされる
renderer.materials[material_slot] = my_material_ref;
renderer.material_count = slot_count; // 一意なマテリアルスロットの数
単一マテリアルのメッシュは影響を受けません:materials[0] は引き続きメッ
シュ全体に適用されます(サブメッシュテーブルを持たないメッシュはスロット
0 で全体を描画します)。未設定または範囲外のスロットはデフォルトマテリア
ルにフォールバックします。インスペクターにはマテリアルスロットごとに1行
が表示されるようになりました。
4. 大きい・平坦化されたモデルを確認する
32個を超えるサブメッシュやマテリアルを持つモデルは、2.x では切り詰められ ていました——最初の32個のサブメッシュのみが描画されていました。移行後は 完全に描画されます:これまで表示されていなかったジオメトリが現れ、各面 がそれぞれのスロットマテリアルを持つことを想定しておいてください。
その後にダウングレードしないこと
3.0.0 で保存されたシーンはスロットごとの material_guids と
version: 2 を保存します。2.x はこれらのエントリをサブメッシュ単位として
読み取り、誤ったマテリアルをバインドします。プロジェクトの移行は一方向に
一度だけ行ってください。先に試したい場合はブランチ上で行ってください。