Sampling Visible GGX Normals
with Spherical Caps
| Jonathan Dupuy |
Anis Benyoub |
| Intel Corporation |
Intel Corporation |
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
Contribution
|
[Heitz18]
|
|
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
Contribution
|
[Heitz18]
|
|
Background
|
[Walter et al. 07]
|
|
|
GGX = "Ground Glass (X)unknown"
|
(microsurface)
(equivalent ellipsoid)
Background
|
[Walter et al. 07]
|
|
|
GGX = "Ground Glass (X)unknown"
|
(microsurface)
(equivalent ellipsoid)
Background
|
[Walter et al. 07]
|
|
|
GGX = "Ground Glass (X)unknown"
|
(microsurface)
(equivalent ellipsoid)
Background
|
[Walter et al. 07]
|
|
|
GGX = "Ground Glass (X)unknown"
|
(microsurface)
(equivalent ellipsoid)
Background
|
[Walter et al. 07]
|
|
|
GGX = "Ground Glass (X)unknown"
|
(microsurface)
(equivalent ellipsoid)
Background
|
[Walter et al. 07]
|
|
|
GGX = "Ground Glass (X)unknown"
|
(microsurface)
(equivalent ellipsoid)
Background
|
[Walter et al. 07]
|
|
|
GGX = "Ground Glass (X)unknown"
|
(microsurface)
(equivalent ellipsoid)
Background
|
[Walter et al. 07]
|
|
|
GGX = "Ground Glass (X)unknown"
|
(microsurface)
(equivalent ellipsoid)
Background
|
[Walter et al. 07]
|
|
|
GGX = "Ground Glass (X)unknown"
|
NDF
(microsurface)
(equivalent ellipsoid)
Background
|
[Heitz18]
|
|
|
GGX VNDF sampler
|
VNDF
NDF
incident direction
visible / occluded surface
(microsurface)
(equivalent ellipsoid)
visible / occluded surface
(1) linear transformation
(2) sample
(3) inverse transformation
(equivalent ellipsoid)
visible / occluded surface
| GGX sampling code |
|
Background
|
[Heitz18]
|
|
|
GGX VNDF sampler
|
(1) linear transformation
(2) sample
(3) inverse transformation
(equivalent ellipsoid)
visible / occluded surface
Background
| GGX sampling code |
|
|
[Heitz18]
|
|
|
GGX VNDF sampler
|
(1) linear transformation
(2) sample
(3) inverse transformation
(equivalent ellipsoid)
visible / occluded surface
|
hemisphere sampling code
|
|
| GGX sampling code |
|
Background
|
[Heitz18]
|
|
|
GGX VNDF sampler
|
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
|
[Heitz18]
|
|
Contribution
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
|
[Heitz18]
|
|
Contribution
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
(see paper for mathematical proof)
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
(see paper for mathematical proof)
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
(see paper for mathematical proof)
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
(see paper for mathematical proof)
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
(see paper for mathematical proof)
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
(see paper for mathematical proof)
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
(see paper for mathematical proof)
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
(see paper for mathematical proof)
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
(see paper for mathematical proof)
Intuitions
environment:
what you see:
Intuitions
environment:
what you see:
Intuitions
environment:
what you see:
Intuitions
|
|
Key Insight
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
|
A hemispherical mirror reflects parallel rays uniformly and within a spherical cap
|
Our Sampling Algorithm
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
Our Sampling Algorithm
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
$\boldsymbol{\omega}_o$
1) sample the spherical cap
Our Sampling Algorithm
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
$\boldsymbol{\omega}_o$
$\boldsymbol{\omega}_o$
1) sample the spherical cap
2) compute half vector
Our Sampling Algorithm
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
$\boldsymbol{\omega}_o$
$\boldsymbol{\omega}_o$
$\boldsymbol{\omega}_i$
$\boldsymbol{\omega}_o$
$+$
$\boldsymbol{\omega}_i$
$\propto$
$\boldsymbol{\omega}_m$
1) sample the spherical cap
2) compute half vector
Our Sampling Algorithm
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
$\boldsymbol{\omega}_o$
$\boldsymbol{\omega}_o$
$\boldsymbol{\omega}_i$
$\boldsymbol{\omega}_o$
$+$
$\boldsymbol{\omega}_i$
$\propto$
$\boldsymbol{\omega}_m$
$\boldsymbol{\omega}_m$
1) sample the spherical cap
2) compute half vector
Our Sampling Algorithm
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
$\boldsymbol{\omega}_o$
$\boldsymbol{\omega}_o$
$\boldsymbol{\omega}_i$
$\boldsymbol{\omega}_o$
$+$
$\boldsymbol{\omega}_i$
$\propto$
$\boldsymbol{\omega}_m$
$\boldsymbol{\omega}_m$
1) sample the spherical cap
2) compute half vector
Our Sampling Algorithm
| GGX VNDF |
🔗 |
spherical caps |
|
|
|
| incident direction |
| $\boldsymbol{\omega}_i = (x_i, \, y_i, z_i)$ |
| cutoff plane |
| $z = -$$z_i$ |
$\boldsymbol{\omega}_o$
$+$
$\boldsymbol{\omega}_i$
$\propto$
$\boldsymbol{\omega}_m$
$\boldsymbol{\omega}_o$
$\boldsymbol{\omega}_m$
1) sample the spherical cap
2) compute half vector
3) return half vector
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
sample spherical cap
compute half vector
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
|
[Heitz18]
|
|
Contribution
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
sample spherical cap
compute half vector
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
|
[Heitz18]
|
|
build basis
sample projected area
reproject
Contribution
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
sample spherical cap
compute half vector
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
|
[Heitz18]
|
|
build basis
sample projected area
reproject
Contribution
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
|
[Heitz18]
|
|
Contribution
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
Contribution
|
[Heitz18]
|
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
Contribution
|
[Heitz18]
|
|
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
Contribution
|
[Heitz18]
|
|
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
|
[Heitz18]
|
|
Contribution
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
|
[Heitz18]
|
|
Contribution
|
Ours
|
|
|
✓ simpler
|
|
✓ faster
|
|
GGX VNDF
|
|
|
spherical caps
|
|
linked to
🔗
|
[Heitz18]
|
|
Contribution
Background
|
[Heitz18]
|
|
|
GGX VNDF sampler
|
VNDF
NDF
(microsurface)
(equivalent ellipsoid)
Background
|
[Heitz18]
|
|
|
GGX VNDF sampler
|
VNDF
NDF
incident direction
visible / occluded surface
(microsurface)
(equivalent ellipsoid)
visible / occluded surface