☰ Navigation
Power Cosine Weighted Hemisphere Sector
The following distrbution is chosen, since it includes some other cases (uniform cap, uniform hemisphere, cosine weighted hemisphere, …). Can be used to account for the cos \cos cos factor in the rendering equation or for something like the phong model.
The probability of each sample is weighted by its cosine with the normal. Samples are chosen from only a part of the hemisphere, defined by minimum and maximum angles.
Check out the result here:
function pow_cos_hemisphere_sector ( theta_min, theta_max, phi_min, phi_max, n ) {
const u_1 = Math. random ( ) ;
const u_2 = Math. random ( ) ;
let theta = Math. acos ( Math. pow (
Math. pow (
Math. cos ( theta_min) , n+ 1 )
- u_1* ( Math. pow ( Math. cos ( theta_min) , n+ 1 )
- Math. pow ( Math. cos ( theta_max) , n+ 1 ) ) ,
1.0 / ( n+ 1 )
) ) ;
const phi = u_2* ( phi_max - phi_min) ;
return [ theta, phi] ;
}
Algorithm
Generate points weighted by a power cosine with power n n n on the sphere sector defined by the angles θ m i n , θ m a x , ϕ m i n , ϕ m a x \theta_{min}, \theta_{max}, \phi_{min}, \phi_{max} θ min , θ ma x , ϕ min , ϕ ma x
Choose uniform numbers u 1 , u 2 u_1, u_2 u 1 , u 2 in [ 0 , 1 ] [0,1] [ 0 , 1 ]
Calculate θ = cos − 1 ( cos n + 1 θ m i n − u 1 ( c o s n + 1 θ m i n − cos n + 1 θ m a x ) n + 1 ) \theta = \cos^{-1}(\sqrt[n+1]{\cos^{n+1}\theta_{min} - u_1(cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max})} ) θ = cos − 1 ( n + 1 cos n + 1 θ min − u 1 ( co s n + 1 θ min − cos n + 1 θ ma x ) )
Calculate ϕ = u 2 ( ϕ m a x − ϕ m i n ) \phi = u_2(\phi_{max} - \phi_{min}) ϕ = u 2 ( ϕ ma x − ϕ min )
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 ( ω ) = n + 1 ( cos n + 1 θ m i n − cos n + 1 θ m a x ) ( ϕ m a x − ϕ m i n ) cos n θ p(\omega) = \frac{n+1}{(\cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max})({\phi_{max}} - {\phi_{min}}) }\cos^n\theta
p ( ω ) = ( cos n + 1 θ min − cos n + 1 θ ma x ) ( ϕ ma x − ϕ min ) n + 1 cos n θ
p ( θ , ϕ ) = n + 1 ( cos n + 1 θ m i n − cos n + 1 θ m a x ) ( ϕ m a x − ϕ m i n ) cos n θ sin θ p(\theta,\phi) = \frac{n+1}{(\cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max})({\phi_{max}} - {\phi_{min}})}\cos^n\theta\sin\theta
p ( θ , ϕ ) = ( cos n + 1 θ min − cos n + 1 θ ma x ) ( ϕ ma x − ϕ min ) n + 1 cos n θ sin θ
Derivation
Each direction should be weighted by a power n n n of the cosine of the direction’s polar angle, therefore it is proportional to cos n θ ⇒ p ( ω ) = c cos n θ \cos^n\theta \Rightarrow p(\omega) = c\cos^n\theta cos n θ ⇒ p ( ω ) = c cos n θ
∫ Ω r p ( ω ) d ω = ∫ Ω r c cos n θ d ω = c ∫ Ω r cos n θ d ω = 1 \int_{\Omega_r} p(\omega)d\omega = \int_{\Omega_r} c \cos^n\theta d\omega = c\int_{\Omega_r} \cos^n\theta d\omega = 1
∫ Ω r p ( ω ) d ω = ∫ Ω r c cos n θ d ω = c ∫ Ω r cos n θ d ω = 1
Here Ω r \Omega_r Ω r is the ring of the sphere, which is specified by a minimum and maximum angles θ m i n , θ m a x , ϕ m i n , ϕ m a x \theta_{min}, \theta_{max}, \phi_{min}, \phi_{max} θ min , θ ma x , ϕ min , ϕ ma x
Normalization factor
c ∫ Ω r cos n θ d ω = c ∫ θ m i n θ m a x ∫ ϕ m i n ϕ m a x cos n θ sin θ d θ d ϕ = c ( ϕ m a x − ϕ m i n ) ∫ θ m i n θ m a x cos n θ sin θ d θ c\int_{\Omega_r} \cos^n\theta d\omega = c\int_{\theta_{min}}^{\theta_{max}}\int_{\phi_{min}}^{\phi_{max}} \cos^n\theta\sin\theta d\theta d\phi = c({\phi_{max}} - {\phi_{min}})\int_{\theta_{min}}^{\theta_{max}}\cos^n\theta\sin\theta d\theta
c ∫ Ω r cos n θ d ω = c ∫ θ min θ ma x ∫ ϕ min ϕ ma x cos n θ sin θ d θ d ϕ = c ( ϕ ma x − ϕ min ) ∫ θ min θ ma x cos n θ sin θ d θ
We evaluate the integral on the right using partial integration and denoting the integral itself as I I I
I = ∫ θ m i n θ m a x cos n θ sin θ d θ = [ cos n θ ( − cos θ ) ] θ m i n θ m a x − ∫ θ m i n θ m a x − n cos n − 1 θ sin θ ( − cos θ ) d θ = [ − cos n + 1 θ ] θ m i n θ m a x − n ∫ θ m i n θ m a x cos n sin θ d θ = cos n + 1 θ m i n − cos n + 1 θ m a x − n I I + n I = cos n + 1 θ m i n − cos n + 1 θ m a x I = cos n + 1 θ m i n − cos n + 1 θ m a x n + 1 I = d n + 1 \begin{aligned}
I &= \int_{\theta_{min}}^{\theta_{max}}\cos^n\theta\sin\theta d\theta \\
&= [\cos^n\theta (-\cos\theta)]_{\theta_{min}}^{\theta_{max}} - \int_{\theta_{min}}^{\theta_{max}}-n\cos^{n-1}\theta\sin\theta (-\cos\theta)d\theta \\
&= [-\cos^{n+1}\theta]_{\theta_{min}}^{\theta_{max}} -n\int_{\theta_{min}}^{\theta_{max}}\cos^n\sin\theta d\theta \\
&= \cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max} - nI \\
I + nI &= \cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max} \\
I &= \frac{\cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max}}{n+1} \\
I &= \frac{d}{n+1}
\end{aligned} I I + n I I I = ∫ θ min θ ma x cos n θ sin θ d θ = [ cos n θ ( − cos θ ) ] θ min θ ma x − ∫ θ min θ ma x − n cos n − 1 θ sin θ ( − cos θ ) d θ = [ − cos n + 1 θ ] θ min θ ma x − n ∫ θ min θ ma x cos n sin θ d θ = cos n + 1 θ min − cos n + 1 θ ma x − n I = cos n + 1 θ min − cos n + 1 θ ma x = n + 1 cos n + 1 θ min − cos n + 1 θ ma x = n + 1 d
In the last line, we just introduced a new variable to make writing easier.
Putting this in the first equation:
c ( ϕ m a x − ϕ m i n ) ∫ θ m i n θ m a x cos n θ sin θ d θ = c ( ϕ m a x − ϕ m i n ) d n + 1 = 1 ⇒ c = n + 1 d ( ϕ m a x − ϕ m i n ) c({\phi_{max}} - {\phi_{min}})\int_{\theta_{min}}^{\theta_{max}} \cos^n\theta\sin\theta d\theta = c({\phi_{max}} - {\phi_{min}})\frac{d}{n+1} = 1 \Rightarrow c = \frac{n+1}{d({\phi_{max}} - {\phi_{min}})}
c ( ϕ ma x − ϕ min ) ∫ θ min θ ma x cos n θ sin θ d θ = c ( ϕ ma x − ϕ min ) n + 1 d = 1 ⇒ c = d ( ϕ ma x − ϕ min ) n + 1
This results in:
p ( ω ) = n + 1 d ( ϕ m a x − ϕ m i n ) cos n θ ⇒ p ( θ , ϕ ) = n + 1 d ( ϕ m a x − ϕ m i n ) cos n θ sin θ p(\omega) = \frac{n+1}{d({\phi_{max}} - {\phi_{min}}) }\cos^n\theta \Rightarrow p(\theta,\phi) = \frac{n+1}{d({\phi_{max}} - {\phi_{min}})}\cos^n\theta\sin\theta
p ( ω ) = d ( ϕ ma x − ϕ min ) n + 1 cos n θ ⇒ p ( θ , ϕ ) = d ( ϕ ma x − ϕ min ) n + 1 cos n θ sin θ
Marginal And Conditional Densities:
p θ ( θ ) = ∫ ϕ m i n ϕ m a x p ( θ , ϕ ) d ϕ = ∫ ϕ m i n ϕ m a x n + 1 d ( ϕ m a x − ϕ m i n ) cos n θ sin θ d ϕ = n + 1 d ( ϕ m a x − ϕ m i n ) cos n θ sin θ ( ϕ m a x − ϕ m i n ) = n + 1 d cos n θ sin θ p_\theta(\theta) = \int_{\phi_{min}}^{\phi_{max}}p(\theta,\phi) d\phi = \int_{\phi_{min}}^{\phi_{max}}\frac{n+1}{d({\phi_{max}} - {\phi_{min}})}\cos^n\theta\sin\theta d\phi = \frac{n+1}{d({\phi_{max}} - {\phi_{min}})}\cos^n\theta\sin\theta ({\phi_{max}} - {\phi_{min}}) = \frac{n+1}{d}\cos^n\theta\sin\theta
p θ ( θ ) = ∫ ϕ min ϕ ma x p ( θ , ϕ ) d ϕ = ∫ ϕ min ϕ ma x d ( ϕ ma x − ϕ min ) n + 1 cos n θ sin θ d ϕ = d ( ϕ ma x − ϕ min ) n + 1 cos n θ sin θ ( ϕ ma x − ϕ min ) = d n + 1 cos n θ sin θ
p ( ϕ ∣ θ ) = p ( θ , ϕ ) p θ ( θ ) = ( n + 1 ) cos n θ sin θ d d ( ϕ m a x − ϕ m i n ) ( n + 1 ) cos n θ sin θ = 1 ϕ m a x − ϕ m i n p(\phi \vert \theta) = \frac{p(\theta,\phi)}{p_\theta(\theta)} = \frac{(n+1)\cos^n\theta\sin\theta d}{d({\phi_{max}} - {\phi_{min}}) (n+1)\cos^n\theta\sin\theta}= \frac{1}{\phi_{max} - \phi_{min} }
p ( ϕ ∣ θ ) = p θ ( θ ) p ( θ , ϕ ) = d ( ϕ ma x − ϕ min ) ( n + 1 ) cos n θ sin θ ( n + 1 ) cos n θ sin θ d = ϕ ma x − ϕ min 1
Compute CDFs
P θ ( θ ) = ∫ θ m i n θ n + 1 d cos n θ ′ sin θ ′ d θ ′ = n + 1 d ∫ θ m i n θ cos n θ ′ sin θ ′ d θ ′ P_\theta(\theta) = \int_{\theta_{min}}^{\theta}\frac{n+1}{d}\cos^n\theta'\sin\theta'd\theta' = \frac{n+1}{d}\int_{\theta_{min}}^{\theta}\cos^n\theta'\sin\theta'd\theta'
P θ ( θ ) = ∫ θ min θ d n + 1 cos n θ ′ sin θ ′ d θ ′ = d n + 1 ∫ θ min θ cos n θ ′ sin θ ′ d θ ′
We already integrated the integral expression before, so we can use that
n + 1 d ∫ θ m i n θ cos n θ ′ sin θ ′ d θ ′ = n + 1 d cos n + 1 θ m i n − cos n + 1 θ n + 1 = cos n + 1 θ m i n − cos n + 1 θ cos n + 1 θ m i n − cos n + 1 θ m a x \frac{n+1}{d}\int_{\theta_{min}}^{\theta}\cos^n\theta'\sin\theta'd\theta' = \frac{n+1}{d}\frac{\cos^{n+1}\theta_{min} - \cos^{n+1}\theta}{n+1} = \frac{\cos^{n+1}\theta_{min} - \cos^{n+1}\theta}{\cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max}}
d n + 1 ∫ θ min θ cos n θ ′ sin θ ′ d θ ′ = d n + 1 n + 1 cos n + 1 θ min − cos n + 1 θ = cos n + 1 θ min − cos n + 1 θ ma x cos n + 1 θ min − cos n + 1 θ
P ( ϕ ∣ θ ) = ∫ ϕ m i n ϕ p ( ϕ ′ ∣ θ ) d ϕ ′ = ∫ ϕ m i n ϕ 1 ϕ m a x − ϕ m i n d ϕ ′ = ϕ ϕ m a x − ϕ m i n P(\phi \vert \theta) = \int_{\phi_{min}}^{\phi}p(\phi ' \vert \theta)d\phi' = \int_{\phi_{min}}^{\phi} \frac{1}{\phi_{max} - \phi_{min} }d\phi' =\frac{\phi}{\phi_{max} - \phi_{min}}
P ( ϕ ∣ θ ) = ∫ ϕ min ϕ p ( ϕ ′ ∣ θ ) d ϕ ′ = ∫ ϕ min ϕ ϕ ma x − ϕ min 1 d ϕ ′ = ϕ ma x − ϕ min ϕ
Invert CDFs
u 1 = P θ ( θ ) = cos n + 1 θ m i n − cos n + 1 θ cos n + 1 θ m i n − cos n + 1 θ m a x u 1 ( c o s n + 1 θ m i n − cos n + 1 θ m a x ) = cos n + 1 θ m i n − cos n + 1 θ cos n + 1 θ = cos n + 1 θ m i n − u 1 ( c o s n + 1 θ m i n − cos n + 1 θ m a x ) cos θ = cos n + 1 θ m i n − u 1 ( c o s n + 1 θ m i n − cos n + 1 θ m a x ) n + 1 θ = cos − 1 ( cos n + 1 θ m i n − u 1 ( c o s n + 1 θ m i n − cos n + 1 θ m a x ) n + 1 ) \begin{aligned}
u_1 &= P_\theta(\theta)\\
&= \frac{\cos^{n+1}\theta_{min} - \cos^{n+1}\theta}{\cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max}} \\
u_1(cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max}) &= \cos^{n+1}\theta_{min} - \cos^{n+1}\theta \\
\cos^{n+1}\theta &= \cos^{n+1}\theta_{min} - u_1(cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max}) \\
\cos\theta &= \sqrt[n+1]{\cos^{n+1}\theta_{min} - u_1(cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max})} \\
\theta &= \cos^{-1}(\sqrt[n+1]{\cos^{n+1}\theta_{min} - u_1(cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max})} )
\end{aligned} u 1 u 1 ( co s n + 1 θ min − cos n + 1 θ ma x ) cos n + 1 θ cos θ θ = P θ ( θ ) = cos n + 1 θ min − cos n + 1 θ ma x cos n + 1 θ min − cos n + 1 θ = cos n + 1 θ min − cos n + 1 θ = cos n + 1 θ min − u 1 ( co s n + 1 θ min − cos n + 1 θ ma x ) = n + 1 cos n + 1 θ min − u 1 ( co s n + 1 θ min − cos n + 1 θ ma x ) = cos − 1 ( n + 1 cos n + 1 θ min − u 1 ( co s n + 1 θ min − cos n + 1 θ ma x ) )
u 2 = P ( ϕ ∣ θ ) = ϕ ϕ m a x − ϕ m i n ϕ = u 2 ( ϕ m a x − ϕ m i n ) \begin{aligned}
u_2 &= P(\phi \vert \theta) \\
&= \frac{\phi}{\phi_{max} - \phi_{min}}\\
\phi &= u_2(\phi_{max} - \phi_{min})
\end{aligned} u 2 ϕ = P ( ϕ ∣ θ ) = ϕ ma x − ϕ min ϕ = u 2 ( ϕ ma x − ϕ min )