LOD: interpoler UVs/couleurs des vertices déplacés par le repli
Le vertex-cible d'un repli se déplace au point optimal de l'arête mais conserveait l'UV du weld — désaccord position/UV croissant en cascade : la texture 'fuit' et les motifs (rayures) disparaissent aux niveaux lointains, avec un changement radical entre deux LOD. - Collapse porte désormais les tables uvs/colors (clonées au weld). - collapse_edge interpole les UVs de la cible : uv_t ← (1−λ)·uv_s + λ·uv_t, avec le même λ que le déplacement (cost_and_point renvoie désormais λ). - Garde-fou seam : si |Δu| > 0.5 ou |Δv| > 0.5 (saut de texture), la cible garde son UV — l'interpolation ne traverse jamais une seam. - Couleurs : toujours interpolées (espace colorimétrique continu). - Compaction : la sortie lit les tables mises à jour (c.uvs/c.colors), pas les tables d'origine du weld. - Docs : DRAFT.md (Sortie), gpu-driven.md (décimination), ARCHI_CPU_GPU (LOD).
This commit is contained in:
+6
-3
@@ -134,9 +134,12 @@ Geometry::decimated(&self, target_triangles: u32) -> Geometry (pure, sans GPU)
|
||||
est clampée à `[1, T]` et atteinte au mieux (best effort : la granularité −2/−1 peut s'en
|
||||
écarter d'un ou deux triangles — jamais de géométrie corrompue).
|
||||
- Sortie : re-indexation (le weld ci-dessus), **normales lisses recalculées** sur les faces
|
||||
survivantes (normales de faces accumulées par coin soudé, puis normalisées), UVs/couleurs =
|
||||
valeur du premier vertex de chaque groupe soudé (documenté : évite le bleeding entre seams UV ;
|
||||
le LOD sacrifie la précision UV au profit de la silhouette).
|
||||
survivantes (normales de faces accumulées par coin soudé, puis normalisées). UVs/couleurs :
|
||||
le vertex **déplacé** par un repli reçoit l'**interpolation** des UVs/couleurs de la paire
|
||||
(même λ que son nouveau point optimal) — la texture reste attachée à la surface et se
|
||||
grossit doucement d'un niveau à l'autre (pas de saut radical) ; **jamais d'interpolation à
|
||||
travers une seam UV** (extrémités à plus de 0.5 de tuile d'écart → la cible garde son UV) ;
|
||||
un groupe soudé garde l'UV du premier vertex rencontré (déterministe).
|
||||
- Non indexé à l'entrée → weld par position préalable (la sortie est **toujours indexée**).
|
||||
Triangles dégénérés jetés.
|
||||
- **Déterministe** (file de priorité, tie-break par identifiants de vertex, aucun aléatoire) →
|
||||
|
||||
@@ -43,7 +43,8 @@ Ce document sert de spécification technique et de trame d'implémentation pour
|
||||
> le GPU n'effectue que le mappage niveau → ligne de la table LOD du mesh. Les niveaux d'un mesh sont
|
||||
> générés par **quadric edge collapse** (Garland–Heckbert) au setup (`Geometry::decimated` : les
|
||||
> arêtes au coût quadrique minimal sont repliées en premier, un mesh fermé reste fermé — pas de
|
||||
> trous, pas de « books » ; soudure tolérance 1e-6, rebase u16) et **empilés dans les buffers vertex/index du mesh** (offsets en
|
||||
> trous, pas de « books » ; soudure tolérance 1e-6, UVs/couleurs interpolés au repli — jamais
|
||||
> à travers une seam UV —, rebase u16) et **empilés dans les buffers vertex/index du mesh** (offsets en
|
||||
> unités d'élément, pas d'octet — c'est ce qu'exigent les arguments `drawIndirect*` de WebGPU ; plafond u16 :
|
||||
> 65 535 sommets/mesh, 4 niveaux max). LOD activé par défaut ; `set_lod_enabled(false)` restaure un rendu
|
||||
> bit-à-bit identique au pré-LOD (niveau 0 partout = comptes complets). Détail : `docs/user/gpu-driven.md`
|
||||
|
||||
@@ -98,7 +98,10 @@ CPU):
|
||||
cheapest-first; an interior collapse merges both incident triangles (−2 faces) and remaps the
|
||||
neighbours — no new face, so a **closed mesh stays closed** (no holes, no non-manifold
|
||||
"books"), a boundary collapse removes one face; duplicate corners are welded (relative
|
||||
tolerance 1e-6), and the levels are **packed into the mesh's single
|
||||
tolerance 1e-6); a survivor **moved** by a collapse gets its UV/color **interpolated**
|
||||
between the collapsed endpoints (same λ as its new position — the texture stays attached
|
||||
to the surface and coarsens smoothly across levels, never across a UV seam), and the
|
||||
levels are **packed into the mesh's single
|
||||
vertex/index buffers** (see the constraint below). Level 0 is always your exact geometry.
|
||||
2. **Per frame (CPU).** For each entity, the bounding sphere used by culling is projected to screen
|
||||
pixels (its *perceived size*); that radius picks a level with **asymmetric hysteresis** — going
|
||||
|
||||
Reference in New Issue
Block a user