新しい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によって責任を分割したけど、誰が何を持つかも分割されて困った