5.7 KiB
Effects: HDR, Post-process & Showcase
Examples covering HDR / tone mapping and post-process effects, plus the full showcase that combines everything.
| Example | Run command | What it shows |
|---|---|---|
demo |
cargo run -p wsg-lib --example demo |
Full showcase: 6 LOD primitives, 3 lights, shadows, HDR/ACES, bloom, culling, orbital camera |
bloom |
cargo run -p wsg-lib --example bloom |
Post-process bloom (glow around bright areas) |
hdr |
cargo run -p wsg-lib --example hdr |
HDR + tone mapping (ACES) + runtime exposure control |
msaa |
cargo run -p wsg-lib --example msaa |
MSAA 4× (multisample anti-aliasing, smooth edges) |
fog |
cargo run -p wsg-lib --example fog --features "all-prims" |
Distance fog (3 modes: linear, exp, exp²) |
dof |
cargo run -p wsg-lib --example dof --features "all-prims" |
Depth of field (cinematic bokeh, focus presets) |
All commands run from the repo root. All effects are opt-in — a disabled effect allocates nothing and executes nothing.
demo — Full Showcase
Combines all effects: LOD primitives, procedural textures, lights (directional + point + spot), shadows, HDR/ACES, exposure, emissive, bloom, culling.
cargo run -p wsg-lib --example demo
Keys
| Key | Action |
|---|---|
| Drag (LMB) | Orbit camera |
| Wheel | Zoom |
R |
Reset camera |
1 / 2 / 3 |
Presets: front / side / top |
+ / - |
Exposure ×1.3 / ÷1.3 |
0 |
Reset exposure |
bloom — Post-process Bloom
Two emissive spheres (orange intensity 2.0, blue intensity 3.0) produce a visible halo. The cube and floor serve as reference (non-emissive).
Bloom is a 4-pass GPU pipeline: threshold → blur H → blur V → composite.
cargo run -p wsg-lib --example bloom
Keys
| Key | Action |
|---|---|
| Drag (LMB) | Orbit camera |
| Wheel | Zoom |
R |
Reset camera |
+ / - |
Bloom threshold +0.1 / −0.1 |
[ / ] |
Bloom intensity +0.1 / −0.1 |
I / O |
Bloom radius +0.5 / −0.5 |
E / Q |
Exposure ×1.3 / ÷1.3 |
0 |
Reset exposure |
What to observe
- Low threshold (0.0): the entire image "blooms" (very diffuse effect).
- High threshold (2.0+): only the bright emissive spheres produce glow.
- Intensity 0.0: no visible glow (even though the threshold extracts pixels).
- Large radius (10+): the glow spreads over a large area.
hdr — HDR + Tone Mapping
Demonstrates HDR rendering with the ACES Filmic curve. Three objects:
- Cube: normal lighting (no emissive) — LDR reference.
- Bright sphere (emissive 3.0): without HDR, it would be clamped to white. With ACES, highlights "roll off" smoothly toward white.
- Dark sphere (emissive 0.3): stays dark even at high exposure.
cargo run -p wsg-lib --example hdr
Keys
| Key | Action |
|---|---|
| Drag (LMB) | Orbit camera |
| Wheel | Zoom |
R |
Reset camera |
E |
Exposure ×1.3 (brighter) |
Q |
Exposure ÷1.3 (darker) |
0 |
Reset exposure to 1.0 |
What to observe
- At exposure 1.0: the bright sphere is white but with detail (ACES rolloff).
- At high exposure (E×E×E): the scene brightens, the bright sphere stays white (saturated), but the cube gains detail.
- At low exposure (Q×Q): everything darkens, the bright sphere becomes orange (HDR values > 1.0 are compressed).
Note
: the tone mapper is compiled into the pipeline at build time. To compare ACES vs Reinhard, change
ToneMapper::Aces→ToneMapper::Reinhardin the source.
msaa — MSAA 4× (Anti-aliasing)
Demonstrates multisample anti-aliasing: object edges (cube, sphere) are smooth instead of "stair-stepped". The scene contains a cube (sharp edges), a sphere (curved silhouette), and a small cube near the camera (maximum aliasing).
cargo run -p wsg-lib --example msaa
Keys
| Key | Action |
|---|---|
| Drag (LMB) | Orbit camera |
| Wheel | Zoom |
R |
Reset camera |
M |
Show sample count |
To compare with/without MSAA
Remove the .with_msaa(4) line in the source and recompile: the scene is
identical, only the edges differ (stair-stepped vs smooth).
Note
: MSAA is a build-time setting (multisample texture allocation). It works independently of HDR: with HDR, the MSAA texture is
Rgba16Floatand resolves into the HDR texture before bloom/TM.
fog — Distance Fog
Demonstrates the 3 fog modes: linear, exponential, exponential². The scene contains a row of cubes receding into the distance and scattered spheres on a large floor plane. Fog blends objects toward a background color, creating the illusion of an infinite world.
cargo run -p wsg-lib --example fog --features "all-prims"
Keys: 1 = linear, 2 = exp, 3 = exp², 4 = off, R = reset.
Fog is applied in the main fragment shader (after lighting, before tone mapping). It uses the Euclidean distance from the fragment to the camera.
dof — Depth of Field (Cinematic Bokeh)
Demonstrates depth of field blur: an object at the focus plane stays sharp while foreground and background blur according to their distance from the focus plane. Creates a natural attention effect (cinematic style).
The scene contains 20 cubes in a row along Z (z=3 to z=-25.5) and 5 spheres to the sides, on a floor plane. Focus presets at 3 m / 8 m / 15 m.
cargo run -p wsg-lib --example dof --features "all-prims"
Keys: 1 = cinematic, 2 = subtle, 3 = focus 3 m, 4 = focus 15 m,
5 = off, R = reset.
DoF operates in linear HDR (after bloom, before tone mapping). Two passes: CoC (depth → per-pixel blur radius) then 12-tap disc blur with variable radius.