docs(draft): acte les décisions D1-D4 de l'Étape 10 (Textures)

D1 placeholder 1×1 + groupe 2 sur toutes les pipelines · D2 échantillonnage
inconditionnel · D3 image + Rgba8UnormSrgb · D4 Material propriétaire du bind
group. Suite : implémentation 10.1-10.5 (refactor) puis docs (10.6).
This commit is contained in:
Jérôme Bousquié
2026-09-18 13:30:24 +02:00
parent 7a5d627221
commit 3de84aa4dc
+6 -6
View File
@@ -23,23 +23,23 @@ Permettre de texturer un mesh : charger une image → `wgpu::Texture` (+ view +
texture diffuse à un `Material`, échantillonner dans le shader, **sans casser** le pattern « un seul texture diffuse à un `Material`, échantillonner dans le shader, **sans casser** le pattern « un seul
layout pour tous ». layout pour tous ».
## Décisions (à valider) ## Décisions (actées le 2026-09-18)
- **[ ] D1 (intégration bind group — « un seul layout pour tous »)** : on ajoute un **3ᵉ bind group** - **[x] D1 (intégration bind group — « un seul layout pour tous »)** : on ajoute un **3ᵉ bind group**
`@group(2)` (sampler + texture diffuse) posé sur **toutes** les pipelines, avec une **texture `@group(2)` (sampler + texture diffuse) posé sur **toutes** les pipelines, avec une **texture
blanche 1×1 de secours (placeholder)** utilisée quand un `Material` n'a pas de texture. Cela blanche 1×1 de secours (placeholder)** utilisée quand un `Material` n'a pas de texture. Cela
préserve l'unicité du layout (aucune pipeline multiple), donc un seul flux de rendu. *(alternative préserve l'unicité du layout (aucune pipeline multiple), donc un seul flux de rendu. *(alternative
écartée : bind group optionnel → casse l'unicité du layout, refactor de toutes les pipelines)*. écartée : bind group optionnel → casse l'unicité du layout, refactor de toutes les pipelines)*.
- **[ ] D2 (échantillonnage inconditionnel)** : le fragment shader échantillonne **toujours** la - **[x] D2 (échantillonnage inconditionnel)** : le fragment shader échantillonne **toujours** la
texture diffuse ; le placeholder blanc (texel = 1) reproduit exactement le comportement actuel texture diffuse ; le placeholder blanc (texel = 1) reproduit exactement le comportement actuel
d'un material sans texture. Donc pas de flag conditionnel → un seul flow de shader. En mode lit, d'un material sans texture. Donc pas de flag conditionnel → un seul flow de shader. En mode lit,
le **texel remplace la couleur du vertex** (`texel.rgb * (ambient + diffuse)`) ; en unlit, le texel le **texel remplace la couleur du vertex** (`texel.rgb * (ambient + diffuse)`) ; en unlit, le texel
tel quel. Symétrique du pattern unlit existant. tel quel. Symétrique du pattern unlit existant.
- **[ ] D3 (chargement d'image & format)** : ajouter la dépendance `image` (décodage PNG/JPEG) à - **[x] D3 (chargement d'image & format)** : ajouter la dépendance `image` (décodage PNG/JPEG) à
`lib/Cargo.toml` ; upload en `TextureFormat::Rgba8UnormSrgb`, usage `TEXTURE_BINDING | COPY_DST`, `lib/Cargo.toml` ; upload en `TextureFormat::Rgba8UnormSrgb`, usage `TEXTURE_BINDING | COPY_DST`,
dimension `D2`, `mip_level_count: 1` (**YAGNI** : pas de génération de mipmaps cette étape), dimension `D2`, `mip_level_count: 1` (**YAGNI** : pas de génération de mipmaps cette étape),
sampler `filter: Linear`, `address_mode: Repeat`. sampler `filter: Linear`, `address_mode: Repeat`.
- **[ ] D4 (API et portage)** : nouveau type `Texture` (device + view + sampler). `Material` gagne - **[x] D4 (API et portage)** : nouveau type `Texture` (device + view + sampler). `Material` gagne
`texture: Option<Arc<Texture>>` et détient son **bind group de texture (groupe 2)**, construit `texture: Option<Arc<Texture>>` et détient son **bind group de texture (groupe 2)**, construit
depuis le layout partagé ; sans texture il lie le placeholder. API `Scene` : `add_texture(id, tex)` depuis le layout partagé ; sans texture il lie le placeholder. API `Scene` : `add_texture(id, tex)`
et liaison d'une texture à un material. `draw_entity` bind `set_bind_group(2, ...)`. et liaison d'une texture à un material. `draw_entity` bind `set_bind_group(2, ...)`.
@@ -94,7 +94,7 @@ layout pour tous ».
## Point d'étape ## Point d'étape
- [ ] Valider D1–D4 avant implémentation. - [x] Valider D1–D4 avant implémentation. *(actées le 2026-09-18)*
- [ ] Caser 10.1–10.6, validation verte, exemples OK. - [ ] Caser 10.1–10.6, validation verte, exemples OK.
- [ ] Deux commits séparés : `refactor(...)` (10.1–10.5) puis `docs(...)` (10.6) + README/DRAFT. - [ ] Deux commits séparés : `refactor(...)` (10.1–10.5) puis `docs(...)` (10.6) + README/DRAFT.
- [ ] Rédiger le bilan et ouvrir la suite (Phase 4.2 Éclairage avancé). - [ ] Rédiger le bilan et ouvrir la suite (Phase 4.2 Éclairage avancé).