as a Blue Noise in Screen Space

Eric Heitz

Laurent Belcour

Victor Ostromoukhov

David Coeurjolly

Jean-Claude Iehl

LittlestTokyo - 1 spp

LittlestTokyo - 2 spp

LittlestTokyo - 3 spp

LittlestTokyo - 4 spp

Random scrambling

3D model by Glen Fox

ðŸ¤¨

LittlestTokyo - 4 spp

Random scrambling

Correlated scrambling

⚠ not practical

Correlated scrambling

⚠ not practical

Random scrambling

Random scrambling

Inset

LittlestTokyo - 4 spp

Random scrambling

Correlated scrambling

⚠ not practical

Power Spectrum

- Distributes error as a
**blue-noise**in screen-space- Reduces the visual error
- Reduces the error after denoising

**State-of-the-art**sampler- Compatible with Owen scrambling [Owen 1998]
- Compatible with pmj02 [Christensen et al. 2018]

**Lean**&**efficient**- Take two textures as input
- Additional cost : two fetches & XORs

Inset

Power Spectrum

LittlestTokyo - 4 spp + Denoising

Random scrambling

Correlated scrambling

⚠ not practical

Georgiev and Fajardo [2016]

- Builds on research in Dithering
- Distribute quantization error
- Blue-noise is
**perceptually**better

- Extending dither masks
- nD dither mask
- using Simulated Annealing

- Scramble sequences
- using
*Cranley-Patterson Rotations* - Offset sample $k$ with dither at pixel $i,j$ $$ \mu_{k,i,j} = \mbox{mod}\left(\epsilon_k + d_{i,j}\right) $$

- using

Georgiev and Fajardo [2016]

Density

$$ d(i,j) $$Random Dithering

$$ d(i,j) > \mbox{rand}(i,j) $$Blue-Noise Dithering

$$ d(i,j) > bn(i,j) $$$bn(i,j)$

1D Dither Mask

3D Dither Mask

- How to generate different sequences? ✗
- How to distribute them in screen-space? ✗

- Use a
**stratification preserving**randomization- XOR scrambling [Kollig and Keller 2002]
- Example with pmj02

pmj02 sequence

Preserve multi-stratification

first dim. XOR key:
1
0
1
1

XOR scrambling [Kollig & Keller 2002]

CPR [Georgiev and Fajardo 2016]

Chair - 8 spp

Boxed - 1 spp

Georgiev and Fajardo [2016]

Power Spectrum of Error

Boxed - 16 spp

Georgiev and Fajardo [2016]

Power Spectrum of Error

Boxed - 16 spp

Georgiev and Fajardo [2016]

Power Spectrum of Error

White-noise as SPP increase

- Optimize with
**constant image-space**integrands**Same**integrand for every pixel- But
**different**XOR keys per pixel

Scrambling mask

Integrand

& Samples

Resulting Image

- Optimize with
**constant image-space**integrands**Same**integrand for every pixel- But a
**different**XOR key per pixel

- Optimize using
**oriented Heavisides**- Random orientation $\theta$ and offset $d$
**Warning:**$D$ dimensional integrands

- Optimize with
**constant image-space**integrands**Same**integrand for every pixel- But a
**different**XOR key per pixel

- Optimize using
**oriented Heavisides**- Random orientation $\theta$ and offset $d$
**Warning:**$D$ dimensional integrands

**Robust**to simple changes of integrand- Varying orientation
- Varying smoothness
- Varying topology

Integrand | Integral - 1spp | Power Spectrum |

- Optimize
**every**power of two spp- Possible with (0,2)-sequences
- Sorting using XOR of sample index

- Optimize
**every**power of two spp- Possible with (0,2)-sequences
- Sorting using XOR of sample index

- Permits
**progressivity**- Blue-noise distribution across spp

Integrand | 1spp | 4spp | 8spp | 64spp | 128spp |

Scrambling mask

Sorting mask

```
function screen_space_sampler(i, j, index, dimension)
{
// Fetch keys associated with pixel (i,j)
scramble = scrambling_keys(i,j)
sort = sorting_keys(i,j)
// XOR the index
index = index ^ sort
sample = sobol_owen(index, dimension)
// XOR the sample
sample = sample ^ scramble
return sample
}
```

2 texture fetches + 2 XORs

QMC Integration

- Direct Illumination in Mitsuba
- Implemented a new Sampler
- No impact on performances

- Extensive study
- See our supplemental material
- Interactive HTML

Ours

Georgiev and Fajardo [2016]

Boxed - 1 spp

Ours

Georgiev and Fajardo [2016]

chair - 1 spp

- In the Unity Engine
- Implementation by Thomas Deliot
- Dithering Ambient Occlusion
- Dithering Screen-Space Reflections

- Performances on desktop
- Nvidia 2080 GPU at 720p
- Fixed cost : 0.25 ms

**White-noise****Ours****AO**0.26 ms 0.54 ms **SSR**2.81 ms 3.06 ms

- Live demo !

**Share**limitations with BNDS !- Can't handle
**high-dimensional**integrands - Not robust on
**complex integrands**

- Can't handle
- Still
**you should use our method**rather than BNDS- Can
**only do better**, not worse

- Can
- We felt a bit disapointed
- A solution : flip the problem
- Do not focus on the sequence
- See our EGSR paper

- A
**novel****progressive**screen-space sampler- That distributes error as a
**blue-noise** **State-of-the-art**convergence**Efficient**and**compatible**with real-time

- That distributes error as a
- Our
**contributions****New optimization space**: test integrands- Two stage optimization:
**ranking**and**scrambling**

- Clearing
**misconceptions****No more**Cranley Patterson rotations- Blue-noise
**not restricted**to previz. - Only
**scratched**the surface (see EGSR talk)

paper

supp. mat.

code