IrradianceProjectSH.bsl 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "$ENGINE$\PPBase.bslinc"
  2. #include "$ENGINE$\ReflectionCubemapCommon.bslinc"
  3. #include "$ENGINE$\SHCommon.bslinc"
  4. technique IrradianceProjectSH
  5. {
  6. mixin PPBase;
  7. mixin ReflectionCubemapCommon;
  8. mixin SHCommon;
  9. code
  10. {
  11. [internal]
  12. cbuffer Params
  13. {
  14. int gCubeFace;
  15. }
  16. StructuredBuffer<SHVector5RGB> gSHCoeffs;
  17. float evaluateLambert(SHVector5 coeffs)
  18. {
  19. // Multiply irradiance SH coefficients by cosine lobe (Lambert diffuse) and evaluate resulting SH
  20. // See: http://cseweb.ucsd.edu/~ravir/papers/invlamb/josa.pdf for derivation of the
  21. // cosine lobe factors
  22. float output = 0.0f;
  23. // Band 0 (factor 1.0)
  24. output += coeffs.v0[0];
  25. // Band 1 (factor 2/3)
  26. float f = (2.0f/3.0f);
  27. float4 f4 = float4(f, f, f, f);
  28. output += dot(coeffs.v0.gba, f4.rgb);
  29. // Band 2 (factor 1/4)
  30. f = (1.0f/4.0f);
  31. f4 = float4(f, f, f, f);
  32. output += dot(coeffs.v1, f4);
  33. output += coeffs.v2.r * f;
  34. // Band 3 (factor 0)
  35. // Band 4 (factor -1/24)
  36. f = (-1.0f/24.0f);
  37. f4 = float4(f, f, f, f);
  38. output += dot(coeffs.v4, f4);
  39. output += dot(coeffs.v5, f4);
  40. output += coeffs.v6 * f;
  41. return output;
  42. }
  43. float4 fsmain(VStoFS input) : SV_Target0
  44. {
  45. float2 scaledUV = input.uv0 * 2.0f - 1.0f;
  46. float3 dir = getDirFromCubeFace(gCubeFace, scaledUV);
  47. dir = normalize(dir);
  48. SHVector5 shBasis = SHBasis5(dir);
  49. SHVector5RGB coeffs = gSHCoeffs[0];
  50. SHMultiply(coeffs.R, shBasis);
  51. SHMultiply(coeffs.G, shBasis);
  52. SHMultiply(coeffs.B, shBasis);
  53. float3 output = 0;
  54. output.r = evaluateLambert(coeffs.R);
  55. output.g = evaluateLambert(coeffs.G);
  56. output.b = evaluateLambert(coeffs.B);
  57. return float4(output.rgb, 1.0f);
  58. }
  59. };
  60. };