アセット
Turian はインポートパイプラインを使用します:プロジェクトの assets/ フォルダにドロップしたファイルはソースです。インポート時に各ソースには安定した GUID(サイドカーファイル <file>.meta に保存)が割り当てられ、.cache/assets/ 下のランタイムアーティファクトにクックされます。出荷されるゲームはパッケージ化された .oap からそれらのアーティファクトを読み取り、バラバラの assets/ フォルダには触れません。アセット間の参照(マテリアルのテクスチャ、MeshRenderer のメッシュ)は GUID として保存されるため、名前変更や移動後も有効です。
モデルのインポート(glTF / GLB / OBJ)
.gltf、.glb、または .obj を assets/ にドロップすると、そのジオメトリがインポートされます。glTF/GLB の場合、Turian はファイルのマテリアルとテクスチャも読み取り、エンジンアセットを生成します——単一のモデルは1つのソースから多数のアセットを生成します:
- glTF マテリアルごとに1つの
.material。glTF メタリックラフネスモデルを組み込み PBR シェーダーにマッピング(ベースカラー、メタリック、ラフネス、エミッシブ + 強度、法線スケール、オクルージョン、アルファモード/カットオフ、両面 → カリング); - 参照されている画像ごとに1つのテクスチャアセット。
これらの生成アセットはモデルの .meta に記録され、再インポート後も GUID を保持するため、シーン参照は有効なままです。サポートされていないマテリアル拡張は警告されますが、致命的にはなりません。
ジオメトリはインポート時に標準バイナリメッシュにクックされるため、ランタイムは1つの高速で形式に依存しないパスでロードします——OBJ/glTF/cgltf の解析はエディタでのみ行われ、出荷されるゲームでは決して行われません。
生成されたサブアセットの編集
アセットブラウザでインポートしたモデルを選択すると、インスペクターに生成アセットとして生成されたマテリアル/テクスチャがリスト表示されます。マテリアルをクリックして開き、調整します(例:ベースカラー)。編集は再インポート後も保持されます——インポーターは不足しているマテリアルのみを(再)生成します。完全な再インポートはキャッシュをクリアしてすべてをソースから再生成します。
ノード階層とメッシュ単位のジオメトリ(glTF/GLB)
glTF/GLB ファイルのシーングラフ——名前付きノード、親子トランスフォーム、 各ノードが使用するメッシュ——もインポートされます。マテリアルとテクスチャ だけではありません。生成されたマテリアルに加えて、Turian は次を書き込みま す:
- glTF のメッシュごとに1つのメッシュサブアセット。独自のサブメッシ ュと名前を持ち、モデル自身のクック済みアーティファクト(単純な単一オブ ジェクトのドロップのために、ファイル全体が1つのメッシュに平坦化された ままの状態)とは別に保持されます;
- 1つのHierarchy サブアセット——glTF ノードごとに1つの GameObject を持 つ プレハブ で、ソースに合わ せて名前と位置が設定され、メッシュを持つ各ノードはそのメッシュと生成さ れたマテリアルに配線されます。
モデルのマテリアルの隣にある生成アセットでこれを見つけ、シーンビュー ポートにドラッグする——または右クリックしてシーンにインスタンス化を選 択する——ことで、名前付きの階層全体を、他のプレハブをインスタンス化するの とまったく同じように一度に取り込めます。
現在、ノード階層を持つのは glTF/GLB のみです。OBJ は引き続きサブメッシュ のない単一の平坦なメッシュとしてインポートされます。スキニング/リギング もインポートされません——リグ済みファイルのジョイントノードは、通常の(ア ニメーションしない)GameObject として取り込まれます。
インポート設定
テクスチャまたはモデルを選択すると、インポート設定パネルが表示されます:
- 画像 — テクスチャタイプ(デフォルト / 法線マップ / スプライト / UI / HDR)、色空間、ミップマップ、圧縮、フィルター、ラップ、最大サイズ、および(DDS のみ)DirectX 規約の法線マップ用のグリーンチャンネル反転。
- モデル — マテリアルのインポート、アニメーションのインポート、スケールファクター。
- フォント — デフォルトサイズ。
設定は .meta に保存されます。適用でアセットを再クックします。
外部テクスチャ vs 埋め込みテクスチャ
- 外部画像(glTF が参照する兄弟
.png/.jpgファイル)は、独自の.metaを持つ通常のテクスチャアセットになります——他のアセットと同様に選択して交換できます。 - 埋め込み画像(GLB バイナリチャンク、または base64 データ URI)は、インポート中にキャッシュ専用のテクスチャアセットとして抽出されます。
どちらの場合も、生成されたマテリアルは各マップを GUID でバインドします。一般的な形式(PNG、JPEG など)は RGBA8 にデコードされます。
テクスチャ形式
| 形式 | パス |
|---|---|
| PNG / JPEG / BMP / TGA / WebP | RGBA8 にデコード(stb_image)。 |
KTX2(.ktx2) |
GPU ブロック形式を直接アップロード——BCn パススルー、Zstandard 展開、Basis Universal(ETC1S / UASTC)を BC7 にトランスコード。ミップレベルは保持されます。 |
DDS(.dds) |
レガシー FourCC(DXT1/DXT3/DXT5/ATI1/ATI2)と DX10 拡張ヘッダーを、変換せずにブロックコピー——BC1/BC3/BC4/BC5/BC7、再エンコードなし。ミップレベルは保持されます。キューブマップ/配列はサポートされません。 |
KTX2 サポートは、スタンドアロンでエンジンに依存しない ktx2 モジュール(バンドルされた Basis Universal トランスコーダー付き)にあり、loadTexture の背後に配置されているため、マテリアルとインポーターは形式に依存しません。DDS は
engine/assets/DdsLoader.zig によって解析・デコードされ、これは ktx2 モジュールの Format/Level
型を再利用しているため、両方のコンテナが同一の GPU 対応形状を生成します。
レガシー DDS FourCC には sRGB ビットがないため、インポーターのカラースペース
設定はインポート時に焼き込まれます:sRGB とタグ付けされた DDS は、対応する
sRGB DXGI 形式を持つ DX10 拡張ヘッダーを持つように書き換えられます(必要な場合
のみコンテナをアップグレード)。Flip Green Channel を有効にした法線マップは、
エンジンの Y 規約に合わせるため、BC5 グリーンチャンネルがブロック単位で
無損失に反転されます。
PNG/JPEG などのソースは常に stb_image によってリニア RGBA8 にデコードされる
ため、カラースペースが sRGB の場合も同様の方法でクックされます:イン
ポート時にソースバイトの先頭に小さなエンベロープが付加され、ローダーがデコ
ードされたテクスチャの GPU フォーマットをアップグレードする前にそれを取り
除きます。Linear はデコーダーのデフォルトと既に一致しているため、クック
処理は不要です。
glTF/FBX マテリアルから参照される法線マップ、メタリックラフネスマップ、オ
クルージョンマップは、そのイメージが最初にインポートされる際に、兄弟イメー
ジのカラースペースをデフォルトで Linear に設定します(法線マップの場
合はテクスチャタイプも Normal Map に設定されます)——それ以降の再イン
ポートでは、手動で変更した設定が上書きされることはありません。
PBR マテリアル
.material は小さな JSON アセットで、シェーダーを GUID で参照し、そのシェーダーが公開するパラメーターの値を保存します。組み込みの PBR(メタリックラフネス) シェーダーが公開するもの:
| パラメーター | 種類 | 説明 |
|---|---|---|
base_color |
色 | アルベドティント(RGBA) |
metallic、roughness |
スカラー | 0–1 |
emissive、emissive_strength |
色 / スカラー | |
normal_scale、occlusion_strength |
スカラー | |
alpha_cutoff |
スカラー | マスク透過用 |
albedo_map、metallic_roughness_map、normal_map、emissive_map、occlusion_map |
テクスチャ | GUID でバインド |
生成されたマテリアルは通常のアセットであるため、インスペクターで編集したり、モデルに触れずにメッシュを別のマテリアルに差し替えたりできます。MeshRenderer のメッシュをモデルに設定してもマテリアルが空の場合、Turian は自動的にモデルの主要な生成マテリアルを入力します。
アセットブラウザからマテリアルをゼロから作成することもできます。組み込みプリセット(デフォルト、メタル、プラスチック、エミッシブ、ガラス)も含まれています。
マルチマテリアルメッシュ
単一のメッシュは多数のサブメッシュを持つことができ、それぞれがマテ
リアルスロットでタグ付けされます。MeshRenderer はスロットごとに1つの
マテリアルを保持します——インスペクターのMaterial リストにはスロット
ごとに1行が表示され(「Material 0」、「Material 1」、…)——各サブメッシ
ュは自身のスロットにバインドされたマテリアルで描画されます。単位はサブ
メッシュではなくスロットです:数千のサブメッシュを持つモデルでも、一握
りのマテリアルを共有していれば、その一握りのスロットだけで済みます。こ
れにより、1つのメッシュに平坦化されたシーン全体(数百のマテリアル)が、
それぞれの面が独自の PBR マテリアルを持ったまま完全に描画されます。
MeshRenderer をモデルに設定すると、Turian は生成されたマテリアルです
べてのスロットを自動的に埋めます。その後、個々のスロットを自由に差し替
えられます。
フォントアセット
.ttf または .otf を assets/ にドロップすると、フォントアセットとして
登録されます——他のアセットと同様に、GUID、.meta、アセットブラウザのタイル、
そしてインポート設定パネル(デフォルトサイズ)を持ちます。
フォントを選択すると、ライブプレビューが表示されます:Studio はフォントの
実際のバイトを(セッションごとに一度、GUID をキーとして)dvui に登録し、
dvui テーマのデフォルト本文フォントで設定された比較行の横に、いくつかの
サイズで実際のサンプルテキストをレンダリングします——これにより、どこかで
使用する前に書体を判断できます。examples/basic-project/assets/fonts/ には、
視覚的なコントラスト(セリフ、コンデンス見出し、等幅)のために選ばれた
SIL OFL ライセンスの3つのフォント(Lora、Bebas Neue、Inconsolata——
ATTRIBUTION.md を参照)が、動作するデモとして同梱されています。
.uidoc テキストノードは、フォントアセットを直接参照できます:style.font
にフォントの GUID を設定すると(オプションで style.font_size、デフォルト 24)、
style.font_style のテーマ名検索より優先されます。フォントのバイトは、
レンダラーが画像に既に使用しているのと同じ GUID キー付きソースコールバックを
通じて解決され、セッションごとに一度 dvui に登録されます——Studio のビューポート
(編集モードのオーバーレイ、Play mode、.uidoc エディター自体のプレビュー)と
出荷されるゲームの両方で共有されるため、#if EDITOR のような分岐はどこにも
必要ありません。examples/basic-project/assets/ui.uidoc のタイトルは、動作する
例としてこの方法で Bebas Neue を使用しています。
ドキュメント全体に対して(ノードごとではなく)一度にフォントを設定する Theme アセット(issue #104 のエピック)は、後回しの非ブロッキング作業として 追跡されています。
例
3d-model-materials の例では、3つのオブジェクトが並んで表示されています:組み込みメタルプリセットを使用した OBJ 立方体、glTF としての Khronos WaterBottle(外部 .png マップ)、および GLB としての同じボトル(インポート時に抽出された埋め込みマップ)。Sponza や Bistro のような大規模シーンにスケールアップできる構造になっています——モデルを assets/models/ にドロップし、プロジェクトを開いてシーンに追加するだけです。
MeshRenderer コンポーネントについてはコンポーネントリファレンスを、ブートシーンについてはプロジェクト設定を参照してください。