From 3de84aa4dc0ff82b49ec7fe205cf4e4c0bc93966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Bousqui=C3=A9?= Date: Fri, 18 Sep 2026 13:30:24 +0200 Subject: [PATCH] =?UTF-8?q?docs(draft):=20acte=20les=20d=C3=A9cisions=20D1?= =?UTF-8?q?-D4=20de=20l'=C3=89tape=2010=20(Textures)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- docs/DRAFT.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/DRAFT.md b/docs/DRAFT.md index 54caf27..b82782b 100644 --- a/docs/DRAFT.md +++ b/docs/DRAFT.md @@ -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 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 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 é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 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 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`, dimension `D2`, `mip_level_count: 1` (**YAGNI** : pas de génération de mipmaps cette étape), 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>` 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)` et liaison d'une texture à un material. `draw_entity` bind `set_bind_group(2, ...)`. @@ -94,7 +94,7 @@ layout pour tous ». ## 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. - [ ] 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é).