CloudTen.fp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. //Cloud Ten
  2. //by nimitz 2015 (twitter: @stormoid)
  3. //License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
  4. // Contact the author for other licensing options
  5. // https://www.shadertoy.com/view/XtS3DD
  6. #define time iTime
  7. mat2 mm2(in float a){float c = cos(a), s = sin(a);return mat2(c,s,-s,c);}
  8. float noise(float t){return textureLod(iChannel0,vec2(t,.0)/iChannelResolution[0].xy,0.0).x;}
  9. float moy = 0.;
  10. float noise(in vec3 p)
  11. {
  12. vec3 ip = floor(p);
  13. vec3 fp = fract(p);
  14. fp = fp*fp*(3.0-2.0*fp);
  15. vec2 tap = (ip.xy+vec2(37.0,17.0)*ip.z) + fp.xy;
  16. vec2 rz = textureLod( iChannel0, (tap+0.5)/256.0, 0.0 ).yx;
  17. return mix( rz.x, rz.y, fp.z );
  18. }
  19. float fbm(in vec3 x)
  20. {
  21. float rz = 0.;
  22. float a = .35;
  23. for (int i = 0; i<2; i++)
  24. {
  25. rz += noise(x)*a;
  26. a*=.35;
  27. x*= 4.;
  28. }
  29. return rz;
  30. }
  31. float path(in float x){ return sin(x*0.01-3.1415)*28.+6.5; }
  32. float map(vec3 p){
  33. return p.y*0.07 + (fbm(p*0.3)-0.1) + sin(p.x*0.24 + sin(p.z*.01)*7.)*0.22+0.15 + sin(p.z*0.08)*0.05;
  34. }
  35. float march(in vec3 ro, in vec3 rd)
  36. {
  37. float precis = .3;
  38. float h= 1.;
  39. float d = 0.;
  40. for( int i=0; i<17; i++ )
  41. {
  42. if( abs(h)<precis || d>70. ) break;
  43. d += h;
  44. vec3 pos = ro+rd*d;
  45. pos.y += .5;
  46. float res = map(pos)*7.;
  47. h = res;
  48. }
  49. return d;
  50. }
  51. vec3 lgt = vec3(0);
  52. float mapV( vec3 p ){ return clamp(-map(p), 0., 1.);}
  53. vec4 marchV(in vec3 ro, in vec3 rd, in float t, in vec3 bgc)
  54. {
  55. vec4 rz = vec4( 0.0 );
  56. for( int i=0; i<150; i++ )
  57. {
  58. if(rz.a > 0.99 || t > 200.) break;
  59. vec3 pos = ro + t*rd;
  60. float den = mapV(pos);
  61. vec4 col = vec4(mix( vec3(.8,.75,.85), vec3(.0), den ),den);
  62. col.xyz *= mix(bgc*bgc*2.5, mix(vec3(0.1,0.2,0.55),vec3(.8,.85,.9),moy*0.4), clamp( -(den*40.+0.)*pos.y*.03-moy*0.5, 0., 1. ) );
  63. col.rgb += clamp((1.-den*6.) + pos.y*0.13 +.55, 0., 1.)*0.35*mix(bgc,vec3(1),0.7); //Fringes
  64. col += clamp(den*pos.y*.15, -.02, .0); //Depth occlusion
  65. col *= smoothstep(0.2+moy*0.05,.0,mapV(pos+1.*lgt))*.85+0.15; //Shadows
  66. col.a *= .95;
  67. col.rgb *= col.a;
  68. rz = rz + col*(1.0 - rz.a);
  69. t += max(.3,(2.-den*30.)*t*0.011);
  70. }
  71. return clamp(rz, 0., 1.);
  72. }
  73. float pent(in vec2 p){
  74. vec2 q = abs(p);
  75. return max(max(q.x*1.176-p.y*0.385, q.x*0.727+p.y), -p.y*1.237)*1.;
  76. }
  77. vec3 lensFlare(vec2 p, vec2 pos)
  78. {
  79. vec2 q = p-pos;
  80. float dq = dot(q, q);
  81. vec2 dist = p*(length(p))*0.75;
  82. float ang = atan(q.x,q.y);
  83. vec2 pp = mix(p, dist, 0.5);
  84. float sz = 0.01;
  85. float rz = pow(abs(fract(ang*.8+.12)-0.5),3.)*(noise(ang*15.))*0.5;
  86. rz *= smoothstep(1.0, 0.0, dot(q,q));
  87. rz *= smoothstep(0.0, 0.01, dot(q,q));
  88. rz += max(1.0/(1.0 + 30.0*pent(dist + 0.8*pos)),.0)*0.17;
  89. rz += clamp(sz-pow(pent(pp + 0.15*pos),1.55),.0, 1.)*5.0;
  90. rz += clamp(sz-pow(pent(pp + 0.1*pos),2.4),.0, 1.)*4.0;
  91. rz += clamp(sz-pow(pent(pp - 0.05*pos),1.2),.0, 1.)*4.0;
  92. rz += clamp(sz-pow(pent((pp + .5*pos)),1.7),.0, 1.)*4.0;
  93. rz += clamp(sz-pow(pent((pp + .3*pos)),1.9),.0, 1.)*3.0;
  94. rz += clamp(sz-pow(pent((pp - .2*pos)),1.3),.0, 1.)*4.0;
  95. return vec3(clamp(rz,0.,1.));
  96. }
  97. mat3 rot_x(float a){float sa = sin(a); float ca = cos(a); return mat3(1.,.0,.0, .0,ca,sa, .0,-sa,ca);}
  98. mat3 rot_y(float a){float sa = sin(a); float ca = cos(a); return mat3(ca,.0,sa, .0,1.,.0, -sa,.0,ca);}
  99. mat3 rot_z(float a){float sa = sin(a); float ca = cos(a); return mat3(ca,sa,.0, -sa,ca,.0, .0,.0,1.);}
  100. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  101. {
  102. vec2 q = fragCoord.xy / iResolution.xy;
  103. vec2 p = q - 0.5;
  104. float asp =iResolution.x/iResolution.y;
  105. p.x *= asp;
  106. vec2 mo = iMouse.xy / iResolution.xy;
  107. moy = mo.y;
  108. float st = sin(time*0.3-1.3)*0.2;
  109. vec3 ro = vec3(0.,-2.+sin(time*.3-1.)*2.,time*30.);
  110. ro.x = path(ro.z);
  111. vec3 ta = ro + vec3(0,0,1);
  112. vec3 fw = normalize( ta - ro);
  113. vec3 uu = normalize(cross( vec3(0.0,1.0,0.0), fw ));
  114. vec3 vv = normalize(cross(fw,uu));
  115. const float zoom = 1.;
  116. vec3 rd = normalize( p.x*uu + p.y*vv + -zoom*fw );
  117. float rox = sin(time*0.2)*0.6+2.9;
  118. rox += smoothstep(0.6,1.2,sin(time*0.25))*3.5;
  119. float roy = sin(time*0.5)*0.2;
  120. mat3 rotation = rot_x(-roy)*rot_y(-rox+st*1.5)*rot_z(st);
  121. mat3 inv_rotation = rot_z(-st)*rot_y(rox-st*1.5)*rot_x(roy);
  122. rd *= rotation;
  123. rd.y -= dot(p,p)*0.06;
  124. rd = normalize(rd);
  125. vec3 col = vec3(0.);
  126. lgt = normalize(vec3(-0.3,mo.y+0.1,1.));
  127. float rdl = clamp(dot(rd, lgt),0.,1.);
  128. vec3 hor = mix( vec3(.9,.6,.7)*0.35, vec3(.5,0.05,0.05), rdl );
  129. hor = mix(hor, vec3(.5,.8,1),mo.y);
  130. col += mix( vec3(.2,.2,.6), hor, exp2(-(1.+ 3.*(1.-rdl))*max(abs(rd.y),0.)) )*.6;
  131. col += .8*vec3(1.,.9,.9)*exp2(rdl*650.-650.);
  132. col += .3*vec3(1.,1.,0.1)*exp2(rdl*100.-100.);
  133. col += .5*vec3(1.,.7,0.)*exp2(rdl*50.-50.);
  134. col += .4*vec3(1.,0.,0.05)*exp2(rdl*10.-10.);
  135. vec3 bgc = col;
  136. float rz = march(ro,rd);
  137. if (rz < 70.)
  138. {
  139. vec4 res = marchV(ro, rd, rz-5., bgc);
  140. col = col*(1.0-res.w) + res.xyz;
  141. }
  142. vec3 proj = (-lgt*inv_rotation);
  143. col += 1.4*vec3(0.7,0.7,0.4)*clamp(lensFlare(p,-proj.xy/proj.z*zoom)*proj.z,0., 1.);
  144. float g = smoothstep(0.03,.97,mo.x);
  145. col = mix(mix(col,col.brg*vec3(1,0.75,1),clamp(g*2.,0.0,1.0)), col.bgr, clamp((g-0.5)*2.,0.0,1.));
  146. col = clamp(col, 0., 1.);
  147. col = col*0.5 + 0.5*col*col*(3.0-2.0*col); //saturation
  148. col = pow(col, vec3(0.416667))*1.055 - 0.055; //sRGB
  149. col *= pow( 16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y), 0.12 ); //Vign
  150. fragColor = vec4( col, 1.0 );
  151. }