Advertisement
codeanticode

Elevated fragment shader

May 9th, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.08 KB | None | 0 0
  1. // Elevated shader
  2. // https://www.shadertoy.com/view/MdX3Rr by inigo quilez
  3.  
  4. uniform vec3 iResolution;
  5. uniform float iGlobalTime;
  6.  
  7. // Created by inigo quilez - iq/2013
  8. // License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
  9.  
  10. //stereo thanks to Croqueteer
  11. //#define STEREO
  12.  
  13. mat3 m = mat3( 0.00, 0.80, 0.60,
  14. -0.80, 0.36, -0.48,
  15. -0.60, -0.48, 0.64 );
  16.  
  17. float hash( float n )
  18. {
  19. return fract(sin(n)*43758.5453123);
  20. }
  21.  
  22.  
  23. float noise( in vec3 x )
  24. {
  25. vec3 p = floor(x);
  26. vec3 f = fract(x);
  27.  
  28. f = f*f*(3.0-2.0*f);
  29.  
  30. float n = p.x + p.y*57.0 + 113.0*p.z;
  31.  
  32. float res = mix(mix(mix( hash(n+ 0.0), hash(n+ 1.0),f.x),
  33. mix( hash(n+ 57.0), hash(n+ 58.0),f.x),f.y),
  34. mix(mix( hash(n+113.0), hash(n+114.0),f.x),
  35. mix( hash(n+170.0), hash(n+171.0),f.x),f.y),f.z);
  36. return res;
  37. }
  38.  
  39.  
  40.  
  41.  
  42. vec3 noised( in vec2 x )
  43. {
  44. vec2 p = floor(x);
  45. vec2 f = fract(x);
  46.  
  47. vec2 u = f*f*(3.0-2.0*f);
  48.  
  49. float n = p.x + p.y*57.0;
  50.  
  51. float a = hash(n+ 0.0);
  52. float b = hash(n+ 1.0);
  53. float c = hash(n+ 57.0);
  54. float d = hash(n+ 58.0);
  55. return vec3(a+(b-a)*u.x+(c-a)*u.y+(a-b-c+d)*u.x*u.y,
  56. 30.0*f*f*(f*(f-2.0)+1.0)*(vec2(b-a,c-a)+(a-b-c+d)*u.yx));
  57.  
  58. }
  59.  
  60. float noise( in vec2 x )
  61. {
  62. vec2 p = floor(x);
  63. vec2 f = fract(x);
  64.  
  65. f = f*f*(3.0-2.0*f);
  66.  
  67. float n = p.x + p.y*57.0;
  68.  
  69. float res = mix(mix( hash(n+ 0.0), hash(n+ 1.0),f.x),
  70. mix( hash(n+ 57.0), hash(n+ 58.0),f.x),f.y);
  71.  
  72. return res;
  73. }
  74.  
  75. float fbm( vec3 p )
  76. {
  77. float f = 0.0;
  78.  
  79. f += 0.5000*noise( p ); p = m*p*2.02;
  80. f += 0.2500*noise( p ); p = m*p*2.03;
  81. f += 0.1250*noise( p ); p = m*p*2.01;
  82. f += 0.0625*noise( p );
  83.  
  84. return f/0.9375;
  85. }
  86.  
  87. mat2 m2 = mat2(1.6,-1.2,1.2,1.6);
  88.  
  89. float fbm( vec2 p )
  90. {
  91. float f = 0.0;
  92.  
  93. f += 0.5000*noise( p ); p = m2*p*2.02;
  94. f += 0.2500*noise( p ); p = m2*p*2.03;
  95. f += 0.1250*noise( p ); p = m2*p*2.01;
  96. f += 0.0625*noise( p );
  97.  
  98. return f/0.9375;
  99. }
  100.  
  101. float terrain( in vec2 x )
  102. {
  103. vec2 p = x*0.003;
  104. float a = 0.0;
  105. float b = 1.0;
  106. vec2 d = vec2(0.0);
  107. for(int i=0;i<5; i++)
  108. {
  109. vec3 n = noised(p);
  110. d += n.yz;
  111. a += b*n.x/(1.0+dot(d,d));
  112. b *= 0.5;
  113. p=mat2(1.6,-1.2,1.2,1.6)*p;
  114. }
  115.  
  116. return 140.0*a;
  117. }
  118.  
  119. float terrain2( in vec2 x )
  120. {
  121. vec2 p = x*0.003;
  122. float a = 0.0;
  123. float b = 1.0;
  124. vec2 d = vec2(0.0);
  125. for(int i=0;i<14; i++)
  126. {
  127. vec3 n = noised(p);
  128. d += n.yz;
  129. a += b*n.x/(1.0+dot(d,d));
  130. b *= 0.5;
  131. p=m2*p;
  132. }
  133.  
  134. return 140.0*a;
  135. }
  136.  
  137.  
  138. float map( in vec3 p )
  139. {
  140. float h = terrain(p.xz);
  141.  
  142. float ss = 0.03;
  143. float hh = h*ss;
  144. float fh = fract(hh);
  145. float ih = floor(hh);
  146. fh = mix( sqrt(fh), fh, smoothstep(50.0,140.0,h) );
  147. h = (ih+fh)/ss;
  148.  
  149. return p.y - h;
  150. }
  151.  
  152. float map2( in vec3 p )
  153. {
  154. float h = terrain2(p.xz);
  155.  
  156.  
  157. float ss = 0.03;
  158. float hh = h*ss;
  159. float fh = fract(hh);
  160. float ih = floor(hh);
  161. fh = mix( sqrt(fh), fh, smoothstep(50.0,140.0,h) );
  162. h = (ih+fh)/ss;
  163.  
  164. return p.y - h;
  165. }
  166.  
  167. bool jinteresct(in vec3 rO, in vec3 rD, out float resT )
  168. {
  169. float h = 0.0;
  170. float t = 0.0;
  171. for( int j=0; j<120; j++ )
  172. {
  173. //if( t>2000.0 ) break;
  174.  
  175. vec3 p = rO + t*rD;
  176. if( p.y>300.0 ) break;
  177. h = map( p );
  178.  
  179. if( h<0.1 )
  180. {
  181. resT = t;
  182. return true;
  183. }
  184. t += max(0.1,0.5*h);
  185.  
  186. }
  187.  
  188. if( h<5.0 )
  189. {
  190. resT = t;
  191. return true;
  192. }
  193. return false;
  194. }
  195.  
  196. float sinteresct(in vec3 rO, in vec3 rD )
  197. {
  198. float res = 1.0;
  199. float t = 0.0;
  200. for( int j=0; j<50; j++ )
  201. {
  202. //if( t>1000.0 ) break;
  203. vec3 p = rO + t*rD;
  204.  
  205. float h = map( p );
  206.  
  207. if( h<0.1 )
  208. {
  209. return 0.0;
  210. }
  211. res = min( res, 16.0*h/t );
  212. t += h;
  213.  
  214. }
  215.  
  216. return clamp( res, 0.0, 1.0 );
  217. }
  218.  
  219. vec3 calcNormal( in vec3 pos, float t )
  220. {
  221. float e = 0.001;
  222. e = 0.001*t;
  223. vec3 eps = vec3(e,0.0,0.0);
  224. vec3 nor;
  225. nor.x = map2(pos+eps.xyy) - map2(pos-eps.xyy);
  226. nor.y = map2(pos+eps.yxy) - map2(pos-eps.yxy);
  227. nor.z = map2(pos+eps.yyx) - map2(pos-eps.yyx);
  228. return normalize(nor);
  229. }
  230.  
  231. vec3 camPath( float time )
  232. {
  233. vec2 p = 600.0*vec2( cos(1.4+0.37*time),
  234. cos(3.2+0.31*time) );
  235.  
  236. return vec3( p.x, 0.0, p.y );
  237. }
  238.  
  239. void main(void)
  240. {
  241. vec2 xy = -1.0 + 2.0*gl_FragCoord.xy / iResolution.xy;
  242.  
  243. vec2 s = xy*vec2(1.75,1.0);
  244.  
  245. #ifdef STEREO
  246. float isCyan = mod(gl_FragCoord.x + mod(gl_FragCoord.y,2.0),2.0);
  247. #endif
  248.  
  249. float time = iGlobalTime*.15;
  250.  
  251. vec3 light1 = normalize( vec3( 0.4, 0.22, 0.6 ) );
  252. vec3 light2 = vec3( -0.707, 0.000, -0.707 );
  253.  
  254.  
  255. vec3 campos = camPath( time );
  256. vec3 camtar = camPath( time + 3.0 );
  257. campos.y = terrain( campos.xz ) + 15.0;
  258. camtar.y = campos.y*0.5;
  259.  
  260. float roll = 0.1*cos(0.1*time);
  261. vec3 cw = normalize(camtar-campos);
  262. vec3 cp = vec3(sin(roll), cos(roll),0.0);
  263. vec3 cu = normalize(cross(cw,cp));
  264. vec3 cv = normalize(cross(cu,cw));
  265. vec3 rd = normalize( s.x*cu + s.y*cv + 1.6*cw );
  266.  
  267. #ifdef STEREO
  268. campos += 2.0*cu*isCyan; // move camera to the right - the rd vector is still good
  269. #endif
  270.  
  271. float sundot = clamp(dot(rd,light1),0.0,1.0);
  272. vec3 col;
  273. float t;
  274. if( !jinteresct(campos,rd,t) )
  275. {
  276. col = 0.9*vec3(0.97,.99,1.0)*(1.0-0.3*rd.y);
  277. col += 0.2*vec3(0.8,0.7,0.5)*pow( sundot, 4.0 );
  278. }
  279. else
  280. {
  281. vec3 pos = campos + t*rd;
  282.  
  283. vec3 nor = calcNormal( pos, t );
  284.  
  285. float dif1 = clamp( dot( light1, nor ), 0.0, 1.0 );
  286. float dif2 = clamp( 0.2 + 0.8*dot( light2, nor ), 0.0, 1.0 );
  287. float sh = 1.0;
  288. if( dif1>0.001 )
  289. sh = sinteresct(pos+light1*20.0,light1);
  290.  
  291. vec3 dif1v = vec3(dif1);
  292. dif1v *= vec3( sh, sh*sh*0.5+0.5*sh, sh*sh );
  293.  
  294. float r = noise( 7.0*pos.xz );
  295.  
  296. col = (r*0.25+0.75)*0.9*mix( vec3(0.10,0.05,0.03), vec3(0.13,0.10,0.08), clamp(terrain2( vec2(pos.x,pos.y*48.0))/200.0,0.0,1.0) );
  297. col = mix( col, 0.17*vec3(0.5,.23,0.04)*(0.50+0.50*r),smoothstep(0.70,0.9,nor.y) );
  298. col = mix( col, 0.10*vec3(0.2,.30,0.00)*(0.25+0.75*r),smoothstep(0.95,1.0,nor.y) );
  299. col *= 0.75;
  300. // snow
  301. #if 1
  302. float h = smoothstep(55.0,80.0,pos.y + 25.0*fbm(0.01*pos.xz) );
  303. float e = smoothstep(1.0-0.5*h,1.0-0.1*h,nor.y);
  304. float o = 0.3 + 0.7*smoothstep(0.0,0.1,nor.x+h*h);
  305. float s = h*e*o;
  306. s = smoothstep( 0.1, 0.9, s );
  307. col = mix( col, 0.4*vec3(0.6,0.65,0.7), s );
  308. #endif
  309.  
  310.  
  311. vec3 brdf = 2.0*vec3(0.17,0.19,0.20)*clamp(nor.y,0.0,1.0);
  312. brdf += 6.0*vec3(1.00,0.95,0.80)*dif1v;
  313. brdf += 2.0*vec3(0.20,0.20,0.20)*dif2;
  314.  
  315. col *= brdf;
  316.  
  317. float fo = 1.0-exp(-pow(0.0015*t,1.5));
  318. vec3 fco = vec3(0.7) + 0.6*vec3(0.8,0.7,0.5)*pow( sundot, 4.0 );
  319. col = mix( col, fco, fo );
  320. }
  321.  
  322. col = sqrt(col);
  323.  
  324. vec2 uv = xy*0.5+0.5;
  325. col *= 0.7 + 0.3*pow(16.0*uv.x*uv.y*(1.0-uv.x)*(1.0-uv.y),0.1);
  326.  
  327. #ifdef STEREO
  328. col *= vec3( isCyan, 1.0-isCyan, 1.0-isCyan );
  329. #endif
  330.  
  331. gl_FragColor=vec4(col,1.0);
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement