Files
wsg/lib/examples/effects
Jérôme Bousquié d4c2d93fc5 eng doc
2026-09-25 20:06:10 +02:00
..
2026-09-25 19:08:20 +02:00
2026-09-25 20:06:10 +02:00
2026-09-25 19:08:20 +02:00
2026-09-25 19:08:20 +02:00
2026-09-25 19:08:20 +02:00
2026-09-25 19:08:20 +02:00
2026-09-25 19:08:20 +02:00

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::Reinhard in 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 Rgba16Float and 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.