新しいDx11base設計方針(今進んでいるところまで)
✅ 主要クラスの役割一覧
クラス名 | 役割 | 主な責務 | 他クラスとの関係 |
|---|---|---|---|
| DirectX初期化&基盤 | デバイス・コンテキスト・スワップチェイン・バックバッファなどの管理 ビューポートやラスタライザ設定もここで一元化 | 全クラスが依存。最下層の基盤クラス |
| シェーダーの一括管理 |
を読み込んで、VS/PS/IL を生成・キャッシュ キーでシェーダー切り替えを容易にする |
や
など描画系から利用される |
| カメラ情報の管理 | ビュー行列・プロジェクション行列を提供 LookAtや移動処理も持つ |
などが View/Proj を取得する |
| モデルの純粋なデータ保持 | 頂点・インデックス・テクスチャ・サンプラ・名前など 必要なバッファを持ち描画準備済みの状態 |
から生成され、
に使われる |
| モデルの読み込み・キャッシュ | ファイルから
を生成 ハンドル付きでモデルを管理・再利用 |
からハンドル経由で取得される |
| モデル描画の実行役 |
+
情報を使って描画 内部で
,
,
を使って描画する |
を渡されて描画処理を行う |
(補助) | モデルの変換行列生成 | SRTからWorld行列生成、法線変換行列も作成可 |
が使用 |
🎯 クラス関係図(概略)
┌────────────┐
│ Dx11Base │ ← デバイスやレンダリングパイプラインの基盤
└────┬───────┘
│
┌────▼───────┐ ┌──────────────┐
│ ShaderBucket│◄────────┤ ModelRenderer │
└────────────┘ └────┬─────────┘
│ uses
┌─────▼────────┐
│ SimpleModel │◄─────┐
└──────────────┘ │
│
┌────────────┐ │
│ ModelManager│────┘
└────────────┘
┌────────┐
│ Camera │ ← View/Proj取得用
└────────┘🧠 役割分離の利点
設計 | メリット |
|---|---|
に描画コードを持たせない | 同じモデルを複数箇所で描画可能(インスタンス化) |
に描画処理を集中 | ステート設定、シェーダー設定、描画の変更が一元管理できる |
に読み込みとキャッシュを集中 | 同じファイルを何度も読み込む無駄を防止 |
のキー管理 |
、
、
など切り替えが簡単 |
に初期化・基盤処理を集中 | DirectX設定の複雑さを隠蔽し、他クラスをシンプルに保てる |
🔚 まとめ
このような分離設計は、
✅ 単体テストや差し替えがしやすく、
✅ **描画方式の拡張(PBR、影、インスタンス描画など)**にも柔軟に対応できます。
必要であれば、ModelRenderer::Draw() や ModelManager::GetHandle() など、具象的なコード実装例も提供できます。
モデル関係責任分割
クラス | 責任 |
|---|---|
| データ所有者 :頂点・インデックス・テクスチャ等のDirectXリソース保持。 ※レンダリングコードは持たない |
| 描画担当 :
のデータを使って描画処理を実行。Transformやシェーダーとの連携もここで処理 |
| 管理担当 :
をファイルからロードし、キャッシュとして保持。ハンドル管理なども行う |
今迷っているところ
- modelにvertexbuffer、indexbuffer、textureを直接もたせるのは良いか悪いかよくわからない
- (現在のエンジンはFBX=モデル=全部入り)
- これだと、インスタンスごとにレンダリングを切り替えたりとかが色々やりづらいとおもう
- modelManagerにレンダリングリソースとして情報をもたせる方法を考えている
- ChatGPTによるとアニメーションとか拡張しようとするとめんどくさくなりそうな予感がする
- とりあえず、modelとFBXは完全に切り分けることにする(他のモデル形式とかも考えることもあるかもだから)
- model、manager、rendererによって責任を分割したけど、誰が何を持つかも分割されて困った
6月17日現在の様子
🎯 DirectX11 モデル描画エンジン:構造と設計レビュー
🎯 DirectX11 モデル描画エンジン クラス構成概要
┌────────────┐
│ Dx11Base │ ← デバイスやレンダリングパイプラインの基盤
└────┬───────┘
│
┌────▼───────┐ ┌──────────────┐
│ ShaderBucket│◄────────┤ ModelRenderer │
└────────────┘ └────┬─────────┘
│ uses
┌─────▼────────┐
│ SimpleModel │◄─────┐
└──────────────┘ │
│
┌────────────┐ │
│ ModelManager│────┘
└────────────┘
┌────────┐
│ Camera │ ← View/Proj取得用
└────────┘✅ メリット
1. 役割分離された設計
ModelManager,ModelRenderer,FBXLoaderが明確に責務を分担- モデルデータと描画用GPUリソースを分離しており拡張が容易
2. マテリアル単位の柔軟な管理
SimpleModel->MaterialMeshの構造によりマルチマテリアル対応が容易- マテリアルごとにテクスチャ、ポリゴンの分割が可能
3. シェーダーステート集中管理
ShaderBucketによりブレンド/Zステート管理を一元化- アルファブレンドやZWrite切替も柔軟に対応
4. リソース共有対応
- モデルパスごとに
ModelHandleを発行、リソースの使いまわしが可能 - 将来的に
MaterialPool,TextureManagerにも応用可能
5. アニメーション拡張の布石あり
VertexにcontrolPointIndexを保持済みで、スキンメッシュ対応の余地あり
⚠️ デメリット・今後の課題
1. スキンアニメーション未対応
- Bone構造、SkinWeight、Clip、Poseデータ未実装
VertexにboneWeight/boneIndex配列が未導入
2. 階層構造の保持なし
- FBXのノード親子構造がSimpleModel内に保持されていない
- 階層的なTransform更新や描画順の制御が難しい
3. インスタンシング未対応
- 同一モデルの多重描画でリソース効率化ができていない
4. 描画順制御がアプリ依存
- Zソートや描画カテゴリ分離が
ModelRenderer側に組み込まれていない
5. グローバル依存の可能性
ShaderBucket,Dx11Baseなどがグローバルに依存しやすく、テスト性が低下する懸念
🔄 改善ロードマップ
| ステージ | 改善内容 |
|---|---|
✅ 現在 | 非アニメモデル・マテリアル描画まで実装済み |
🔜 次 | Bone構造・スキンウェイト・アニメーションクリップ導入 |
🔜 拡張 | GPUスキニング、Shaderの構造整理、AnimationClip管理クラスの追加 |
🔜 拡張 | Zソート処理、半透明オブジェクトの描画順制御の導入 |
🔜 拡張 | 階層Transform・ノードアニメーションの導入、カメラアニメ対応 |
