feat(rendering): add BloomFilter with a soft-knee threshold, a downsample chain and an additive glow - #751
Conversation
… and an additive composite
Bundle ReportChanges will increase total bundle size by 195.5kB (0.37%) ⬆️. This is within the configured threshold ✅ Detailed changes
Affected Assets, Files, and Routes:view changes for bundle: exo-esm-esmAssets Changed:
Files in
view changes for bundle: exo-iife-min-Exo-iifeAssets Changed:
Files in
view changes for bundle: exojs-physics-esmAssets Changed:
view changes for bundle: site-server-esmAssets Changed:
Files in
App Routes Affected:
view changes for bundle: exo-full-iife-min-Exo-iifeAssets Changed:
view changes for bundle: exo-esm-modules-esmAssets Changed:
Files in
Files in
Files in
view changes for bundle: exo-iife-Exo-iifeAssets Changed:
Files in
view changes for bundle: exo-full-iife-Exo-iifeAssets Changed:
|
❌ 1 Tests Failed:
View the top 1 failed test(s) by shortest run time
To view more test analytics, go to the Test Analytics Dashboard |
…re rasterizer needs
BloomFilter: bright regions bleed a soft glow, in today's sRGB path, on both backends with identical output on a discrete GPU. Tone mapping is deliberately not part of it; grading is the existing LUT filter.Options
threshold(Rec. 709 luma at the middle of a soft knee, default 0.8),intensity(default 1; 0 returns the source through one blit without borrowing a target),strength(Gaussian sigma in logical units, exactly asBlurFilterdefines it),levels(halvings before the blur, a cost knob clamped 1..5, stopping early when a dimension would hit one pixel) andquality. Passes: one new shader pair extracts the excess over the threshold straight into the half-resolution first level and emits it as premultiplied colour with zero alpha, so the glow is pure added light and a translucent glowing sprite keeps its alpha; sprite blits halve down the chain;BlurFilterruns on the smallest level with the sigma scaled from the measured size ratio; the blurred level alone is blitted back up into cleared targets; the composite is one target pass, source then glow additive, the shapeDropShadowFilteruses. Intermediates are borrowed from the backend's render-texture pool and released on every path.getOutputBoundsadds the chain's reach, scaled for a declared resolution below one.Parity scene
filter/bloom-halo: max channel delta 0 across WebGL2 and WebGPU on the RTX 5070 Ti; the software rasterizer on CI rounds the half-resolution blits a step apart between its GL and Dawn paths, so the scene declares a narrow tolerance with that reason at the scene. Browser tests in both lanes: dark stays dark, the halo falls off with distance, intensity 0 returns the source, a higher threshold lets less through, a uniform bright field reads the same at one and three levels, and a half-transparent glowing sprite over an opaque backdrop keeps its alpha while the backdrop under the halo only gets brighter. Example, guide section and API reference added; allocation gate green; IIFE bundle +0.95 KB inside its budget.