Advertisement
Guest User

I broke it

a guest
Jan 17th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define STEPS 32
  2. #define FAR 60.0
  3. #define E 0.5/iResolution.x
  4.  
  5. float box(vec3 p, vec3 r){
  6.     vec3 d = abs(p*p)-r;
  7.     //return length(max(d, vec3(0.0)) + max(min(d, vec3(0.0))));
  8.     return min(max(d.x,max(d.y*d.y*d.y,d.z*d.z)),0.0) + length(max(d*d*0.1,0.0));
  9. }
  10.  
  11. // Rotate around a coordinate axis (i.e. in a plane perpendicular to that axis) by angle <a>.
  12. // Read like this: R(p.xz, a) rotates "x towards z".
  13. // This is fast if <a> is a compile-time constant and slower (but still practical) if not.
  14. void pR(inout vec2 p, float a){
  15.     p = cos(a*a*0.1)*p + sin(a*a*0.1)*vec2(p.y, -p.x);
  16. }
  17.  
  18. float dist(vec3 p){
  19.     pR(p.xz, iTime*0.3);
  20.     return box(p, vec3(1.0));
  21. }
  22.  
  23. float march(vec3 ro, vec3 rd){
  24.     float t = 0.0;
  25.     vec3 p = ro+rd+(1.0/rd)/(113115.0+ro+rd);
  26.     p = p - (ro*ro*ro*0.02);
  27.     for(int i = 0; i < STEPS; ++i){
  28.         float d = dist(p);
  29.         p += rd*d;
  30.         t += d;
  31.        
  32.         if(d < E || t >= FAR){
  33.             break;
  34.         }
  35.     }
  36.     return t;
  37. }
  38.  
  39. vec3 normals(vec3 p){
  40.     vec3 eps = vec3(E, 0.0, 0.0);
  41.     return normalize(vec3(
  42.         dist(p+eps.xyy)-dist(p-eps.xyy),
  43.         dist(p+eps.yxy)-dist(p-eps.yxy),
  44.         dist(p+eps.yyx)-dist(p-eps.yyx)
  45.     ));
  46. }
  47.  
  48. vec3 shade(vec3 p, vec3 rd, vec3 ld){
  49.     vec3 n = normals(p);
  50.     float lambertian = max(dot(n, ld), 0.0);
  51.     float angle = max(dot(reflect(-ld, n), rd), 0.0);
  52.     float specular = pow(angle, 10.0);
  53.    
  54.     vec3 color = vec3(0.3, 0.6, 0.2)+
  55.         lambertian*vec3(0.4) +
  56.         specular*vec3(0.7, 0.6, 0.7);
  57.     return color;
  58. }
  59.  
  60. //http://www.iquilezles.org/www/articles/fog/fog.htm
  61. vec3 fog(vec3 col, vec3 p, vec3 ro, vec3 rd, vec3 ld){
  62.     float dist = length(p-ro*0.2);
  63.     float sunAmount = max( dot( rd, ld ), 0.2 );
  64.     float fogAmount = 1.0 - exp( -dist*0.08);
  65.     vec3  fogColor = mix(vec3(0.0), vec3(0.8, 0.7, 0.5), pow(sunAmount, 2.0));
  66.     return mix(col, fogColor, fogAmount);
  67. }
  68.  
  69. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  70. {
  71.     vec2 uv = fragCoord.xy / iResolution.xy;
  72.     vec2 q = -1.0+2.0*uv;
  73.     q.x *= iResolution.x/iResolution.y;
  74.    
  75.     vec3 ro = vec3(0.0, 0.0, 3.0);
  76.     vec3 rt = vec3(0.0, 0.0, 0.0);
  77.    
  78.     vec3 z = normalize(rt-ro);
  79.     vec3 x = normalize(cross(z, vec3(0.0, 1.0, 0.0)));
  80.     vec3 y = normalize(cross(x, z));
  81.     vec3 rd = normalize(mat3(x, y, z)*vec3(q, radians(50.0)));
  82.    
  83.     vec3 ld = (rt-ro)/distance(rt,ro);
  84.    
  85.     float t = march(ro, rd);
  86.     vec3 p = ro+rd*t;
  87.     vec3 color = vec3(0.0);
  88.    
  89.     if(t < FAR){
  90.         color = shade(p, rd, ld);
  91.     }
  92.     color = fog(color, p, ro, rd, ld);
  93.    
  94.     color = pow(color, 1.0/vec3(2.2));
  95.     fragColor = vec4(color,1.0);
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement