From ba7ea27ddee4398afa98a0e45b9e227bbcfae906 Mon Sep 17 00:00:00 2001 From: skal Date: Sun, 8 Mar 2026 11:36:04 +0100 Subject: fix: negate Y in perspective() to correct rasterized 3D orientation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fullscreen post-process VS uses Y-up UVs (uv.y=0 = bottom), so textureSample() Y-flips any rasterized offscreen texture. SDF effects author their content Y-down and look correct after the flip. Rasterized effects (RotatingCube, Hybrid3D) must pre-flip their geometry: - mat4::perspective(): m[5] = -t (negated Y scale) - Pipelines with cullMode=Back: frontFace = WGPUFrontFace_CW (Y-flip reverses winding, so CW becomes the visible face) - Remove incorrect transposes from GlobalUniforms::make(), ObjectData::make(), and Uniforms::make() — mini_math is column-major, no transpose needed for GPU upload - Document the convention in doc/3D.md under "Rasterized 3D and the Y-flip rule" handoff(Gemini): Y-flip rule now documented; all rasterized 3D pipelines must follow it. Co-Authored-By: Claude Sonnet 4.6 --- src/effects/ntsc.wgsl | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/effects/ntsc.wgsl') diff --git a/src/effects/ntsc.wgsl b/src/effects/ntsc.wgsl index 5c27695..4e72f0a 100644 --- a/src/effects/ntsc.wgsl +++ b/src/effects/ntsc.wgsl @@ -2,6 +2,7 @@ #include "sequence_uniforms" #include "render/fullscreen_uv_vs" #include "math/noise" +#include "debug/debug_print" const vignetteRounding = 160.0f; const vignetteSmoothness = 0.7f; @@ -68,5 +69,6 @@ fn vignette(uv: vec2f) -> f32 { col.g *= 1.01; col.b *= 0.94; + col = debug_f32(col, in.position.xy / uniforms.resolution, vec2f(10., 10.), 3.2); return vec4f(clamp(col, vec3f(0.0), vec3f(1.0)), 1.0); } -- cgit v1.2.3