particle_cube_audio.shader 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. shader_type spatial;
  2. render_mode blend_add,depth_draw_never,cull_back,unshaded;
  3. uniform float iTime=0.;
  4. uniform sampler2D iChannel0;
  5. varying float ti;
  6. varying float tj;
  7. varying float tz;
  8. varying float tw;
  9. vec4 get_acol(vec2 p)
  10. {
  11. p.x+=0.15+0.15*cos(iTime*0.35);
  12. p=clamp(p,0.,1.);
  13. p=p.yx;
  14. p.y=1.-p.y;
  15. float fft = texture( iChannel0, vec2(p.x,0.0) ).x;
  16. vec3 color = mix(vec3(0.0, 2.0, 0.0), vec3(2.0, 0.0, 0.0), sqrt(p.y));
  17. float mask = (p.y < fft) ? 1.0 : 0.0;
  18. vec3 ledColor = color*mask;
  19. return vec4(ledColor, 1.);
  20. }
  21. float rand(float p)
  22. {
  23. vec3 p3 = fract(vec3(p) * 3.10432);
  24. p3 += dot(p3, p3.yzx + 15.19);
  25. return fract((p3.x + p3.y) * p3.z);
  26. }
  27. vec3 get_color(vec3 col,vec3 tcol, float ttimer, inout float ttw){
  28. float tvx=smoothstep(0.,6.,ttimer);
  29. float tvx2=smoothstep(3.,10.,ttimer);
  30. float tvx3=1.-smoothstep(3.,8.,ttimer);
  31. float tvy=1.-smoothstep(5.,10.,ttimer);
  32. float vx=0.;
  33. float vx2=0.;
  34. vx2=smoothstep(6.+25.*tvx-10.-5.*tvx3,7.+25.*tvx-10.,tz)*(1.-smoothstep(7.+25.*tvx-10.,8.+25.*tvx-10.,tz));
  35. vx=smoothstep(0.+25.*tvx2-5.,7.+25.*tvx2-5.,tz)*(1.-smoothstep(7.+25.*tvx-10.,8.+25.*tvx-10.,tz));
  36. float tva=smoothstep(-.5,7.,tz)*(1.-smoothstep(7.,19.5,tz));
  37. tva=tva*(1.-tvx*tvy);
  38. tcol*=01.*vx+0.95*tva;
  39. ttw=max(1.-tva,ttw);
  40. col=((0.+5.*vx+14.*vx2)*col+8.*tcol*(1.-vx*vx2));
  41. return col;
  42. }
  43. // how it work: lighting hapens in 2d-UV space, vertex coordinates calculated in fake-view-projection logic
  44. // rotationfixed to be face-camera, to see bilboard mode uncomment mtx= line in VERTEX function
  45. vec3 my_normalize3(vec3 v){
  46. float len = length(v);
  47. vec3 ret=vec3(0.);
  48. if(len==0.0)ret= vec3(1.0,0.0,0.0);
  49. else ret= v/len;
  50. return ret;
  51. }
  52. mat4 lookAt(vec3 from, vec3 to, vec3 tup )
  53. {
  54. vec3 forward = my_normalize3(from - to);
  55. if(length(forward.xz)<=0.001)forward.x=0.001;
  56. vec3 right = cross(normalize(tup), forward);
  57. right = my_normalize3(right);
  58. vec3 up = cross(forward, right);
  59. mat4 camToWorld=mat4(1.);
  60. camToWorld[0][0] = right.x;
  61. camToWorld[0][1] = right.y;
  62. camToWorld[0][2] = right.z;
  63. camToWorld[1][0] = up.x;
  64. camToWorld[1][1] = up.y;
  65. camToWorld[1][2] = up.z;
  66. camToWorld[2][0] = forward.x;
  67. camToWorld[2][1] = forward.y;
  68. camToWorld[2][2] = forward.z;
  69. camToWorld[3][0] = from.x;
  70. camToWorld[3][1] = from.y;
  71. camToWorld[3][2] = from.z;
  72. return camToWorld;
  73. }
  74. varying mat4 mtx;
  75. void vertex() {
  76. // bilboard project
  77. //mtx = mat4(normalize(CAMERA_MATRIX[0])*length(WORLD_MATRIX[0]),normalize(CAMERA_MATRIX[1])*length(WORLD_MATRIX[0]),normalize(CAMERA_MATRIX[2])*length(WORLD_MATRIX[2]),WORLD_MATRIX[3]);
  78. // lookAt project, comment/uncomment
  79. vec3 cam_pos = CAMERA_MATRIX[3].xyz;
  80. mtx=lookAt(cam_pos,WORLD_MATRIX[3].xyz,vec3(0.,1.,0.));
  81. mtx[3].xyz=WORLD_MATRIX[3].xyz;
  82. MODELVIEW_MATRIX=INV_CAMERA_MATRIX*mtx;
  83. tz=INSTANCE_CUSTOM.w;
  84. ti=float(INSTANCE_ID%15);
  85. tj=float(INSTANCE_ID/15);
  86. float ttw=0.;
  87. COLOR=vec4(get_color(vec3(0.11,0.21,0.91),vec3(0.9,0.11,0.1),min(mod(iTime,20.),12.),ttw),1.);
  88. COLOR=max(COLOR,vec4(get_color(vec3(0.81,0.41,0.01),vec3(0.9,0.01,0.01),mod(iTime*2.+rand(tj)*12.,12.),ttw),1.));
  89. COLOR.rgb+=4.*COLOR.rgb*get_acol(vec2(ti,tj)/vec2(15.,10.)).rgb;
  90. tw=ttw;
  91. }
  92. float line( vec2 a, vec2 b, vec2 p , float ji, float js)
  93. {
  94. float jitterIntensity = 0.00251*ji;
  95. float jitter = rand(sin(iTime*0.672)+js) * jitterIntensity;
  96. vec2 aTob = b - a;
  97. vec2 aTop = p - a;
  98. float t = dot( aTop, aTob ) / dot( aTob, aTob);
  99. t = clamp( t, 0.0, 1.0);
  100. float d = length( p - (a + aTob * t) );
  101. d = (0.065+jitter-0.056*tw) / max(d,0.001);
  102. d = pow(d, 7.0);
  103. return clamp( d, 0., 1.0 );
  104. }
  105. mat4 perspectiveMatrix(float fovYInRad, float aspectRatio)
  106. {
  107. float yScale = 1.0/tan(fovYInRad / 2.0);
  108. float xScale = yScale / aspectRatio;
  109. float zf = 100.0;
  110. float zn = 0.3;
  111. float z1 = zf/(zf-zn);
  112. float z2 = -zn*zf/(zf-zn);
  113. mat4 result = mat4(vec4(xScale, 0.0, 0.0, 0.0),
  114. vec4(0.0, yScale, 0.0, 0.0),
  115. vec4(0.0, 0.0, z1, z2),
  116. vec4(0.0, 0.0, -1.0, 0.0));
  117. return result;
  118. }
  119. mat4 translationMatrix(vec3 pos)
  120. {
  121. mat4 result =
  122. mat4(vec4(1.0, 0.0, 0.0, 0.0),
  123. vec4(0.0, 1.0, 0.0, 0.0),
  124. vec4(0.0, 0.0, 1.0, 0.0),
  125. vec4(pos.x, pos.y, pos.z, 1.0));
  126. return result;
  127. }
  128. mat4 rotX(float theta)
  129. {
  130. float cs = cos(theta);
  131. float ss = sin(theta);
  132. mat4 result =
  133. mat4(vec4(1.0, 0.0, 0.0, 0.0),
  134. vec4(0.0, cs, -ss, 0.0),
  135. vec4(0.0, ss, cs, 0.0),
  136. vec4(0.0, 0.0, 0.0, 1.0));
  137. return result;
  138. }
  139. mat4 rotY(float theta)
  140. {
  141. float cs = cos(theta);
  142. float ss = sin(theta);
  143. mat4 result =
  144. mat4(vec4(cs, 0.0, -ss, 0.0),
  145. vec4(0.0, 1.0, 0.0, 0.0),
  146. vec4(ss, 0.0, cs, 0.0),
  147. vec4(0.0, 0.0, 0.0, 1.0));
  148. return result;
  149. }
  150. void process_verts( out vec4 fragColor, in vec2 p,vec3 vtx, vec3 icol)
  151. {
  152. vec2 uv = p * 2.0 - 1.0;
  153. vec2 ouv=uv;
  154. uv.y=-uv.y;
  155. vec3 ccol=clamp(icol,0.,1.);
  156. uv *= 5.0;
  157. const float fovYInRad = (45.0/180.0) * 3.14159;
  158. const float vs = 10.0;
  159. vec4 verts [16];
  160. verts[0] = vec4( -vs, -vs, vs, 1.0 );
  161. verts[1] = vec4( -vs, vs, vs, 1.0 );
  162. verts[2] = vec4( vs, vs, vs, 1.0 );
  163. verts[3] = vec4( vs, -vs, vs, 1.0 );
  164. verts[4] = vec4( -vs, -vs, vs, 1.0 );
  165. verts[5] = vec4( -vs, vs, vs, 1.0 );
  166. verts[6] = vec4( -vs, vs, -vs, 1.0 );
  167. verts[7] = vec4( -vs, -vs, -vs, 1.0 );
  168. verts[8] = vec4( -vs, -vs, -vs, 1.0 );
  169. verts[9] = vec4( -vs, vs, -vs, 1.0 );
  170. verts[10] = vec4( vs, vs, -vs, 1.0 );
  171. verts[11] = vec4( vs, -vs, -vs, 1.0 );
  172. verts[12] = vec4( vs, -vs, vs, 1.0 );
  173. verts[13] = vec4( vs, vs, vs, 1.0 );
  174. verts[14] = vec4( vs, vs, -vs, 1.0 );
  175. verts[15] = vec4( vs, -vs, -vs, 1.0 );
  176. float moveX=0.;
  177. float moveY=0.;
  178. float moveZ=60.;
  179. vec3 pos = vec3( moveX, moveY, moveZ);
  180. //pos=pos-vtx*5.; //bad perspective fix
  181. //mat4 rotY = rotY(tj*0.51) * rotX(0.);
  182. mat4 tmtx=mtx;
  183. tmtx[3].xyz=vec3(0.);
  184. mat4 worldMat = translationMatrix(pos) *inverse(tmtx);//* rotY ;
  185. mat4 perspective = perspectiveMatrix(fovYInRad, 1.);
  186. mat4 mvp = perspective * worldMat;
  187. float t = 0.0;
  188. for(int i = 0; i < 16; ++i)
  189. {
  190. vec4 startWorldVert = mvp * verts[i];
  191. vec4 endWorldVert;
  192. if( i+1 < 16)
  193. {
  194. endWorldVert = mvp * verts[i + 1];
  195. }
  196. else
  197. {
  198. endWorldVert = mvp * verts[i - 3];
  199. }
  200. if(i != 0 && mod(float(i+1), 4.0) == 0.0)
  201. {
  202. endWorldVert = mvp * verts[i - 3];
  203. }
  204. if((startWorldVert.w<=-1.001)&&(endWorldVert.w<=-1.001)){
  205. vec2 sp = startWorldVert.xy / startWorldVert.w;
  206. vec2 ep = endWorldVert.xy / endWorldVert.w;
  207. t += line(sp, ep, uv, 1.-ccol.r*(1.-ccol.g)*(1.-ccol.b), .75*dot(ccol,vec3(1.))*3.);
  208. }
  209. }
  210. vec3 fc = vec3( 0.0 );
  211. fc += icol* pow(t, 0.2);
  212. fc*=1.-dot(ouv*0.5,ouv*0.5);
  213. fc*=1.-smoothstep(0.7,1.,length(ouv));
  214. fragColor = vec4( fc, 1.0 );
  215. }
  216. void fragment() {
  217. vec4 col=vec4(0.);
  218. process_verts(col,UV,VERTEX, COLOR.rgb);
  219. vec3 cam_pos = CAMERA_MATRIX[3].xyz;
  220. float fade_distance=length(mtx[3].xyz-cam_pos);
  221. float fade=clamp(smoothstep(0.25,1.,fade_distance),0.0,1.0);
  222. ALBEDO = col.rgb*fade;
  223. }