diff options
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/3D.md | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -24,6 +24,23 @@ - WebGPU framebuffer: y-down (pixel row 0 at top) - `uv.y = 0` → NDC `y = -1` → bottom of framebuffer ✓ +### Rasterized 3D and the Y-flip rule + +The fullscreen post-process VS (`fullscreen_uv_vs.wgsl`) uses **Y-up UVs** (`uv.y=0` = bottom of screen). +`textureSample(tex, s, uv)` with those UVs samples the **top** of the input texture at the bottom of +the screen — a Y-flip. SDF effects are authored Y-down and appear correct after this flip. Rasterized +effects (RotatingCube, Hybrid3D) render into an offscreen texture and are consumed by the post-process +chain, so they must **pre-flip** their geometry to compensate: + +- **`mat4::perspective()`** uses `m[5] = -t` (negated Y scale) — renders geometry upside-down into the + texture so the post-process chain flips it right-side up. +- **Rasterized pipelines** with `cullMode = Back` must set `frontFace = WGPUFrontFace_CW` — the Y-flip + reverses winding order on screen, so CW becomes the visible (front) face. +- Pipelines with `cullMode = None` (SDF proxy hull, skybox) need no winding change. + +**Do not** set `m[5] = +t` or use `frontFace = WGPUFrontFace_CCW` (default) in rasterized 3D +pipelines — the result will be upside-down with back-faces culled. + ## Core Concept Hybrid SDF/rasterization pipeline with physics and collision detection. |
