SHCommon.bslinc 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. mixin SHCommon
  2. {
  3. code
  4. {
  5. #define SH_NUM_COEFFS SH_ORDER * SH_ORDER
  6. struct SHVector
  7. {
  8. float v[SH_NUM_COEFFS];
  9. };
  10. struct SHVectorRGB
  11. {
  12. SHVector R;
  13. SHVector G;
  14. SHVector B;
  15. };
  16. SHVectorRGB SHLoad(Texture2D input, int2 offset)
  17. {
  18. SHVectorRGB output;
  19. [unroll]
  20. for(int i = 0; i < SH_NUM_COEFFS; ++i)
  21. {
  22. float3 coeff = input.Load(int3(offset.x + i, offset.y, 0)).rgb;
  23. output.R.v[i] = coeff.r;
  24. output.G.v[i] = coeff.g;
  25. output.B.v[i] = coeff.b;
  26. }
  27. return output;
  28. }
  29. void SHZero(inout SHVector v)
  30. {
  31. [unroll]
  32. for(int i = 0; i < SH_NUM_COEFFS; ++i)
  33. v.v[i] = 0;
  34. }
  35. void SHZero(inout SHVectorRGB v)
  36. {
  37. SHZero(v.R);
  38. SHZero(v.G);
  39. SHZero(v.B);
  40. }
  41. void SHMultiplyAdd(inout SHVector lhs, SHVector rhs, float c)
  42. {
  43. [unroll]
  44. for(int i = 0; i < SH_NUM_COEFFS; ++i)
  45. lhs.v[i] += rhs.v[i] * c;
  46. }
  47. void SHMultiplyAdd(inout SHVectorRGB lhs, SHVectorRGB rhs, float c)
  48. {
  49. SHMultiplyAdd(lhs.R, rhs.R, c);
  50. SHMultiplyAdd(lhs.G, rhs.G, c);
  51. SHMultiplyAdd(lhs.B, rhs.B, c);
  52. }
  53. void SHAdd(inout SHVector lhs, SHVector rhs)
  54. {
  55. [unroll]
  56. for(int i = 0; i < SH_NUM_COEFFS; ++i)
  57. lhs.v[i] += rhs.v[i];
  58. }
  59. void SHAdd(inout SHVectorRGB lhs, SHVectorRGB rhs)
  60. {
  61. SHAdd(lhs.R, rhs.R);
  62. SHAdd(lhs.G, rhs.G);
  63. SHAdd(lhs.B, rhs.B);
  64. }
  65. void SHMultiply(inout SHVector lhs, SHVector rhs)
  66. {
  67. [unroll]
  68. for(int i = 0; i < SH_NUM_COEFFS; ++i)
  69. lhs.v[i] *= rhs.v[i];
  70. }
  71. void SHMultiply(inout SHVectorRGB lhs, SHVectorRGB rhs)
  72. {
  73. SHMultiply(lhs.R, rhs.R);
  74. SHMultiply(lhs.G, rhs.G);
  75. SHMultiply(lhs.B, rhs.B);
  76. }
  77. void SHMultiply(inout SHVector lhs, float rhs)
  78. {
  79. [unroll]
  80. for(int i = 0; i < SH_NUM_COEFFS; ++i)
  81. lhs.v[i] *= rhs;
  82. }
  83. void SHMultiply(inout SHVectorRGB lhs, float rhs)
  84. {
  85. SHMultiply(lhs.R, rhs);
  86. SHMultiply(lhs.G, rhs);
  87. SHMultiply(lhs.B, rhs);
  88. }
  89. #if SH_ORDER == 5
  90. SHVector SHBasis(float3 dir)
  91. {
  92. float x = dir.x;
  93. float y = dir.y;
  94. float z = dir.z;
  95. float x2 = x*x;
  96. float y2 = y*y;
  97. float z2 = z*z;
  98. float z3 = z2 * z;
  99. float x4 = x2 * x2;
  100. float y4 = y2 * y2;
  101. float z4 = z2 * z2;
  102. SHVector o;
  103. o.v[0] = 0.282095f;
  104. o.v[1] = -0.488603f * y;
  105. o.v[2] = 0.488603f * z;
  106. o.v[3] = -0.488603f * x;
  107. o.v[4] = 1.092548f * x * y;
  108. o.v[5] = -1.092548f * y * z;
  109. o.v[6] = 0.315392f * (3.0f * z2 - 1.0f);
  110. o.v[7] = -1.092548f * x * z;
  111. o.v[8] = 0.546274f * (x2 - y2);
  112. o.v[9] = -0.590043f * y * (3.0f * x2 - y2);
  113. o.v[10] = 2.890611f * y * x * z;
  114. o.v[11] = -0.646360f * y * (-1.0f + 5.0f * z2);
  115. o.v[12] = 0.373176f *(5.0f * z3 - 3.0f * z);
  116. o.v[13] = -0.457045f * x * (-1.0f + 5.0f * z2);
  117. o.v[14] = 1.445306f *(x2 - y2) * z;
  118. o.v[15] = -0.590043f * x * (x2 - 3.0f * y2);
  119. o.v[16] = 2.503340f * x * y * (x2 - y2);
  120. o.v[17] = -1.770130f * y * z * (3.0f * x2 - y2);
  121. o.v[18] = 0.946175f * y * x * (-1.0f + 7.0f * z2);
  122. o.v[19] = -0.669046f * y * z * (-3.0f + 7.0f * z2);
  123. o.v[20] = (105.0f * z4 - 90.0f * z2 + 9.0f) / 28.359261f;
  124. o.v[21] = -0.669046f * x * z * (-3.0f + 7.0f * z2);
  125. o.v[22] = 0.473087f * (x2 - y2) * (-1.0f + 7.0f * z2);
  126. o.v[23] = -1.770130f * x * z * (x2 - 3.0f * y2);
  127. o.v[24] = 0.625836f * (x4 - 6.0f * y2 * x2 + y4);
  128. return o;
  129. }
  130. #elif SH_ORDER == 3
  131. SHVector SHBasis(float3 dir)
  132. {
  133. float x = dir.x;
  134. float y = dir.y;
  135. float z = dir.z;
  136. float x2 = x*x;
  137. float y2 = y*y;
  138. float z2 = z*z;
  139. SHVector o;
  140. o.v[0] = 0.282095f;
  141. o.v[1] = -0.488603f * y;
  142. o.v[2] = 0.488603f * z;
  143. o.v[3] = -0.488603f * x;
  144. o.v[4] = 1.092548f * x * y;
  145. o.v[5] = -1.092548f * y * z;
  146. o.v[6] = 0.315392f * (3.0f * z2 - 1.0f);
  147. o.v[7] = -1.092548f * x * z;
  148. o.v[8] = 0.546274f * (x2 - y2);
  149. return o;
  150. }
  151. #endif
  152. };
  153. };