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 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 nn on the sphere sector defined by the angles θmin,θmax,ϕmin,ϕmax\theta_{min}, \theta_{max}, \phi_{min}, \phi_{max}

  1. Choose uniform numbers u1,u2u_1, u_2 in [0,1][0,1]
  2. Calculate θ=cos1(cosn+1θminu1(cosn+1θmincosn+1θmax)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})} )
  3. Calculate ϕ=u2(ϕmaxϕmin)\phi = u_2(\phi_{max} - \phi_{min})

Optionally convert to cartesian coordinates with:

x=sinθcosϕx = \sin\theta\cos\phi

y=sinθsinϕy = \sin\theta\sin\phi

z=cosθz = \cos\theta

PDF Used In Monte Carlo Integration

p(ω)=n+1(cosn+1θmincosn+1θmax)(ϕmaxϕmin)cosnθp(\omega) = \frac{n+1}{(\cos^{n+1}\theta_{min} - \cos^{n+1}\theta_{max})({\phi_{max}} - {\phi_{min}}) }\cos^n\theta

p(θ,ϕ)=n+1(cosn+1θmincosn+1θmax)(ϕmaxϕmin)cosnθ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

Derivation

Each direction should be weighted by a power nn of the cosine of the direction’s polar angle, therefore it is proportional to cosnθp(ω)=ccosnθ\cos^n\theta \Rightarrow p(\omega) = c\cos^n\theta

Ωrp(ω)dω=Ωrccosnθdω=cΩrcosnθ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

Here Ωr\Omega_r is the ring of the sphere, which is specified by a minimum and maximum angles θmin,θmax,ϕmin,ϕmax\theta_{min}, \theta_{max}, \phi_{min}, \phi_{max}

Normalization factor

cΩrcosnθdω=cθminθmaxϕminϕmaxcosnθsinθdθdϕ=c(ϕmaxϕmin)θminθmaxcosnθ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

We evaluate the integral on the right using partial integration and denoting the integral itself as II

I=θminθmaxcosnθsinθdθ=[cosnθ(cosθ)]θminθmaxθminθmaxncosn1θsinθ(cosθ)dθ=[cosn+1θ]θminθmaxnθminθmaxcosnsinθdθ=cosn+1θmincosn+1θmaxnII+nI=cosn+1θmincosn+1θmaxI=cosn+1θmincosn+1θmaxn+1I=dn+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}

In the last line, we just introduced a new variable to make writing easier.

Putting this in the first equation:

c(ϕmaxϕmin)θminθmaxcosnθsinθdθ=c(ϕmaxϕmin)dn+1=1c=n+1d(ϕmaxϕmin)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}})}

This results in:

p(ω)=n+1d(ϕmaxϕmin)cosnθp(θ,ϕ)=n+1d(ϕmaxϕmin)cosnθ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

Marginal And Conditional Densities:

pθ(θ)=ϕminϕmaxp(θ,ϕ)dϕ=ϕminϕmaxn+1d(ϕmaxϕmin)cosnθsinθdϕ=n+1d(ϕmaxϕmin)cosnθsinθ(ϕmaxϕmin)=n+1dcosnθ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(ϕθ)=p(θ,ϕ)pθ(θ)=(n+1)cosnθsinθdd(ϕmaxϕmin)(n+1)cosnθsinθ=1ϕmaxϕminp(\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} }

Compute CDFs

Pθ(θ)=θminθn+1dcosnθsinθdθ=n+1dθminθcosnθ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'

We already integrated the integral expression before, so we can use that

n+1dθminθcosnθsinθdθ=n+1dcosn+1θmincosn+1θn+1=cosn+1θmincosn+1θcosn+1θmincosn+1θmax\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}}

P(ϕθ)=ϕminϕp(ϕθ)dϕ=ϕminϕ1ϕmaxϕmindϕ=ϕϕmaxϕminP(\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}}

Invert CDFs

u1=Pθ(θ)=cosn+1θmincosn+1θcosn+1θmincosn+1θmaxu1(cosn+1θmincosn+1θmax)=cosn+1θmincosn+1θcosn+1θ=cosn+1θminu1(cosn+1θmincosn+1θmax)cosθ=cosn+1θminu1(cosn+1θmincosn+1θmax)n+1θ=cos1(cosn+1θminu1(cosn+1θmincosn+1θmax)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}

u2=P(ϕθ)=ϕϕmaxϕminϕ=u2(ϕmaxϕmin)\begin{aligned} u_2 &= P(\phi \vert \theta) \\ &= \frac{\phi}{\phi_{max} - \phi_{min}}\\ \phi &= u_2(\phi_{max} - \phi_{min}) \end{aligned}