In hidsight, baking a lookup table of vectors and the spherical harmonics, might lead to artifacts, but with 1024 samples it doesnt look too bad
Feel free to download the source to sing along, its all based on the Sony Paper from 2003 see the PDF from SCEA
Python executable that write Spherical Harmonics Renderman header: sh1.py
Please find the resulting header file attached: SH.h
And a simple shader to calculate transmission based on the table of stratified samples above: localVisibility.sl
Its a bit clunky because I couldn’t work out how to do two dimensional arrays in RSL, im glad to fix it up if it is possible.
The preprocessor thing isnt that sweet either :/
As below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include "SH.h" surface localVisibility( uniform float maxDistance = 10; uniform string outputFolder = ""; ) { SHVECTOR SHSPH0 SHSPH1 SHCOEFF0 SHCOEFF1 SHCOEFF2 SHCOEFF3 SHCOEFF4 SHCOEFF5 SHCOEFF6 SHCOEFF7 SHCOEFF8 vector Nworld = vector(transform("world",N)); point Pworld = transform("world",P); uniform float numSamples = 1024; uniform float numCoeffs = 9; varying float results[9]={0,0,0,0,0,0,0,0,0}; uniform float i,j; varying float faceforward = 0; varying float occl = 0; for(i=0;i<numSamples;i=i+1){ float Hs = samplesVector[i].Nworld; point destinationWorld = Pworld + samplesVector[i]*maxDistance; point destinationCurrent = transform("world","current",destinationWorld); if (Hs > 0){ faceforward += 1; float isHit = comp(transmission(P,destinationCurrent),0); if (isHit > 0) { occl += 1; for(j=0;j<numCoeffs;j=j+1){ varying float value = isHit; if (j == 0) { value *= samplesCoeffs0[i]; } if (j == 1) { value *= samplesCoeffs1[i]; } if (j == 2) { value *= samplesCoeffs2[i]; } if (j == 3) { value *= samplesCoeffs3[i]; } if (j == 4) { value *= samplesCoeffs4[i]; } if (j == 5) { value *= samplesCoeffs5[i]; } if (j == 6) { value *= samplesCoeffs6[i]; } if (j == 7) { value *= samplesCoeffs7[i]; } if (j == 8) { value *= samplesCoeffs8[i]; } results[j] += value; } } } } for (j=0;j<numCoeffs;j=j+1){ results[j] /= faceforward; } occl /= faceforward; faceforward /= numSamples; Ci = color(results[0],results[1],results[2]); Oi = 1; Ci *= Oi; } |
I dont think it is working yet, but it compiles and renders
Sam