Advertisement
Guest User

KrigBilateral-new-pre.glsl

a guest
Aug 10th, 2019
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.57 KB | None | 0 0
  1. // KrigBilateral by Shiandow
  2. //
  3. // This library is free software; you can redistribute it and/or
  4. // modify it under the terms of the GNU Lesser General Public
  5. // License as published by the Free Software Foundation; either
  6. // version 3.0 of the License, or (at your option) any later version.
  7. //
  8. // This library is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. // Lesser General Public License for more details.
  12. //
  13. // You should have received a copy of the GNU Lesser General Public
  14. // License along with this library.
  15.  
  16. //!HOOK CHROMA
  17. //!BIND HOOKED
  18. //!BIND LUMA
  19. //!SAVE LOWRES_Y
  20. //!WIDTH LUMA.w
  21. //!WHEN CHROMA.w 2.8 * LUMA.w <
  22. //!DESC KrigBilateral-pre Downscaling Y pass 1
  23.  
  24. #define lumaOffset (-vec2(0.0, 0.0)*LUMA_size*CHROMA_pt)
  25.  
  26. #define axis 1
  27.  
  28. #define Kernel(x) (1. - abs(x))
  29.  
  30. vec4 hook() {
  31. // Calculate bounds
  32. float low = ceil((LUMA_pos - 0.5*CHROMA_pt) * LUMA_size - lumaOffset - 0.5)[axis];
  33. float high = floor((LUMA_pos + 0.5*CHROMA_pt) * LUMA_size - lumaOffset - 0.5)[axis];
  34.  
  35. float W = 0.0;
  36. vec4 avg = vec4(0);
  37. vec2 pos = LUMA_pos;
  38.  
  39. for (float k = low; k <= high; k++) {
  40. pos[axis] = LUMA_pt[axis] * (k - lumaOffset[axis] + 0.5);
  41. float rel = (pos[axis] - LUMA_pos[axis])*CHROMA_size[axis];
  42. float w = Kernel(rel);
  43.  
  44. vec4 y = textureLod(LUMA_raw, pos, 0.0).xxxx * LUMA_mul;
  45. y.y *= y.y;
  46. avg += w * y;
  47. W += w;
  48. }
  49. avg /= W;
  50. avg.y = abs(avg.y - pow(avg.x, 2.0));
  51. return avg;
  52. }
  53.  
  54. //!HOOK CHROMA
  55. //!BIND HOOKED
  56. //!BIND LOWRES_Y
  57. //!SAVE LOWRES_Y
  58. //!WHEN CHROMA.w 2.8 * LUMA.w <
  59. //!DESC KrigBilateral-pre Downscaling Y pass 2
  60.  
  61. #define lumaOffset (-vec2(0.0, 0.0)*LOWRES_Y_size*CHROMA_pt)
  62.  
  63. #define axis 0
  64.  
  65. #define Kernel(x) (1. - abs(x))
  66.  
  67. vec4 hook() {
  68. // Calculate bounds
  69. float low = ceil((LOWRES_Y_pos - 0.5*CHROMA_pt) * LOWRES_Y_size - lumaOffset - 0.5)[axis];
  70. float high = floor((LOWRES_Y_pos + 0.5*CHROMA_pt) * LOWRES_Y_size - lumaOffset - 0.5)[axis];
  71.  
  72. float W = 0.0;
  73. vec4 avg = vec4(0);
  74. vec2 pos = LOWRES_Y_pos;
  75.  
  76. for (float k = low; k <= high; k++) {
  77. pos[axis] = LOWRES_Y_pt[axis] * (k - lumaOffset[axis] + 0.5);
  78. float rel = (pos[axis] - LOWRES_Y_pos[axis])*CHROMA_size[axis];
  79. float w = Kernel(rel);
  80.  
  81. vec4 y = textureLod(LOWRES_Y_raw, pos, 0.0).xxxx * LOWRES_Y_mul;
  82. y.y *= y.y;
  83. avg += w * y;
  84. W += w;
  85. }
  86. avg /= W;
  87. avg.y = abs(avg.y - pow(avg.x, 2.0)) + LOWRES_Y_texOff(0).y;
  88. return avg;
  89. }
  90.  
  91. //!HOOK CHROMA
  92. //!BIND HOOKED
  93. //!BIND LUMA
  94. //!BIND LOWRES_Y
  95. //!WIDTH LUMA.w
  96. //!HEIGHT LUMA.h
  97. //!WHEN CHROMA.w 2.8 * LUMA.w <
  98. //!OFFSET -1 0
  99. //!DESC KrigBilateral-pre Upscaling UV
  100.  
  101. // -- Convenience --
  102. #define sqr(x) dot(x,x)
  103. #define bitnoise 1.0/(2.0*255.0)
  104. #define noise 0.05//5.0*bitnoise
  105. #define chromaOffset vec2(0.0, 0.0)
  106.  
  107. // -- Window Size --
  108. #define taps 3
  109. #define even (float(taps) - 2.0 * floor(float(taps) / 2.0) == 0.0)
  110. #define minX int(1.0-ceil(float(taps)/2.0))
  111. #define maxX int(floor(float(taps)/2.0))
  112.  
  113. #define Kernel(x) (cos(acos(-1.0)*(x)/float(taps))) // Hann kernel
  114.  
  115. // -- Input processing --
  116. #define GetY(coord) LOWRES_Y_tex(LOWRES_Y_pt*(pos+coord+vec2(0.5))).xy
  117. #define GetUV(coord) CHROMA_tex(CHROMA_pt*(pos+coord+vec2(0.5))).xy
  118.  
  119. #define N (taps*taps - 1)
  120.  
  121. #define M(i,j) Mx[min(i,j)*N + max(i,j) - min(i,j)*(min(i,j)+1)/2]
  122.  
  123. #define C(i,j) (inversesqrt(1.0 + (X[i].y + X[j].y)/localVar) * exp(-0.5*(sqr(X[i].x - X[j].x)/(localVar + X[i].y + X[j].y) + sqr((coords[i] - coords[j])/radius))) + (X[i].x - y) * (X[j].x - y) / localVar)
  124. #define c(i) (inversesqrt(1.0 + X[i].y/localVar) * exp(-0.5*(sqr(X[i].x - y)/(localVar + X[i].y) + sqr((coords[i] - offset)/radius))))
  125.  
  126. vec4 hook() {
  127. vec2 pos = CHROMA_pos * HOOKED_size - chromaOffset - vec2(0.5);
  128. vec2 offset = pos - (even ? floor(pos) : round(pos));
  129. pos -= offset;
  130.  
  131. vec2 coords[N+1];
  132. vec4 X[N+1];
  133. float y = LUMA_texOff(0).x;
  134. vec4 total = vec4(0);
  135.  
  136. coords[0] = vec2(-1,-1); coords[1] = vec2(-1, 0); coords[2] = vec2(-1, 1);
  137. coords[3] = vec2( 0,-1); coords[4] = vec2( 0, 1); coords[5] = vec2( 1,-1);
  138. coords[6] = vec2( 1, 0); coords[7] = vec2( 1, 1); coords[8] = vec2( 0, 0);
  139.  
  140. for (int i=0; i<N+1; i++) {
  141. X[i] = vec4(GetY(coords[i]), GetUV(coords[i]));
  142. vec2 w = clamp(1.5 - abs(coords[i] - offset), 0.0, 1.0);
  143. total += w.x*w.y*vec4(X[i].x, pow(X[i].x, 2.0), X[i].y, 1.0);
  144. }
  145. total.xyz /= total.w;
  146. float localVar = sqr(noise) + abs(total.y - pow(total.x, 2.0)) + total.z;
  147. float radius = 1.0;
  148.  
  149. float Mx[N*(N+1)/2];
  150. float b[N];
  151. vec4 interp = X[N];
  152.  
  153. b[0] = c(0) - c(N) - C(0,N) + C(N,N); M(0, 0) = C(0,0) - C(0,N) - C(0,N) + C(N,N); M(0, 1) = C(0,1) - C(1,N) - C(0,N) + C(N,N); M(0, 2) = C(0,2) - C(2,N) - C(0,N) + C(N,N); M(0, 3) = C(0,3) - C(3,N) - C(0,N) + C(N,N); M(0, 4) = C(0,4) - C(4,N) - C(0,N) + C(N,N); M(0, 5) = C(0,5) - C(5,N) - C(0,N) + C(N,N); M(0, 6) = C(0,6) - C(6,N) - C(0,N) + C(N,N); M(0, 7) = C(0,7) - C(7,N) - C(0,N) + C(N,N);
  154. b[1] = c(1) - c(N) - C(1,N) + C(N,N); M(1, 1) = C(1,1) - C(1,N) - C(1,N) + C(N,N); M(1, 2) = C(1,2) - C(2,N) - C(1,N) + C(N,N); M(1, 3) = C(1,3) - C(3,N) - C(1,N) + C(N,N); M(1, 4) = C(1,4) - C(4,N) - C(1,N) + C(N,N); M(1, 5) = C(1,5) - C(5,N) - C(1,N) + C(N,N); M(1, 6) = C(1,6) - C(6,N) - C(1,N) + C(N,N); M(1, 7) = C(1,7) - C(7,N) - C(1,N) + C(N,N);
  155. b[2] = c(2) - c(N) - C(2,N) + C(N,N); M(2, 2) = C(2,2) - C(2,N) - C(2,N) + C(N,N); M(2, 3) = C(2,3) - C(3,N) - C(2,N) + C(N,N); M(2, 4) = C(2,4) - C(4,N) - C(2,N) + C(N,N); M(2, 5) = C(2,5) - C(5,N) - C(2,N) + C(N,N); M(2, 6) = C(2,6) - C(6,N) - C(2,N) + C(N,N); M(2, 7) = C(2,7) - C(7,N) - C(2,N) + C(N,N);
  156. b[3] = c(3) - c(N) - C(3,N) + C(N,N); M(3, 3) = C(3,3) - C(3,N) - C(3,N) + C(N,N); M(3, 4) = C(3,4) - C(4,N) - C(3,N) + C(N,N); M(3, 5) = C(3,5) - C(5,N) - C(3,N) + C(N,N); M(3, 6) = C(3,6) - C(6,N) - C(3,N) + C(N,N); M(3, 7) = C(3,7) - C(7,N) - C(3,N) + C(N,N);
  157. b[4] = c(4) - c(N) - C(4,N) + C(N,N); M(4, 4) = C(4,4) - C(4,N) - C(4,N) + C(N,N); M(4, 5) = C(4,5) - C(5,N) - C(4,N) + C(N,N); M(4, 6) = C(4,6) - C(6,N) - C(4,N) + C(N,N); M(4, 7) = C(4,7) - C(7,N) - C(4,N) + C(N,N);
  158. b[5] = c(5) - c(N) - C(5,N) + C(N,N); M(5, 5) = C(5,5) - C(5,N) - C(5,N) + C(N,N); M(5, 6) = C(5,6) - C(6,N) - C(5,N) + C(N,N); M(5, 7) = C(5,7) - C(7,N) - C(5,N) + C(N,N);
  159. b[6] = c(6) - c(N) - C(6,N) + C(N,N); M(6, 6) = C(6,6) - C(6,N) - C(6,N) + C(N,N); M(6, 7) = C(6,7) - C(7,N) - C(6,N) + C(N,N);
  160. b[7] = c(7) - c(N) - C(7,N) + C(N,N); M(7, 7) = C(7,7) - C(7,N) - C(7,N) + C(N,N);
  161.  
  162. b[1] -= b[0] * M(1, 0) / M(0, 0); M(1, 1) -= M(0, 1) * M(1, 0) / M(0, 0); M(1, 2) -= M(0, 2) * M(1, 0) / M(0, 0); M(1, 3) -= M(0, 3) * M(1, 0) / M(0, 0); M(1, 4) -= M(0, 4) * M(1, 0) / M(0, 0); M(1, 5) -= M(0, 5) * M(1, 0) / M(0, 0); M(1, 6) -= M(0, 6) * M(1, 0) / M(0, 0); M(1, 7) -= M(0, 7) * M(1, 0) / M(0, 0);
  163. b[2] -= b[0] * M(2, 0) / M(0, 0); M(2, 2) -= M(0, 2) * M(2, 0) / M(0, 0); M(2, 3) -= M(0, 3) * M(2, 0) / M(0, 0); M(2, 4) -= M(0, 4) * M(2, 0) / M(0, 0); M(2, 5) -= M(0, 5) * M(2, 0) / M(0, 0); M(2, 6) -= M(0, 6) * M(2, 0) / M(0, 0); M(2, 7) -= M(0, 7) * M(2, 0) / M(0, 0);
  164. b[3] -= b[0] * M(3, 0) / M(0, 0); M(3, 3) -= M(0, 3) * M(3, 0) / M(0, 0); M(3, 4) -= M(0, 4) * M(3, 0) / M(0, 0); M(3, 5) -= M(0, 5) * M(3, 0) / M(0, 0); M(3, 6) -= M(0, 6) * M(3, 0) / M(0, 0); M(3, 7) -= M(0, 7) * M(3, 0) / M(0, 0);
  165. b[4] -= b[0] * M(4, 0) / M(0, 0); M(4, 4) -= M(0, 4) * M(4, 0) / M(0, 0); M(4, 5) -= M(0, 5) * M(4, 0) / M(0, 0); M(4, 6) -= M(0, 6) * M(4, 0) / M(0, 0); M(4, 7) -= M(0, 7) * M(4, 0) / M(0, 0);
  166. b[5] -= b[0] * M(5, 0) / M(0, 0); M(5, 5) -= M(0, 5) * M(5, 0) / M(0, 0); M(5, 6) -= M(0, 6) * M(5, 0) / M(0, 0); M(5, 7) -= M(0, 7) * M(5, 0) / M(0, 0);
  167. b[6] -= b[0] * M(6, 0) / M(0, 0); M(6, 6) -= M(0, 6) * M(6, 0) / M(0, 0); M(6, 7) -= M(0, 7) * M(6, 0) / M(0, 0);
  168. b[7] -= b[0] * M(7, 0) / M(0, 0); M(7, 7) -= M(0, 7) * M(7, 0) / M(0, 0);
  169.  
  170. b[2] -= b[1] * M(2, 1) / M(1, 1); M(2, 2) -= M(1, 2) * M(2, 1) / M(1, 1); M(2, 3) -= M(1, 3) * M(2, 1) / M(1, 1); M(2, 4) -= M(1, 4) * M(2, 1) / M(1, 1); M(2, 5) -= M(1, 5) * M(2, 1) / M(1, 1); M(2, 6) -= M(1, 6) * M(2, 1) / M(1, 1); M(2, 7) -= M(1, 7) * M(2, 1) / M(1, 1);
  171. b[3] -= b[1] * M(3, 1) / M(1, 1); M(3, 3) -= M(1, 3) * M(3, 1) / M(1, 1); M(3, 4) -= M(1, 4) * M(3, 1) / M(1, 1); M(3, 5) -= M(1, 5) * M(3, 1) / M(1, 1); M(3, 6) -= M(1, 6) * M(3, 1) / M(1, 1); M(3, 7) -= M(1, 7) * M(3, 1) / M(1, 1);
  172. b[4] -= b[1] * M(4, 1) / M(1, 1); M(4, 4) -= M(1, 4) * M(4, 1) / M(1, 1); M(4, 5) -= M(1, 5) * M(4, 1) / M(1, 1); M(4, 6) -= M(1, 6) * M(4, 1) / M(1, 1); M(4, 7) -= M(1, 7) * M(4, 1) / M(1, 1);
  173. b[5] -= b[1] * M(5, 1) / M(1, 1); M(5, 5) -= M(1, 5) * M(5, 1) / M(1, 1); M(5, 6) -= M(1, 6) * M(5, 1) / M(1, 1); M(5, 7) -= M(1, 7) * M(5, 1) / M(1, 1);
  174. b[6] -= b[1] * M(6, 1) / M(1, 1); M(6, 6) -= M(1, 6) * M(6, 1) / M(1, 1); M(6, 7) -= M(1, 7) * M(6, 1) / M(1, 1);
  175. b[7] -= b[1] * M(7, 1) / M(1, 1); M(7, 7) -= M(1, 7) * M(7, 1) / M(1, 1);
  176.  
  177. b[3] -= b[2] * M(3, 2) / M(2, 2); M(3, 3) -= M(2, 3) * M(3, 2) / M(2, 2); M(3, 4) -= M(2, 4) * M(3, 2) / M(2, 2); M(3, 5) -= M(2, 5) * M(3, 2) / M(2, 2); M(3, 6) -= M(2, 6) * M(3, 2) / M(2, 2); M(3, 7) -= M(2, 7) * M(3, 2) / M(2, 2);
  178. b[4] -= b[2] * M(4, 2) / M(2, 2); M(4, 4) -= M(2, 4) * M(4, 2) / M(2, 2); M(4, 5) -= M(2, 5) * M(4, 2) / M(2, 2); M(4, 6) -= M(2, 6) * M(4, 2) / M(2, 2); M(4, 7) -= M(2, 7) * M(4, 2) / M(2, 2);
  179. b[5] -= b[2] * M(5, 2) / M(2, 2); M(5, 5) -= M(2, 5) * M(5, 2) / M(2, 2); M(5, 6) -= M(2, 6) * M(5, 2) / M(2, 2); M(5, 7) -= M(2, 7) * M(5, 2) / M(2, 2);
  180. b[6] -= b[2] * M(6, 2) / M(2, 2); M(6, 6) -= M(2, 6) * M(6, 2) / M(2, 2); M(6, 7) -= M(2, 7) * M(6, 2) / M(2, 2);
  181. b[7] -= b[2] * M(7, 2) / M(2, 2); M(7, 7) -= M(2, 7) * M(7, 2) / M(2, 2);
  182.  
  183. b[4] -= b[3] * M(4, 3) / M(3, 3); M(4, 4) -= M(3, 4) * M(4, 3) / M(3, 3); M(4, 5) -= M(3, 5) * M(4, 3) / M(3, 3); M(4, 6) -= M(3, 6) * M(4, 3) / M(3, 3); M(4, 7) -= M(3, 7) * M(4, 3) / M(3, 3);
  184. b[5] -= b[3] * M(5, 3) / M(3, 3); M(5, 5) -= M(3, 5) * M(5, 3) / M(3, 3); M(5, 6) -= M(3, 6) * M(5, 3) / M(3, 3); M(5, 7) -= M(3, 7) * M(5, 3) / M(3, 3);
  185. b[6] -= b[3] * M(6, 3) / M(3, 3); M(6, 6) -= M(3, 6) * M(6, 3) / M(3, 3); M(6, 7) -= M(3, 7) * M(6, 3) / M(3, 3);
  186. b[7] -= b[3] * M(7, 3) / M(3, 3); M(7, 7) -= M(3, 7) * M(7, 3) / M(3, 3);
  187.  
  188. b[5] -= b[4] * M(5, 4) / M(4, 4); M(5, 5) -= M(4, 5) * M(5, 4) / M(4, 4); M(5, 6) -= M(4, 6) * M(5, 4) / M(4, 4); M(5, 7) -= M(4, 7) * M(5, 4) / M(4, 4);
  189. b[6] -= b[4] * M(6, 4) / M(4, 4); M(6, 6) -= M(4, 6) * M(6, 4) / M(4, 4); M(6, 7) -= M(4, 7) * M(6, 4) / M(4, 4);
  190. b[7] -= b[4] * M(7, 4) / M(4, 4); M(7, 7) -= M(4, 7) * M(7, 4) / M(4, 4);
  191.  
  192. b[6] -= b[5] * M(6, 5) / M(5, 5); M(6, 6) -= M(5, 6) * M(6, 5) / M(5, 5); M(6, 7) -= M(5, 7) * M(6, 5) / M(5, 5);
  193. b[7] -= b[5] * M(7, 5) / M(5, 5); M(7, 7) -= M(5, 7) * M(7, 5) / M(5, 5);
  194.  
  195. b[7] -= b[6] * M(7, 6) / M(6, 6); M(7, 7) -= M(6, 7) * M(7, 6) / M(6, 6);
  196.  
  197. for (int i=0; i<N; i++) {
  198. if(i > 6) b[N-1-i] -= M(N-1-i, 1) * b[1];
  199. if(i > 5) b[N-1-i] -= M(N-1-i, 2) * b[2];
  200. if(i > 4) b[N-1-i] -= M(N-1-i, 3) * b[3];
  201. if(i > 3) b[N-1-i] -= M(N-1-i, 4) * b[4];
  202. if(i > 2) b[N-1-i] -= M(N-1-i, 5) * b[5];
  203. if(i > 1) b[N-1-i] -= M(N-1-i, 6) * b[6];
  204. if(i > 0) b[N-1-i] -= M(N-1-i, 7) * b[7];
  205.  
  206. b[N-1-i] /= M(N-1-i, N-1-i);
  207. interp += b[N-1-i] * (X[N-1-i] - X[N]);
  208. }
  209.  
  210. return interp.zwxx;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement