Advertisement
Guest User

Untitled

a guest
Sep 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifdef GL_OES_standard_derivatives
  2.     #extension GL_OES_standard_derivatives : enable
  3. #endif
  4. precision highp float;
  5. #define GLSLIFY 1
  6.  
  7. uniform float u_morph;
  8. uniform float u_time;
  9. uniform float u_step;
  10. uniform float u_force;
  11. uniform vec2 u_resolution;
  12. uniform vec2 u_mouse;
  13. uniform sampler2D u_matcap;
  14. uniform sampler2D u_matcap2;
  15. uniform float u_matcapindex;
  16. // uniform vec2 u_cameraoffset;
  17.  
  18. #define M_PI 3.1415926535897932384626433832795
  19.  
  20. const int MAX_MARCHING_STEPS = 150;
  21. const float MAX_DIST = 8.0;
  22. const float MIN_DIST = 2.0;
  23. const float EPSILON = 0.001;
  24. // https://github.com/glslify/glsl-aastep/blob/master/index.glsl
  25. float aastep(float threshold, float value) {
  26.     #ifdef GL_OES_standard_derivatives
  27.         float afwidth = length(vec2(dFdx(value), dFdy(value))) * 0.70710678118654757;
  28.         return smoothstep(threshold-afwidth, threshold+afwidth, value);
  29.     #else
  30.         return step(threshold, value);
  31.     #endif
  32. }
  33. // https://github.com/mattdesl/glsl-random/blob/master/index.glsl
  34. float random(vec2 co) {
  35.     float a = 12.9898;
  36.     float b = 78.233;
  37.     float c = 43758.5453;
  38.     float dt = dot(co.xy, vec2(a, b));
  39.     float sn = mod(dt, 3.14);
  40.     return fract(sin(sn) * c);
  41. }
  42. //https://github.com/mattdesl/glsl-blend-soft-light/blob/master/index.glsl
  43. // vec3 blendSoftLight(vec3 base, vec3 blend) {
  44.     //     return mix(
  45.     //         sqrt(base) * (2.0 * blend - 1.0) + 2.0 * base * (1.0 - blend), //         2.0 * base * blend + base * base * (1.0 - 2.0 * blend), //         step(base, vec3(0.5))
  46.     //     );
  47.     //
  48. }
  49. mat3 rotateX(float theta) {
  50.     float c = cos(theta);
  51.     float s = sin(theta);
  52.     return mat3(
  53.     vec3(1, 0, 0), vec3(0, c, -s), vec3(0, s, c)
  54.     );
  55. }
  56. mat3 rotateY(float theta) {
  57.     float c = cos(theta);
  58.     float s = sin(theta);
  59.     return mat3(
  60.     vec3(c, 0, s), vec3(0, 1, 0), vec3(-s, 0, c)
  61.     );
  62. }
  63. mat3 rotateZ(float theta) {
  64.     float c = cos(theta);
  65.     float s = sin(theta);
  66.     return mat3(
  67.     vec3(c, -s, 0), vec3(s, c, 0), vec3(0, 0, 1)
  68.     );
  69. }
  70. float sdBox( vec3 p, vec3 b ) {
  71.     vec3 d = abs(p) - b;
  72.     return min(max(d.x, max(d.y, d.z)), 0.0) + length(max(d, 0.0));
  73. }
  74. float sdTorus( vec3 p, vec2 t ) {
  75.     vec2 q = vec2(length(p.xz)-t.x, p.y);
  76.     return length(q)-t.y;
  77. }
  78. float sdSphere( vec3 p, float s ) {
  79.     return length(p)-s;
  80. }
  81. float sdTriPrism( vec3 p, vec2 h ) {
  82.     vec3 q = abs(p);
  83.     return max(q.z-h.y, max(q.x*0.866025+p.y*0.5, -p.y)-h.x*0.5);
  84. }
  85. float sdHexPrism( vec3 p, vec2 h ) {
  86.     vec3 q = abs(p);
  87.     return max(q.z-h.y, max((q.x*0.866025+q.y*0.5), q.y)-h.x);
  88. }
  89. float opRep( vec3 p, vec3 c ) {
  90.     vec3 q = mod(p, c)-0.5*c;
  91.     return sdBox( q, vec3(1.0) );
  92. }
  93. float smin( float a, float b, float k ) {
  94.     float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 );
  95.     return mix( b, a, h ) - k*h*(1.0-h);
  96. }
  97. float sdCapsule( vec3 p, vec3 a, vec3 b, float r ) {
  98.     vec3 pa = p - a, ba = b - a;
  99.     float h = clamp( dot(pa, ba)/dot(ba, ba), 0.0, 1.0 );
  100.     return length( pa - ba*h ) - r;
  101. }
  102. float sdCone( vec3 p, vec2 c ) {
  103.     // c must be normalized
  104.     float q = length(p.xy);
  105.     return dot(c, vec2(q, p.z));
  106. }
  107. float shapex(vec3 p) {
  108.     float time = u_time * .6;
  109.     float xsize = 0.4;
  110.     float x1 = sdCapsule(p, vec3(-xsize), vec3(xsize), 0.1);
  111.     float x2 = sdCapsule(rotateX(time) * p, vec3(-xsize), vec3(xsize), 0.1);
  112.     float sticky = .2 + 0.1 * (sin(time) + 1.0) / 2.0;
  113.     return smin(x1, x2, sticky);
  114. }
  115. float shapeprism(vec3 p) {
  116.     float time = u_time * .2;
  117.     float prism1 = sdHexPrism(rotateZ(time * 0.2) * p, vec2(0.4 + (sin(time)*0.1), 0.1));
  118.     float prism2 = sdHexPrism(rotateY(M_PI/2.0) * rotateX(time) * p, vec2(0.4, 0.1));
  119.     float merge = mix(.2, .4, (sin(time*8.0) + 1.0)/2.0);
  120.     return smin(prism1, prism2, merge);
  121. }
  122. float shapemeta(vec3 p) {
  123.     float time = u_time * .6;
  124.     float balls = sdSphere(p, 0.2);
  125.     vec2 diff = vec2(0.0);
  126.     float nball = 0.0;
  127.     for (float i = 0.0; i < 5.0; i += 1.0) {
  128.         diff = vec2(
  129.         sin(i*3.0+time), cos(i+2.0*1.0-time)
  130.         )* .5;
  131.         nball = sdSphere(p + vec3(diff, 0.0), 0.1);
  132.         balls = smin(balls, nball, 0.5);
  133.     }
  134.     return balls;
  135. }
  136. float shapetorus(vec3 p) {
  137.     return sdTorus(p, vec2(0.4, 0.1));
  138. }
  139. float shapebox(vec3 p) {
  140.     return sdBox(p, vec3(0.4));
  141. }
  142. float map(vec3 p) {
  143.     float time = u_time * .2;
  144.     mat3 rotation = rotateY(time) * rotateZ(time) * rotateX(time);
  145.     vec3 rotatedP = rotation * p;
  146.     // rotatedP = rotateX(u_cameraoffset.y * 20.0) * rotatedP;
  147.    
  148.     float r = 0.0;
  149.     if (u_step == 0.0) {
  150.         r = mix(shapebox(rotatedP), shapex(rotatedP), u_morph);
  151.     }
  152.     else if (u_step == 1.0) {
  153.         r = mix(shapex(rotatedP), shapetorus(rotatedP), u_morph);
  154.     }
  155.     else if (u_step == 2.0) {
  156.         r = mix(shapetorus(rotatedP), shapemeta(rotatedP), u_morph);
  157.     }
  158.     else if (u_step == 3.0) {
  159.         r = mix(shapemeta(rotatedP), shapebox(rotatedP), u_morph);
  160.     }
  161.     vec3 spherep = p;
  162.     spherep.xy -= u_mouse.xy;
  163.     float sphereSize = 0.1 + (u_force * 0.05) + (sin(time * 9.0) * 0.02);
  164.     float fusionMod = ((sin((p.x + p.y) * 200.0 + time * 30.0) + 1.0) / 2.0) * 0.006;
  165.     float sphere = sdSphere(spherep, sphereSize);
  166.     float sphereFusion = 0.4 + (u_force * 0.4) + (fusionMod * (sphere - r));
  167.     r = smin(r, sphere, sphereFusion);
  168.     return r;
  169. }
  170. float march(vec3 eye, vec3 dir) {
  171.     float depth = MIN_DIST;
  172.     for (int i = 0; i < MAX_MARCHING_STEPS; i++) {
  173.         float dist = map(eye + depth * dir);
  174.         if (dist < EPSILON) {
  175.             return depth;
  176.         }
  177.         depth += dist;
  178.         if (depth >= MAX_DIST) {
  179.             return MAX_DIST;
  180.         }
  181.  
  182.     }
  183.     return MAX_DIST;
  184. }
  185. vec3 rayDirection(float fieldOfView, vec2 size, vec2 fragCoord) {
  186.     vec2 xy = fragCoord - size / 2.0;
  187.     float z = size.y / tan(radians(fieldOfView) / 2.0);
  188.     return normalize(vec3(xy, -z));
  189. }
  190. mat4 viewMatrix(vec3 eye, vec3 center, vec3 up) {
  191.     vec3 f = normalize(center - eye);
  192.     vec3 s = normalize(cross(f, up));
  193.     vec3 u = cross(s, f);
  194.     return mat4(
  195.     vec4(s, 0.0), vec4(u, 0.0), vec4(-f, 0.0), vec4(0.0, 0.0, 0.0, 1)
  196.     );
  197. }
  198. // https://github.com/glslify/glsl-sdf-normal/blob/master/index.glsl
  199. vec3 calcNormal(vec3 p) {
  200.     float eps = 0.001;
  201.     const vec3 v1 = vec3( 1.0, -1.0, -1.0);
  202.     const vec3 v2 = vec3(-1.0, -1.0, 1.0);
  203.     const vec3 v3 = vec3(-1.0, 1.0, -1.0);
  204.     const vec3 v4 = vec3( 1.0, 1.0, 1.0);
  205.     return normalize( v1 * map( p + v1*eps ) +
  206.     v2 * map( p + v2*eps ) +
  207.     v3 * map( p + v3*eps ) +
  208.     v4 * map( p + v4*eps ) );
  209. }
  210. // // https://www.shadertoy.com/view/Xsd3Rs
  211. // float hash( float n ) {
  212.     //  return fract(sin(n)*3538.5453);
  213.     //
  214. }
  215. // float calcAO( in vec3 p, in vec3 n, float maxDist, float falloff ) {
  216.     //  float ao = 0.0;
  217.     //  const int nbIte = 6;
  218.     //  for( int i = 0; i<nbIte; i++ )
  219.     // {
  220.         //      float l = hash(float(i))*maxDist;
  221.         //      vec3 rd = n*l;
  222.         //      ao += (l - map( p + rd )) / pow(1.+l, falloff);
  223.         //
  224.     }
  225.     //  return clamp( 1.-ao/float(nbIte), 0., 1.);
  226.     //
  227. }
  228. float grain(vec2 uv) {
  229.     return random(uv + vec2(u_time, u_time * 0.3)) * 0.04;
  230. }
  231. vec3 background(vec2 uv) {
  232.     vec2 q = vec2(uv - 0.5);
  233.     float dst = length(q);
  234.     vec2 smooth = vec2(0.0, 1.0);
  235.     dst = smoothstep(smooth.x, smooth.y, dst);
  236.     vec3 color = mix(vec3(0.2), vec3(0.0), dst);
  237.     color += grain(uv) * 0.8;
  238.     return color;
  239. }
  240. // https://www.shadertoy.com/view/4scSW4
  241. float fresnel(float bias, float scale, float power, vec3 I, vec3 N) {
  242.     return bias + scale * pow(1.0 + dot(I, N), power);
  243. }
  244. vec3 getTexture(vec2 uv) {
  245.     return mix(
  246.     texture2D(u_matcap, uv).rgb, texture2D(u_matcap2, uv).rgb, u_matcapindex
  247.     );
  248. }
  249. void main() {
  250.     vec2 uv = gl_FragCoord.xy / u_resolution.xy;
  251.     vec3 viewDir = rayDirection(45.0, u_resolution.xy, gl_FragCoord.xy);
  252.     vec3 eye = vec3(0.0, 1.0, 4.0);
  253.     // eye.xy += u_mouse.xy;
  254.     // eye.x += u_cameraoffset.y * 30.0;
  255.     // eye.y += u_cameraoffset.x * 30.0;
  256.    
  257.     mat4 viewToWorld = viewMatrix(eye, vec3(0.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0));
  258.     vec3 worldDir = (viewToWorld * vec4(viewDir, 0.0)).xyz;
  259.     float dist = march(eye, worldDir);
  260.     vec3 bg = background(uv);
  261.     if (dist > MAX_DIST - EPSILON) {
  262.         gl_FragColor = vec4(bg, 1.0);
  263.         return;
  264.     }
  265.     vec3 pos = eye + dist * worldDir;
  266.     vec3 nor = calcNormal(pos);
  267.     // Matcap
  268.     vec3 r = reflect(worldDir, nor);
  269.     float m = 2.82842712474619 * sqrt( r.z+1.01 );
  270.     vec2 vN = r.xy / m + .5;
  271.     vec3 color = getTexture(vN);
  272.     // Fog
  273.     float dd = distance(eye, pos);
  274.     float start = 4.2;
  275.     float end = 6.0;
  276.     float fog = 1.0 - clamp((end - dd) / (end - start), 0.0, 1.0);
  277.     color = mix(color, bg, fog);
  278.     // Fresnel
  279.     vec3 I = normalize(pos - eye);
  280.     float R = fresnel(0.0, 0.4, 3.2, I, nor);
  281.     R = pow(R, 0.6);
  282.     color = mix(color, bg, R);
  283.     // Grain fx
  284.     color += grain(uv);
  285.     gl_FragColor = vec4(color, 1.0);
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement