From Wakapon
Jump to: navigation, search
Line 41: Line 41:
  
 
'''NOTE:''' It is sometimes desirable to express a SH coefficient <math>Y^m_l(\theta,\phi)</math> by a single index <math>Y_i(\theta,\phi)</math> where <math>i=l(l+1)+m</math>. It can be noted that <math>l(l+1)</math> gives us the "central index" (If you refer to the pyramid of coefficient indices above, these are the indices 0, 2, 6, 12, 20, 30, etc.) for any given order <math>l</math>, then adding <math>m</math> will address the "left" or "right" coefficients.  
 
'''NOTE:''' It is sometimes desirable to express a SH coefficient <math>Y^m_l(\theta,\phi)</math> by a single index <math>Y_i(\theta,\phi)</math> where <math>i=l(l+1)+m</math>. It can be noted that <math>l(l+1)</math> gives us the "central index" (If you refer to the pyramid of coefficient indices above, these are the indices 0, 2, 6, 12, 20, 30, etc.) for any given order <math>l</math>, then adding <math>m</math> will address the "left" or "right" coefficients.  
Inversely, when we want to retrieve <math>l, m</math> from <math>i</math> then <math>l=\lfloor\sqrt{i}\rfloor</math> and <math>m=i-l*(l+1)<\math>.
+
Inversely, when we want to retrieve <math>l, m</math> from <math>i</math> then <math>l=\lfloor\sqrt{i}\rfloor</math> and <math>m=i - l(l+1)</math>.
  
  
Line 49: Line 49:
 
[[File:Z-Up.png|600px]]
 
[[File:Z-Up.png|600px]]
  
The expression of vector V in cartesian coordinates is <math>v(\phi,\theta) = (sin(\theta)cos(\phi), sin(\theta)sin(\phi), cos(\theta))</math>.
+
The expression of vector <math>v</math> in cartesian coordinates is <math>v(\phi,\theta) = (sin(\theta)cos(\phi), sin(\theta)sin(\phi), cos(\theta))</math>.<br />
  
  
Line 67: Line 67:
 
</math>
 
</math>
  
 +
 +
== Common Usages for SH ==
 +
 +
=== Signal Encoding ===
 +
 +
=== Signal Decoding ===
 +
 +
=== Signal Convolution ===
 +
 +
=== Signal Triple Product ===
 +
 +
 +
== About Distant Radiance and Irradiance Environment ==
 +
 +
As mentioned
  
 
== Archive ==
 
== Archive ==
  
 
You can find an old (2009) explanation about [[SHEnvironmentMap|SH Environment Maps]].
 
You can find an old (2009) explanation about [[SHEnvironmentMap|SH Environment Maps]].

Revision as of 19:21, 2 December 2016

This page serves as an entry point to everything related to Spherical Harmonics.

What are Spherical Harmonics (SH)?

Visual representations of the first 4 bands of real spherical harmonic functions. Blue portions are regions where the function is positive, and yellow portions represent regions where it is negative.

According to wikipedia, SH are special functions defined on the surface of a sphere.

In computer graphics, we're using them as a tool to quickly and easily encode or decode a directional information. We use a specific set of spherical harmonics, denoted <math>Y^m_l(\theta,\phi)</math> called Laplace's spherical harmonics.

SH have interesting properties regarding their orthogonality, parity, symmetry and rotation that I will not cover here (cf. the wikipedia page for more info) as this page only is an overview. An excellent source of information is Spherical Harmonics Lighting: the Gritty Details by Robin Green that actually covers the practical use of SH for Computer Graphics, it's a well-explained extension of the original work done by Peter Pike Sloane who is pretty much the guy who introduced SH to Computer Graphics for Pre-computed Radiance Transfer (PRT).

I will rather quickly talk about how to construct the SH coefficients and how to encode/decode/convolve signals using SH.

Generalities about SH orders

As can be seen in the inset on the right, Spherical Harmonics are functions defined over the sphere. They are denoted <math>Y^m_l(\theta,\phi)</math> where <math>l</math> is the order of the coefficient. Since SH define harmonic series, there are an infinite amount of possible orders.

For a given order <math>l</math> you have <math>2l+1</math> coefficients selected by the superscript <math>m\in[-l,+l]</math>. It ensues that the indices and amount of coefficients for each order is then:

          0           Order 0 - Total = 1 = 1²
       1  2  3        Order 1 - Total = 1 + 3 = 4 = 2²
    4  5  6  7 8      Order 2 - Total = 1 + 3 + 5 = 9 = 3²
 9 10 11 12 13 14 15  Order 3 - Total = 1 + 3 + 5 + 9 = 16 = 4²
<math>\dots</math>

We quickly see the amount of coefficients to properly represent each order grows quadratically.

Intuitively, we also can notice that the more coefficients we have, the more "directionalities" we can cover. Order 0 is a constant so it represents the "ambient term", the average response of a signal and has no specific direction. Coefficients for order 1 represent the response to a signal aligned with the X, Y and Z axes. At order 2, we start covering some diagonal directions and higher frequencies.

In fact, if we used an infinite sum of SH coefficients, we could encode or decode a signal perfectly. A great advantage of using SH is that we can recover a partial signal (i.e. a band-limited signal) and we will obtain a low-frequency representation of that signal, as opposed to wavelets that attempt to reconstruct all frequencies of a signal and can show high-frequency noise, a partial SH-encoded signal will always be smooth.

It is common in real-time computer graphics to use only order 2 (9 coefficients) or order 3 (16 coefficients) at most, each coefficient being a RGB float3 triplet. SH are often used to encode irradiance, which is generally spatially varying pretty smoothly. It's also possible to encode radiance, although it varies at higher frequency than irradiance, since irradiance is simply the convolution of radiance on the entire hemisphere in a particular direction.

A great paper from Ramamoorthi and Hanrahan from 2001 shows the relationship between radiance and irradiance in terms of SH. It was shortly followed by another seminal paper called "An Efficient Representation for Irradiance Environment Maps" that extends on the first paper and shows that order 2 SH (9 coefficients) is often enough to properly represent the irradiance field surrounding an object since additional order disappear very quickly. We will come back to these papers later as I will show an extension on this irradiance estimate to introduce the Ambient Occlusion term.

NOTE: It is sometimes desirable to express a SH coefficient <math>Y^m_l(\theta,\phi)</math> by a single index <math>Y_i(\theta,\phi)</math> where <math>i=l(l+1)+m</math>. It can be noted that <math>l(l+1)</math> gives us the "central index" (If you refer to the pyramid of coefficient indices above, these are the indices 0, 2, 6, 12, 20, 30, etc.) for any given order <math>l</math>, then adding <math>m</math> will address the "left" or "right" coefficients. Inversely, when we want to retrieve <math>l, m</math> from <math>i</math> then <math>l=\lfloor\sqrt{i}\rfloor</math> and <math>m=i - l(l+1)</math>.


Constructing the SH coefficients

We're working with a Z-Up orientation:

Z-Up.png

The expression of vector <math>v</math> in cartesian coordinates is <math>v(\phi,\theta) = (sin(\theta)cos(\phi), sin(\theta)sin(\phi), cos(\theta))</math>.


The general spherical harmonics coefficient <math>Y^m_l(\theta,\phi)</math> is expressed as:

<math>Y^m_l(\theta,\phi) = K^m_l P^m_l(cos(\theta)) e^{im\phi}</math>

Where <math>K^m_l = \sqrt{ \frac{(2l+1)}{4\pi}\frac{(l-m)!}{(l+m)!}}</math> is a normalization factor and <math>P^m_l(\theta,\phi)</math> is the associated Legendre polynomial.

We're interested in the real form of spherical harmonics that is given by:

<math>Y^m_l(\theta,\phi) =

\begin{cases}

  \sqrt{2} K^{-m}_l P^{-m}_l(cos(\theta)) sin(-m\phi) & \quad \text{if } m < 0\\
   K^0_l P^0_l(cos(\theta))  & \quad \text{if } m = 0\\
  \sqrt{2} K^m_l P^{| m |}_l(cos(\theta)) cos(m\phi) & \quad \text{if } m > 0\\

\end{cases} </math>


Common Usages for SH

Signal Encoding

Signal Decoding

Signal Convolution

Signal Triple Product

About Distant Radiance and Irradiance Environment

As mentioned

Archive

You can find an old (2009) explanation about SH Environment Maps.