Jump to content
  • Advertisement
Sign in to follow this  

Spherical Harmonics HELP NEEDED

This topic is 2787 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I've been looking at SH in Actual Games - by Tom Forsyth and I have no idea whther I have the coefficients the right way round... i.e. 1,x,y,z,xz,yx,xy,3z^2-1,x^2-y^2
obv there is more than one typo because in another place Forsyth puts them 1,x,y,z,xz,yx,xy,x^2-y^2,1-3z^2 which is frustrating

A stanford paper and source put the coeffs 1,y,x,z,xy,yx,xz,3z^2-1,x^2-y^2 so I am totally lost

I want to use 2nd order spherical harmonics with 9 coefficients, I dunno what I am doing wrong. I also think I have my constants/weights wrong too :( i.e. 0.282095 and so on

The only thing I am positive I got right is the differential solid angle

I'm planning to convert cubemaps into SH but for now I have a simple test app which simulates as if there is only 1 pixel per face... (6 colors) red,green,blue,yellow, white and black corresponding to the "dir" parameter (i.e. red is front/z+)

I struggle with the math and just checking the differential solid angle took me 2 days so I would much appreciate if you could DUMBDOWN the topic for me or show me some piece of code that I could use the constants from

Right here is my little code dir basically means 0=forward, 1= right, back,left, up and down

float u,v,x,y,z,domega,c,fwt;
u = 0; /* u ranges from -1 to 1 */
v = 0; /* v ranges from -1 to 1 */
fwt = u*u+v*v+1.f;
c = sqrt(fwt);
if (dir==0) {
else if (dir==1) {
else if (dir==2) {
else if (dir==3) {
else if (dir==4) {
else if (dir==5) {
x /= c;
y /= c;
z /= c;

c = 1.f/(fwt*c);
fwtSum += c;
domega = c;

c = 0.282095*domega;
coeff[0] += col.X*c;
coeff[1] += col.Y*c;
coeff[2] += col.Z*c;

c = 0.488603*domega;
coeff[3] += col.X*c*x;
coeff[4] += col.Y*c*x;
coeff[5] += col.Z*c*x;
coeff[6] += col.X*c*y;
coeff[7] += col.Y*c*y;
coeff[8] += col.Z*c*y;
coeff[9] += col.X*c*z;
coeff[10] += col.Y*c*z;
coeff[11] += col.Z*c*z;

c = 1.092548*domega;
coeff[12] += col.X*c*x*z;
coeff[13] += col.Y*c*x*z;
coeff[14] += col.Z*c*x*z;
coeff[15] += col.X*c*y*z;
coeff[16] += col.Y*c*y*z;
coeff[17] += col.Z*c*y*z;
coeff[18] += col.X*c*x*y;
coeff[19] += col.Y*c*x*y;
coeff[20] += col.Z*c*x*y;

c = 1.092548*domega*(3.f*z*z-1.f);
coeff[21] += col.X*c;
coeff[22] += col.Y*c;
coeff[23] += col.Z*c;

c = 0.546274*domega*(x*x-y*y);
coeff[24] += col.X*c;
coeff[25] += col.Y*c;
coeff[26] += col.Z*c;

after all sides are processed I scale the entire harmonic by 4.f*core::PI/(fwtSum*6.f)

Share this post

Link to post
Share on other sites
I think this might help.


Sorry I'm just trying to learn the same stuff myself.

Share this post

Link to post
Share on other sites
Okay I have some code that does SH but with 4 bands instead. Look at


he has pseudo code for projecting cube maps into SH basis. I think you may have computed some of the weights wrong. I'm not sure how the U,V are parameterized. (I'm not at the stage where I'm computing the Cube myself myself, I have some coefficients already, so I lack actual implementation insights. Sorry.)

After this projection, you should have 9 coefficient VECTORS. If you look at the ERIE map paper (the Stanford paper) it will become clear. What I did is I manually expanded equation 7, to get equations 11,12,13 (because at first I was confused about where he got some of the Cs, but if you expand eq. 7, it will come to you).

Share this post

Link to post
Share on other sites
Here is my code.... note, I manually derived some of the SH in polynomial form myself and I've yet to check my results...but, in the Stupid SH tricks paper, he has SH in polynomial forms up to the 5th order.


Share this post

Link to post
Share on other sites
Oh I see what you are doing. You are saying the map is just a single pixel. IF you look at the Stupid SH tricks UV excludes +/- -1s. The only problem I see it's your weight inside the projection summation is wrong, shouldn't it be 4 divide by r**3?

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!