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 θ=cos⁡−1(cos⁡n+1θmin−u1(cosn+1θmin−cos⁡n+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(cos⁡n+1θmin−cos⁡n+1θmax)(ϕmax−ϕmin)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(θ,ϕ)=n+1(cos⁡n+1θmin−cos⁡n+1θmax)(ϕmax−ϕmin)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

Derivation

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

∫Ωrp(ω)dω=∫Ωrccos⁡nθdω=c∫Ωrcos⁡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

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∫Ωrcos⁡nθdω=c∫θminθmax∫ϕminϕmaxcos⁡nθsin⁡θdθdϕ=c(ϕmax−ϕmin)∫θminθmaxcos⁡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

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

I=∫θminθmaxcos⁡nθsin⁡θdθ=[cos⁡nθ(−cos⁡θ)]θminθmax−∫θminθmax−ncos⁡n−1θsin⁡θ(−cos⁡θ)dθ=[−cos⁡n+1θ]θminθmax−n∫θminθmaxcos⁡nsin⁡θdθ=cos⁡n+1θmin−cos⁡n+1θmax−nII+nI=cos⁡n+1θmin−cos⁡n+1θmaxI=cos⁡n+1θmin−cos⁡n+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θmaxcos⁡nθsin⁡θdθ=c(ϕmax−ϕmin)dn+1=1⇒c=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)cos⁡nθ⇒p(θ,ϕ)=n+1d(ϕmax−ϕmin)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

Marginal And Conditional Densities:

pθ(θ)=∫ϕminϕmaxp(θ,ϕ)dϕ=∫ϕminϕmaxn+1d(ϕmax−ϕmin)cos⁡nθsin⁡θdϕ=n+1d(ϕmax−ϕmin)cos⁡nθsin⁡θ(ϕmax−ϕmin)=n+1dcos⁡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(ϕ∣θ)=p(θ,ϕ)pθ(θ)=(n+1)cos⁡nθsin⁡θdd(ϕmax−ϕmin)(n+1)cos⁡nθ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+1dcos⁡nθ′sin⁡θ′dθ′=n+1d∫θminθ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'

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

n+1d∫θminθcos⁡nθ′sin⁡θ′dθ′=n+1dcos⁡n+1θmin−cos⁡n+1θn+1=cos⁡n+1θmin−cos⁡n+1θcos⁡n+1θmin−cos⁡n+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θ(θ)=cos⁡n+1θmin−cos⁡n+1θcos⁡n+1θmin−cos⁡n+1θmaxu1(cosn+1θmin−cos⁡n+1θmax)=cos⁡n+1θmin−cos⁡n+1θcos⁡n+1θ=cos⁡n+1θmin−u1(cosn+1θmin−cos⁡n+1θmax)cos⁡θ=cos⁡n+1θmin−u1(cosn+1θmin−cos⁡n+1θmax)n+1θ=cos⁡−1(cos⁡n+1θmin−u1(cosn+1θmin−cos⁡n+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}