# 新しいDx11base設計方針（今進んでいるところまで）

## ✅ 主要クラスの役割一覧

<table id="bkmrk-%E3%82%AF%E3%83%A9%E3%82%B9%E5%90%8D%E5%BD%B9%E5%89%B2%E4%B8%BB%E3%81%AA%E8%B2%AC%E5%8B%99%E4%BB%96%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8%E3%81%AE%E9%96%A2%E4%BF%82dx"><colgroup><col></col><col></col><col></col><col></col></colgroup><tbody><tr><th>クラス名

</th><th>役割

</th><th>主な責務

</th><th>他クラスとの関係

</th></tr><tr><td>**`<strong class="editor-theme-bold editor-theme-code">Dx11Base</strong>`**

</td><td>DirectX初期化＆基盤

</td><td>デバイス・コンテキスト・スワップチェイン・バックバッファなどの管理

ビューポートやラスタライザ設定もここで一元化

</td><td>全クラスが依存。最下層の基盤クラス

</td></tr><tr><td>**`<strong class="editor-theme-bold editor-theme-code">ShaderBucket</strong>`**

</td><td>シェーダーの一括管理

</td><td>`<span class="editor-theme-code">.hlsl</span>`

<span style="white-space: pre-wrap;"> を読み込んで、VS/PS/IL を生成・キャッシュ</span>

キーでシェーダー切り替えを容易にする

</td><td>`<span class="editor-theme-code">ModelRenderer</span>`

<span style="white-space: pre-wrap;"> や </span>

`<span class="editor-theme-code">Sprite</span>`

<span style="white-space: pre-wrap;"> など描画系から利用される</span>

</td></tr><tr><td>**`<strong class="editor-theme-bold editor-theme-code">Camera</strong>`**

</td><td>カメラ情報の管理

</td><td>ビュー行列・プロジェクション行列を提供

LookAtや移動処理も持つ

</td><td>`<span class="editor-theme-code">ModelRenderer</span>`

<span style="white-space: pre-wrap;"> などが View/Proj を取得する</span>

</td></tr><tr><td>**`<strong class="editor-theme-bold editor-theme-code">SimpleModel</strong>`**

</td><td>モデルの純粋なデータ保持

</td><td>頂点・インデックス・テクスチャ・サンプラ・名前など

必要なバッファを持ち描画準備済みの状態

</td><td>`<span class="editor-theme-code">ModelManager</span>`

<span style="white-space: pre-wrap;"> から生成され、</span>

`<span class="editor-theme-code">ModelRenderer</span>`

<span style="white-space: pre-wrap;"> に使われる</span>

</td></tr><tr><td>**`<strong class="editor-theme-bold editor-theme-code">ModelManager</strong>`**

</td><td>モデルの読み込み・キャッシュ

</td><td><span style="white-space: pre-wrap;">ファイルから </span>

`<span class="editor-theme-code">SimpleModel</span>`

<span style="white-space: pre-wrap;"> を生成</span>

ハンドル付きでモデルを管理・再利用

</td><td>`<span class="editor-theme-code">ModelRenderer</span>`

<span style="white-space: pre-wrap;"> からハンドル経由で取得される</span>

</td></tr><tr><td>**`<strong class="editor-theme-bold editor-theme-code">ModelRenderer</strong>`**

</td><td>モデル描画の実行役

</td><td>`<span class="editor-theme-code">SimpleModel</span>`

<span style="white-space: pre-wrap;"> + </span>

`<span class="editor-theme-code">Transform</span>`

<span style="white-space: pre-wrap;"> 情報を使って描画</span>

<span style="white-space: pre-wrap;">内部で </span>

`<span class="editor-theme-code">Dx11Base</span>`

<span style="white-space: pre-wrap;">, </span>

`<span class="editor-theme-code">Camera</span>`

<span style="white-space: pre-wrap;">, </span>

`<span class="editor-theme-code">ShaderBucket</span>`

<span style="white-space: pre-wrap;"> を使って描画する</span>

</td><td>`<span class="editor-theme-code">SimpleModel</span>`

<span style="white-space: pre-wrap;"> を渡されて描画処理を行う</span>

</td></tr><tr><td>**`<strong class="editor-theme-bold editor-theme-code">Transform</strong>`**

（補助）

</td><td>モデルの変換行列生成

</td><td>SRTからWorld行列生成、法線変換行列も作成可

</td><td>`<span class="editor-theme-code">ModelRenderer</span>`

<span style="white-space: pre-wrap;"> が使用</span>

</td></tr></tbody></table>

---

## 🎯 クラス関係図（概略）

```plaintext
┌────────────┐
│ Dx11Base   │ ← デバイスやレンダリングパイプラインの基盤
└────┬───────┘
     │
┌────▼───────┐          ┌──────────────┐
│ ShaderBucket│◄────────┤ ModelRenderer │
└────────────┘          └────┬─────────┘
                             │ uses
                       ┌─────▼────────┐
                       │ SimpleModel  │◄─────┐
                       └──────────────┘      │
                                             │
                          ┌────────────┐     │
                          │ ModelManager│────┘
                          └────────────┘

┌────────┐
│ Camera │ ← View/Proj取得用
└────────┘
```

---

## 🧠 役割分離の利点

<table id="bkmrk-%E8%A8%AD%E8%A8%88%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88simplemodel-%E3%81%AB%E6%8F%8F"><colgroup><col></col><col></col></colgroup><tbody><tr><th>設計

</th><th>メリット

</th></tr><tr><td>`<span class="editor-theme-code">SimpleModel</span>`

<span style="white-space: pre-wrap;"> に描画コードを持たせない</span>

</td><td>同じモデルを複数箇所で描画可能（インスタンス化）

</td></tr><tr><td>`<span class="editor-theme-code">ModelRenderer</span>`

<span style="white-space: pre-wrap;"> に描画処理を集中</span>

</td><td>ステート設定、シェーダー設定、描画の変更が一元管理できる

</td></tr><tr><td>`<span class="editor-theme-code">ModelManager</span>`

<span style="white-space: pre-wrap;"> に読み込みとキャッシュを集中</span>

</td><td>同じファイルを何度も読み込む無駄を防止

</td></tr><tr><td>`<span class="editor-theme-code">ShaderBucket</span>`

<span style="white-space: pre-wrap;"> のキー管理</span>

</td><td>`<span class="editor-theme-code">"Basic3D"</span>`

、

`<span class="editor-theme-code">"Sprite"</span>`

、

`<span class="editor-theme-code">"ShadowMap"</span>`

など切り替えが簡単

</td></tr><tr><td>`<span class="editor-theme-code">Dx11Base</span>`

<span style="white-space: pre-wrap;"> に初期化・基盤処理を集中</span>

</td><td>DirectX設定の複雑さを隠蔽し、他クラスをシンプルに保てる

</td></tr></tbody></table>

---

## 🔚 まとめ

このような分離設計は、  
<span style="white-space: pre-wrap;">✅ </span>****単体テストや差し替え****がしやすく、  
✅ \*\*描画方式の拡張（PBR、影、インスタンス描画など）\*\*にも柔軟に対応できます。

必要であれば、`<span class="editor-theme-code">ModelRenderer::Draw()</span>`<span style="white-space: pre-wrap;"> や </span>`<span class="editor-theme-code">ModelManager::GetHandle()</span>`<span style="white-space: pre-wrap;"> など、具象的なコード実装例も提供できます。</span>

##### モデル関係責任分割

<table id="bkmrk-%E3%82%AF%E3%83%A9%E3%82%B9%E8%B2%AC%E4%BB%BBsimplemodel%E3%83%87%E3%83%BC%E3%82%BF%E6%89%80"><colgroup><col></col><col></col></colgroup><tbody><tr style="height: 10px;"><th>クラス

</th><th>責任

</th></tr><tr><td>`<span class="editor-theme-code">SimpleModel</span>`

</td><td>****データ所有者****

：頂点・インデックス・テクスチャ等のDirectXリソース保持。

※レンダリングコードは持たない

</td></tr><tr><td>`<span class="editor-theme-code">ModelRenderer</span>`

</td><td>****描画担当****

：

`<span class="editor-theme-code">SimpleModel</span>`

<span style="white-space: pre-wrap;"> のデータを使って描画処理を実行。Transformやシェーダーとの連携もここで処理</span>

</td></tr><tr><td>`<span class="editor-theme-code">ModelManager</span>`

</td><td>****管理担当****

：

`<span class="editor-theme-code">SimpleModel</span>`

<span style="white-space: pre-wrap;"> をファイルからロードし、キャッシュとして保持。ハンドル管理なども行う</span>

</td></tr></tbody></table>

## 今迷っているところ

- modelにvertexbuffer、indexbuffer、textureを直接もたせるのは良いか悪いかよくわからない
    - （現在のエンジンはFBX=モデル＝全部入り）
    - これだと、インスタンスごとにレンダリングを切り替えたりとかが色々やりづらいとおもう
- modelManagerにレンダリングリソースとして情報をもたせる方法を考えている
    - ChatGPTによるとアニメーションとか拡張しようとするとめんどくさくなりそうな予感がする
- とりあえず、modelとFBXは完全に切り分けることにする（他のモデル形式とかも考えることもあるかもだから）
- model、manager、rendererによって責任を分割したけど、誰が何を持つかも分割されて困った

## ６月１７日現在の様子

## 🎯 DirectX11 モデル描画エンジン：構造と設計レビュー

## <span style="white-space: pre-wrap;">🎯 </span>****DirectX11 モデル描画エンジン クラス構成概要****

```plaintext
┌────────────┐
│ Dx11Base   │ ← デバイスやレンダリングパイプラインの基盤
└────┬───────┘
     │
┌────▼───────┐          ┌──────────────┐
│ ShaderBucket│◄────────┤ ModelRenderer │
└────────────┘          └────┬─────────┘
                             │ uses
                       ┌─────▼────────┐
                       │ SimpleModel  │◄─────┐
                       └──────────────┘      │
                                             │
                          ┌────────────┐     │
                          │ ModelManager│────┘
                          └────────────┘

┌────────┐
│ Camera │ ← View/Proj取得用
└────────┘
```

### ✅ メリット

#### 1. 役割分離された設計

- `<span class="editor-theme-code">ModelManager</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">ModelRenderer</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">FBXLoader</span>`<span style="white-space: pre-wrap;"> が明確に責務を分担</span>
- モデルデータと描画用GPUリソースを分離しており拡張が容易

#### 2. マテリアル単位の柔軟な管理

- `<span class="editor-theme-code">SimpleModel</span>`<span style="white-space: pre-wrap;"> -&gt; </span>`<span class="editor-theme-code">MaterialMesh</span>`<span style="white-space: pre-wrap;"> の構造によりマルチマテリアル対応が容易</span>
- マテリアルごとにテクスチャ、ポリゴンの分割が可能

#### 3. シェーダーステート集中管理

- `<span class="editor-theme-code">ShaderBucket</span>`<span style="white-space: pre-wrap;"> によりブレンド/Zステート管理を一元化</span>
- アルファブレンドやZWrite切替も柔軟に対応

#### 4. リソース共有対応

- <span style="white-space: pre-wrap;">モデルパスごとに </span>`<span class="editor-theme-code">ModelHandle</span>`<span style="white-space: pre-wrap;"> を発行、リソースの使いまわしが可能</span>
- <span style="white-space: pre-wrap;">将来的に </span>`<span class="editor-theme-code">MaterialPool</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">TextureManager</span>`<span style="white-space: pre-wrap;"> にも応用可能</span>

#### 5. アニメーション拡張の布石あり

- `<span class="editor-theme-code">Vertex</span>`<span style="white-space: pre-wrap;"> に </span>`<span class="editor-theme-code">controlPointIndex</span>`<span style="white-space: pre-wrap;"> を保持済みで、スキンメッシュ対応の余地あり</span>

[![class_diagram_structured.png](https://bookstack.yz-learning.com/uploads/images/gallery/2025-06/scaled-1680-/class-diagram-structured.png)](https://bookstack.yz-learning.com/uploads/images/gallery/2025-06/class-diagram-structured.png)

---

### ⚠️ デメリット・今後の課題

#### 1. スキンアニメーション未対応

- Bone構造、SkinWeight、Clip、Poseデータ未実装
- `<span class="editor-theme-code">Vertex</span>`<span style="white-space: pre-wrap;"> に </span>`<span class="editor-theme-code">boneWeight</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">boneIndex</span>`<span style="white-space: pre-wrap;"> 配列が未導入</span>

#### 2. 階層構造の保持なし

- FBXのノード親子構造がSimpleModel内に保持されていない
- 階層的なTransform更新や描画順の制御が難しい

#### 3. インスタンシング未対応

- 同一モデルの多重描画でリソース効率化ができていない

#### 4. 描画順制御がアプリ依存

- <span style="white-space: pre-wrap;">Zソートや描画カテゴリ分離が </span>`<span class="editor-theme-code">ModelRenderer</span>`<span style="white-space: pre-wrap;"> 側に組み込まれていない</span>

#### 5. グローバル依存の可能性

- `<span class="editor-theme-code">ShaderBucket</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">Dx11Base</span>`<span style="white-space: pre-wrap;"> などがグローバルに依存しやすく、テスト性が低下する懸念</span>

---

### 🔄 改善ロードマップ

<table id="bkmrk-%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E6%94%B9%E5%96%84%E5%86%85%E5%AE%B9%E2%9C%85-%E7%8F%BE%E5%9C%A8%E9%9D%9E%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%A2%E3%83%87%E3%83%AB%E3%83%BB"><colgroup><col></col><col></col></colgroup><tbody><tr><th>ステージ</th><th>改善内容</th></tr><tr><td>✅ 現在

</td><td>非アニメモデル・マテリアル描画まで実装済み

</td></tr><tr><td>🔜 次

</td><td>Bone構造・スキンウェイト・アニメーションクリップ導入

</td></tr><tr><td>🔜 拡張

</td><td>GPUスキニング、Shaderの構造整理、AnimationClip管理クラスの追加

</td></tr><tr><td>🔜 拡張

</td><td>Zソート処理、半透明オブジェクトの描画順制御の導入

</td></tr><tr><td>🔜 拡張

</td><td>階層Transform・ノードアニメーションの導入、カメラアニメ対応

</td></tr></tbody></table>

---