Question gouvernante : Le découplage strict entre calcul de visibilité et shading différé apporte-t-il un gain net sur WebGPU face aux scènes denses ?
Statut : reconstruction, correctness gate et orchestration bornée implémentés. La campagne WebGPU reste not-run jusqu'au branchement d'un exécuteur matériel dans bench/main.ts.
Pass 1 — Visibilité
├─► écriture compacte 32-bit (primitiveId + materialId + depth)
└─► buffer de visibilité (viewport-sized)
│
▼
Pass 2 — Shading différé
├─► reconstruction d'attributs pour les pixels visibles seulement
├─► évaluation du matériau uniquement pour ces pixels
└─► 0 overdraw de shading
| Palier | Objets |
|---|---|
| V-100 | 100 |
| V-1k | 1 000 |
| V-10k | 10 000 |
| V-100k | 100 000 |
| Métrique | Définition |
|---|---|
primitiveIdBufferBytes |
Taille du buffer d'IDs primitive |
materialIdBufferBytes |
Taille du buffer d'IDs matériau |
depthBufferBytes |
Taille du buffer de profondeur |
shadingCostMs |
Coût de shading (pass 2) |
overdrawAvoided |
Overdraw de shading évité (vs. forward) |
forwardBufferBytes |
Bande passante du G-buffer (forward) |
deferredBufferBytes |
Bande passante du Visibility-buffer (deferred) |
materialLookupMs |
Coût de lookup des matériaux |
| Verdict | Condition |
|---|---|
INTEGRATE |
shadingCostMs + overhead (buffers) < forwardCost et overdrawAvoided > 30 % |
REJECT |
shadingCostMs > forwardCost sur 2 des 4 paliers |
WATCHLIST |
Net positif seulement aux paliers élevés (V-10k+) |
- G-buffer complet (normal, position, material) : le banc écrit uniquement IDs + depth (pass 1), pas le G-buffer.
- Forward + deferred en mode hybride (pas de mix) : la comparaison est stricte.
- Multi-sample : non couvert.
runVisibilityCampaign reçoit les paliers, warmup, échantillons, AbortSignal, progression et un exécuteur. L'exécuteur renvoie les readbacks attendus/réels et les temps mesurés séparément. Une différence d'ID ou de profondeur invalide immédiatement la campagne ; aucun chiffre de performance n'est alors publiable.