☰ Navigation
Trowbridge–Reitz / GGX Distribution
The normals of the microfacets are distributed according to the Trowbridge–Reitz / GGX distribution:
D ( ω ) = a g 2 π cos 4 θ ( a g 2 + tan 2 θ ) 2 D ( θ , ϕ ) = a g 2 π cos 4 θ ( a g 2 + tan 2 θ ) 2 sin θ \begin{aligned}
\operatorname{D}(\omega) &= \frac{a_g^2}{\pi\cos^4\theta (a_g^2 + \tan^2\theta)^2}\\
\operatorname{D}(\theta,\phi) &= \frac{a_g^2}{\pi\cos^4\theta (a_g^2 + \tan^2\theta)^2}\sin\theta
\end{aligned} D ( ω ) D ( θ , ϕ ) = π cos 4 θ ( a g 2 + tan 2 θ ) 2 a g 2 = π cos 4 θ ( a g 2 + tan 2 θ ) 2 a g 2 sin θ
Here is the result:
function sample_ggx ( a ) {
const u_1 = Math. random ( ) ;
const u_2 = Math. random ( ) ;
const theta = Math. atan ( Math. sqrt ( a * a * u_1 / ( 1.0 - u_1) ) ) ;
const phi = u_2 * 2.0 * Math. PI ;
return [ theta, phi] ;
}
Algorithm
Sample microfacet normal according to the Trowbridge–Reitz / GGX distribution:
Choose uniform numbers u 1 , u 2 u_1, u_2 u 1 , u 2 in [ 0 , 1 ] [0,1] [ 0 , 1 ]
Calculate θ = tan − 1 ( a g u 1 1 − u 1 ) \theta = \tan^{-1}(\frac{a_g\sqrt{u_1}}{\sqrt{1- u_1}}) θ = tan − 1 ( 1 − u 1 a g u 1 )
Calculate ϕ = 2 π u 2 \phi = 2\pi u_2 ϕ = 2 π u 2
Optionally convert to cartesian coordinates with:
x = sin θ cos ϕ x = \sin\theta\cos\phi
x = sin θ cos ϕ
y = sin θ sin ϕ y = \sin\theta\sin\phi
y = sin θ sin ϕ
z = cos θ z = \cos\theta
z = cos θ
PDF Used In Monte Carlo Integration
p m ( ω ) = a g 2 cos θ π cos 4 θ ( a g 2 + tan 2 θ ) 2 = a g 2 π cos 3 θ ( a g 2 + tan 2 θ ) 2 p_m(\omega) = \frac{a_g^2\cos\theta}{\pi\cos^4\theta (a_g^2 + \tan^2\theta)^2} = \frac{a_g^2}{\pi\cos^3\theta (a_g^2 + \tan^2\theta)^2}
p m ( ω ) = π cos 4 θ ( a g 2 + tan 2 θ ) 2 a g 2 cos θ = π cos 3 θ ( a g 2 + tan 2 θ ) 2 a g 2
p m ( θ , ϕ ) = a g 2 cos θ sin θ π cos 4 θ ( a g 2 + tan 2 θ ) 2 = a g 2 tan θ π cos 2 θ ( a g 2 + tan 2 θ ) 2 p_m(\theta,\phi) = \frac{a_g^2\cos\theta\sin\theta}{\pi\cos^4\theta (a_g^2 + \tan^2\theta)^2}= \frac{a_g^2\tan\theta}{\pi\cos^2\theta (a_g^2 + \tan^2\theta)^2}
p m ( θ , ϕ ) = π cos 4 θ ( a g 2 + tan 2 θ ) 2 a g 2 cos θ sin θ = π cos 2 θ ( a g 2 + tan 2 θ ) 2 a g 2 tan θ
Derivation
Due to normalization, the densities are given as follows:
p ( ω ) = D ( ω ) cos θ p ( θ , ϕ ) = p ( ω ) sin θ = a g 2 cos θ sin θ π cos 4 θ ( a g 2 + tan 2 θ ) 2 = a g 2 tan θ π cos 2 θ ( a g 2 + tan 2 θ ) 2 \begin{aligned}
p(\omega) &= D(\omega)\cos\theta\\
p(\theta,\phi) &= p(\omega)\sin\theta\\
&= \frac{a_g^2\cos\theta\sin\theta}{\pi\cos^4\theta (a_g^2 + \tan^2\theta)^2}\\
&= \frac{a_g^2\tan\theta}{\pi\cos^2\theta (a_g^2 + \tan^2\theta)^2}
\end{aligned} p ( ω ) p ( θ , ϕ ) = D ( ω ) cos θ = p ( ω ) sin θ = π cos 4 θ ( a g 2 + tan 2 θ ) 2 a g 2 cos θ sin θ = π cos 2 θ ( a g 2 + tan 2 θ ) 2 a g 2 tan θ
Marginal And Conditional Densities:
p θ ( θ ) = ∫ 0 2 π p ( θ , ϕ ) d ϕ = ∫ 0 2 π a g 2 tan θ π cos 2 θ ( a g 2 + tan 2 θ ) 2 d ϕ = 2 π a g 2 tan θ π cos 2 θ ( a g 2 + tan 2 θ ) 2 = 2 a g 2 tan θ cos 2 θ ( a g 2 + tan 2 θ ) 2 = 2 π p ( θ , ϕ ) \begin{aligned}
p_\theta(\theta) &= \int_0^{2\pi}p(\theta,\phi)d\phi \\
&=\int_0^{2\pi}\frac{a_g^2\tan\theta}{\pi\cos^2\theta (a_g^2 + \tan^2\theta)^2} d\phi \\
&= 2\pi\frac{a_g^2\tan\theta}{\pi\cos^2\theta (a_g^2 + \tan^2\theta)^2}\\
&= 2a_g^2\frac{\tan\theta}{\cos^2\theta (a_g^2 + \tan^2\theta)^2}\\
&= 2\pi p(\theta, \phi)
\end{aligned} p θ ( θ ) = ∫ 0 2 π p ( θ , ϕ ) d ϕ = ∫ 0 2 π π cos 2 θ ( a g 2 + tan 2 θ ) 2 a g 2 tan θ d ϕ = 2 π π cos 2 θ ( a g 2 + tan 2 θ ) 2 a g 2 tan θ = 2 a g 2 cos 2 θ ( a g 2 + tan 2 θ ) 2 tan θ = 2 π p ( θ , ϕ )
p ( ϕ ∣ θ ) = p ( θ , ϕ ) p θ ( θ ) = p ( θ , ϕ ) 2 π p ( θ , ϕ ) = 1 2 π p(\phi \vert \theta) = \frac{p(\theta,\phi)}{p_\theta(\theta)} = \frac{p(\theta,\phi)}{2\pi p(\theta,\phi)} = \frac{1}{2\pi}
p ( ϕ ∣ θ ) = p θ ( θ ) p ( θ , ϕ ) = 2 π p ( θ , ϕ ) p ( θ , ϕ ) = 2 π 1
Compute CDFs
P θ ( θ ) = ∫ 0 θ 2 a g 2 tan θ ′ cos 2 θ ′ ( a g 2 + tan 2 θ ′ ) 2 d θ ′ P_\theta(\theta) = \int_{0}^{\theta}2a_g^2\frac{\tan\theta'}{\cos^2\theta' (a_g^2 + \tan^2\theta')^2}d\theta'
P θ ( θ ) = ∫ 0 θ 2 a g 2 cos 2 θ ′ ( a g 2 + tan 2 θ ′ ) 2 tan θ ′ d θ ′
To solve this integral, we change variables and introduce u = tan θ ′ u = \tan\theta' u = tan θ ′ . That gives us d u = ( tan θ ′ ) ′ d θ ′ = 1 cos 2 θ ′ d θ ′ du = (\tan\theta')'d\theta' = \frac{1}{\cos^2\theta'}d\theta' d u = ( tan θ ′ ) ′ d θ ′ = c o s 2 θ ′ 1 d θ ′ . Solving for d θ ′ d\theta' d θ ′ (with the usual slight abuse of notation): d θ ′ = cos 2 θ ′ d u d\theta' = \cos^2\theta' du d θ ′ = cos 2 θ ′ d u .
As we will resubstitute later, for now let's disregard the limits:
P θ ( θ ) = ∫ 2 a g 2 tan θ ′ cos 2 θ ′ ( a g 2 + tan 2 θ ′ ) 2 d θ ′ = 2 a g 2 ∫ u cos 2 θ ′ ( a g 2 + u 2 ) 2 cos 2 θ ′ d u = 2 a g 2 ∫ u ( a g 2 + u 2 ) 2 d u \begin{aligned}
P_\theta(\theta) &= \int 2a_g^2\frac{\tan\theta'}{\cos^2\theta' (a_g^2 + \tan^2\theta')^2}d\theta' \\
&= 2a_g^2 \int \frac{u}{\cos^2\theta' (a_g^2 + u^2)^2}\cos^2\theta'du\\
&= 2a_g^2 \int \frac{u}{(a_g^2 + u^2)^2} du\\
\end{aligned} P θ ( θ ) = ∫ 2 a g 2 cos 2 θ ′ ( a g 2 + tan 2 θ ′ ) 2 tan θ ′ d θ ′ = 2 a g 2 ∫ cos 2 θ ′ ( a g 2 + u 2 ) 2 u cos 2 θ ′ d u = 2 a g 2 ∫ ( a g 2 + u 2 ) 2 u d u
We will do a second substitution: v = a g 2 + u 2 v = a_g^2 + u^2 v = a g 2 + u 2 . That gives us d v = ( a g 2 + u 2 ) ′ d u = 2 u d u dv = (a_g^2 +u^2)'du = 2udu d v = ( a g 2 + u 2 ) ′ d u = 2 u d u . Solving for d u du d u : d u = d v 2 u du = \frac{dv}{2u} d u = 2 u d v
2 a g 2 ∫ u ( a g 2 + u 2 ) 2 d u = 2 a g 2 ∫ u v 2 d v 2 u = a g 2 ∫ 1 v 2 d v \begin{aligned}
2a_g^2 \int \frac{u}{(a_g^2 + u^2)^2} du &= 2a_g^2 \int \frac{u}{v^2} \frac{dv}{2u} \\
&= a_g^2 \int \frac{1}{v^2} dv
\end{aligned} 2 a g 2 ∫ ( a g 2 + u 2 ) 2 u d u = 2 a g 2 ∫ v 2 u 2 u d v = a g 2 ∫ v 2 1 d v
This can be easily solved:
a g 2 ∫ 1 v 2 d v = a g 2 [ − 1 v ] = − a g 2 [ 1 v ] \begin{aligned}
a_g^2 \int \frac{1}{v^2} dv \\
&= a_g^2 [-\frac{1}{v}] \\
&= -a_g^2 [\frac{1}{v}]
\end{aligned} a g 2 ∫ v 2 1 d v = a g 2 [ − v 1 ] = − a g 2 [ v 1 ]
Resubstituting v = a g 2 + u 2 v = a_g^2 + u^2 v = a g 2 + u 2 :
− a g 2 [ 1 v ] = − a g 2 [ 1 a g 2 + u 2 ] \begin{aligned}
-a_g^2 [\frac{1}{v}] &= -a_g^2 [\frac{1}{a_g^2 + u^2}]
\end{aligned} − a g 2 [ v 1 ] = − a g 2 [ a g 2 + u 2 1 ]
Resubstituting u = tan θ ′ u = \tan\theta' u = tan θ ′ :
P θ ( θ ) = − a g 2 [ 1 a g 2 + u 2 ] = − a g 2 [ 1 a g 2 + tan 2 θ ′ ] 0 θ = − a g 2 ( 1 a g 2 + tan 2 θ − 1 a g 2 + tan 2 0 ) = − a g 2 ( 1 a g 2 + tan 2 θ − 1 a g 2 ) = 1 − a g 2 a g 2 + tan 2 θ \begin{aligned}
P_\theta(\theta) &= -a_g^2 [\frac{1}{a_g^2 + u^2}]\\
&= -a_g^2 [\frac{1}{a_g^2 + \tan^2\theta'}]_0^{\theta}\\
&= -a_g^2 (\frac{1}{a_g^2 + \tan^2\theta} - \frac{1}{a_g^2 + \tan^20})\\
&= -a_g^2 (\frac{1}{a_g^2 + \tan^2\theta} - \frac{1}{a_g^2})\\
&= 1 - \frac{a_g^2}{a_g^2 + \tan^2\theta}
\end{aligned} P θ ( θ ) = − a g 2 [ a g 2 + u 2 1 ] = − a g 2 [ a g 2 + tan 2 θ ′ 1 ] 0 θ = − a g 2 ( a g 2 + tan 2 θ 1 − a g 2 + tan 2 0 1 ) = − a g 2 ( a g 2 + tan 2 θ 1 − a g 2 1 ) = 1 − a g 2 + tan 2 θ a g 2
P ( ϕ ∣ θ ) = ∫ 0 ϕ p ( ϕ ′ ∣ θ ) d ϕ ′ = ∫ 0 ϕ 1 2 π d ϕ ′ = ϕ 2 π P(\phi \vert \theta) = \int_{0}^{\phi}p(\phi ' \vert \theta)d\phi' = \int_{0}^{\phi} \frac{1}{2\pi}d\phi' =\frac{\phi}{2\pi}
P ( ϕ ∣ θ ) = ∫ 0 ϕ p ( ϕ ′ ∣ θ ) d ϕ ′ = ∫ 0 ϕ 2 π 1 d ϕ ′ = 2 π ϕ
Invert CDFs
u 1 = P θ ( θ ) = 1 − a g 2 a g 2 + tan 2 θ u 1 − 1 = − a g 2 a g 2 + tan 2 θ 1 − u 1 = a g 2 a g 2 + tan 2 θ a g 2 + tan 2 θ = a g 2 1 − u 1 tan 2 θ = a g 2 1 − u 1 − a g 2 tan θ = a g 2 1 − u 1 − a g 2 θ = tan − 1 ( a g 2 1 − u 1 − a g 2 ) = tan − 1 ( a g 2 − a g 2 ( 1 − u 1 ) 1 − u 1 ) = tan − 1 ( a g 2 − a g 2 + a g 2 u 1 1 − u 1 ) = tan − 1 ( a g 2 u 1 1 − u 1 ) = tan − 1 ( a g u 1 1 − u 1 ) \begin{aligned}
u_1 &= P_\theta(\theta)\\
&= 1 - \frac{a_g^2}{a_g^2 + \tan^2\theta} \\
u_1 - 1&=- \frac{a_g^2}{a_g^2 + \tan^2\theta} \\
1- u_1 &= \frac{a_g^2}{a_g^2 + \tan^2\theta} \\
a_g^2 + \tan^2\theta &= \frac{a_g^2}{1- u_1} \\
\tan^2\theta &= \frac{a_g^2}{1- u_1} -a_g^2 \\
\tan\theta &= \sqrt{\frac{a_g^2}{1- u_1} -a_g^2}\\
\theta &= \tan^{-1}(\sqrt{\frac{a_g^2}{1- u_1} -a_g^2}) \\
&= \tan^{-1}(\sqrt{\frac{a_g^2 - a_g^2(1-u_1)}{1- u_1}}) \\
&= \tan^{-1}(\sqrt{\frac{a_g^2- a_g^2+ a_g^2u_1}{1- u_1}}) \\
&= \tan^{-1}(\sqrt{\frac{a_g^2u_1}{1- u_1}}) \\
&= \tan^{-1}(\frac{a_g\sqrt{u_1}}{\sqrt{1- u_1}})
\end{aligned} u 1 u 1 − 1 1 − u 1 a g 2 + tan 2 θ tan 2 θ tan θ θ = P θ ( θ ) = 1 − a g 2 + tan 2 θ a g 2 = − a g 2 + tan 2 θ a g 2 = a g 2 + tan 2 θ a g 2 = 1 − u 1 a g 2 = 1 − u 1 a g 2 − a g 2 = 1 − u 1 a g 2 − a g 2 = tan − 1 ( 1 − u 1 a g 2 − a g 2 ) = tan − 1 ( 1 − u 1 a g 2 − a g 2 ( 1 − u 1 ) ) = tan − 1 ( 1 − u 1 a g 2 − a g 2 + a g 2 u 1 ) = tan − 1 ( 1 − u 1 a g 2 u 1 ) = tan − 1 ( 1 − u 1 a g u 1 )
Here the last line is the formulation found in Walter et al.
u 2 = P ( ϕ ∣ θ ) = ϕ 2 π ϕ = u 2 2 π \begin{aligned}
u_2 &= P(\phi \vert \theta) \\
&= \frac{\phi}{2\pi}\\
\phi &= u_22\pi
\end{aligned} u 2 ϕ = P ( ϕ ∣ θ ) = 2 π ϕ = u 2 2 π