Advertisement
Guest User

Converted GLSL

a guest
Mar 6th, 2022
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. precision highp float;
  3. uniform vec3 iResolution;
  4. uniform vec2 iMouse;
  5. uniform float iTime;
  6.  
  7. float dot2( in vec2 v ) { return dot(v,v); }
  8. float dot2( in vec3 v ) { return dot(v,v); }
  9. float ndot( in vec2 a, in vec2 b ) { return a.x*b.x - a.y*b.y; }
  10. float sdPlane( vec3 p )
  11. {
  12.     return p.y;
  13. }
  14.  
  15. float sdSphere( vec3 p, float s )
  16. {
  17.     return length(p)-s;
  18. }
  19.  
  20. float sdBox( vec3 p, vec3 b )
  21. {
  22.     vec3 d = abs(p) - b;
  23.     return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0));
  24. }
  25.  
  26. float sdBoundingBox( vec3 p, vec3 b, float e )
  27. {
  28.     p = abs(p)-b;
  29.     vec3 q = abs(p+e)-e;
  30.  
  31.     return min(min(
  32.         length(max(vec3(p.x,q.y,q.z),0.0))+min(max(p.x,max(q.y,q.z)),0.0),
  33.         length(max(vec3(q.x,p.y,q.z),0.0))+min(max(q.x,max(p.y,q.z)),0.0)),
  34.         length(max(vec3(q.x,q.y,p.z),0.0))+min(max(q.x,max(q.y,p.z)),0.0));
  35. }
  36. float sdEllipsoid( in vec3 p, in vec3 r ) // approximated
  37. {
  38.     float k0 = length(p/r);
  39.     float k1 = length(p/(r*r));
  40.     return k0*(k0-1.0)/k1;
  41. }
  42.  
  43. float sdTorus( vec3 p, vec2 t )
  44. {
  45.     return length( vec2(length(p.xz)-t.x,p.y) )-t.y;
  46. }
  47.  
  48. float sdCappedTorus(in vec3 p, in vec2 sc, in float ra, in float rb)
  49. {
  50.     p.x = abs(p.x);
  51.     float k = (sc.y*p.x>sc.x*p.y) ? dot(p.xy,sc) : length(p.xy);
  52.     return sqrt( dot(p,p) + ra*ra - 2.0*ra*k ) - rb;
  53. }
  54.  
  55. float sdHexPrism( vec3 p, vec2 h )
  56. {
  57.     vec3 q = abs(p);
  58.  
  59.     const vec3 k = vec3(-0.8660254, 0.5, 0.57735);
  60.     p = abs(p);
  61.     p.xy -= 2.0*min(dot(k.xy, p.xy), 0.0)*k.xy;
  62.     vec2 d = vec2(
  63.         length(p.xy - vec2(clamp(p.x, -k.z*h.x, k.z*h.x), h.x))*sign(p.y - h.x),
  64.         p.z-h.y );
  65.     return min(max(d.x,d.y),0.0) + length(max(d,0.0));
  66. }
  67.  
  68. float sdOctogonPrism( in vec3 p, in float r, float h )
  69. {
  70.   const vec3 k = vec3(-0.9238795325,   // sqrt(2+sqrt(2))/2
  71.                        0.3826834323,   // sqrt(2-sqrt(2))/2
  72.                        0.4142135623 ); // sqrt(2)-1
  73.     // reflections
  74.     p = abs(p);
  75.     p.xy -= 2.0*min(dot(vec2( k.x,k.y),p.xy),0.0)*vec2( k.x,k.y);
  76.     p.xy -= 2.0*min(dot(vec2(-k.x,k.y),p.xy),0.0)*vec2(-k.x,k.y);
  77.     // polygon side
  78.     p.xy -= vec2(clamp(p.x, -k.z*r, k.z*r), r);
  79.     vec2 d = vec2( length(p.xy)*sign(p.y), p.z-h );
  80.     return min(max(d.x,d.y),0.0) + length(max(d,0.0));
  81. }
  82.  
  83. float sdCapsule( vec3 p, vec3 a, vec3 b, float r )
  84. {
  85.     vec3 pa = p-a, ba = b-a;
  86.     float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
  87.     return length( pa - ba*h ) - r;
  88. }
  89.  
  90. float sdRoundCone( in vec3 p, in float r1, float r2, float h )
  91. {
  92.     vec2 q = vec2( length(p.xz), p.y );
  93.    
  94.     float b = (r1-r2)/h;
  95.     float a = sqrt(1.0-b*b);
  96.     float k = dot(q,vec2(-b,a));
  97.    
  98.     if( k < 0.0 ) return length(q) - r1;
  99.     if( k > a*h ) return length(q-vec2(0.0,h)) - r2;
  100.        
  101.     return dot(q, vec2(a,b) ) - r1;
  102. }
  103.  
  104. float sdRoundCone(vec3 p, vec3 a, vec3 b, float r1, float r2)
  105. {
  106.     // sampling independent computations (only depend on shape)
  107.     vec3  ba = b - a;
  108.     float l2 = dot(ba,ba);
  109.     float rr = r1 - r2;
  110.     float a2 = l2 - rr*rr;
  111.     float il2 = 1.0/l2;
  112.    
  113.     // sampling dependant computations
  114.     vec3 pa = p - a;
  115.     float y = dot(pa,ba);
  116.     float z = y - l2;
  117.     float x2 = dot2( pa*l2 - ba*y );
  118.     float y2 = y*y*l2;
  119.     float z2 = z*z*l2;
  120.  
  121.     // single square root!
  122.     float k = sign(rr)*rr*rr*x2;
  123.     if( sign(z)*a2*z2 > k ) return  sqrt(x2 + z2)        *il2 - r2;
  124.     if( sign(y)*a2*y2 < k ) return  sqrt(x2 + y2)        *il2 - r1;
  125.                             return (sqrt(x2*a2*il2)+y*rr)*il2 - r1;
  126. }
  127.  
  128. float sdTriPrism( vec3 p, vec2 h )
  129. {
  130.     float k = sqrt(3.0);
  131.     h.x *= 0.5*k;
  132.     p.xy /= h.x;
  133.     p.x = abs(p.x) - 1.0;
  134.     p.y = p.y + 1.0/k;
  135.     if( p.x+k*p.y>0.0 ) p.xy=vec2(p.x-k*p.y,-k*p.x-p.y)/2.0;
  136.     p.x -= clamp( p.x, -2.0, 0.0 );
  137.     float d1 = length(p.xy)*sign(-p.y)*h.x;
  138.     float d2 = abs(p.z)-h.y;
  139.     return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
  140. }
  141.  
  142. // vertical
  143. float sdCylinder( vec3 p, vec2 h )
  144. {
  145.     vec2 d = abs(vec2(length(p.xz),p.y)) - h;
  146.     return min(max(d.x,d.y),0.0) + length(max(d,0.0));
  147. }
  148.  
  149. // arbitrary orientation
  150. float sdCylinder(vec3 p, vec3 a, vec3 b, float r)
  151. {
  152.     vec3 pa = p - a;
  153.     vec3 ba = b - a;
  154.     float baba = dot(ba,ba);
  155.     float paba = dot(pa,ba);
  156.  
  157.     float x = length(pa*baba-ba*paba) - r*baba;
  158.     float y = abs(paba-baba*0.5)-baba*0.5;
  159.     float x2 = x*x;
  160.     float y2 = y*y*baba;
  161.     float d = (max(x,y)<0.0)?-min(x2,y2):(((x>0.0)?x2:0.0)+((y>0.0)?y2:0.0));
  162.     return sign(d)*sqrt(abs(d))/baba;
  163. }
  164.  
  165. // vertical
  166. float sdCone( in vec3 p, in vec2 c, float h )
  167. {
  168.     vec2 q = h*vec2(c.x,-c.y)/c.y;
  169.     vec2 w = vec2( length(p.xz), p.y );
  170.    
  171.     vec2 a = w - q*clamp( dot(w,q)/dot(q,q), 0.0, 1.0 );
  172.     vec2 b = w - q*vec2( clamp( w.x/q.x, 0.0, 1.0 ), 1.0 );
  173.     float k = sign( q.y );
  174.     float d = min(dot( a, a ),dot(b, b));
  175.     float s = max( k*(w.x*q.y-w.y*q.x),k*(w.y-q.y)  );
  176.     return sqrt(d)*sign(s);
  177. }
  178.  
  179. float sdCappedCone( in vec3 p, in float h, in float r1, in float r2 )
  180. {
  181.     vec2 q = vec2( length(p.xz), p.y );
  182.    
  183.     vec2 k1 = vec2(r2,h);
  184.     vec2 k2 = vec2(r2-r1,2.0*h);
  185.     vec2 ca = vec2(q.x-min(q.x,(q.y < 0.0)?r1:r2), abs(q.y)-h);
  186.     vec2 cb = q - k1 + k2*clamp( dot(k1-q,k2)/dot2(k2), 0.0, 1.0 );
  187.     float s = (cb.x < 0.0 && ca.y < 0.0) ? -1.0 : 1.0;
  188.     return s*sqrt( min(dot2(ca),dot2(cb)) );
  189. }
  190.  
  191. float sdCappedCone(vec3 p, vec3 a, vec3 b, float ra, float rb)
  192. {
  193.     float rba  = rb-ra;
  194.     float baba = dot(b-a,b-a);
  195.     float papa = dot(p-a,p-a);
  196.     float paba = dot(p-a,b-a)/baba;
  197.  
  198.     float x = sqrt( papa - paba*paba*baba );
  199.  
  200.     float cax = max(0.0,x-((paba<0.5)?ra:rb));
  201.     float cay = abs(paba-0.5)-0.5;
  202.  
  203.     float k = rba*rba + baba;
  204.     float f = clamp( (rba*(x-ra)+paba*baba)/k, 0.0, 1.0 );
  205.  
  206.     float cbx = x-ra - f*rba;
  207.     float cby = paba - f;
  208.    
  209.     float s = (cbx < 0.0 && cay < 0.0) ? -1.0 : 1.0;
  210.    
  211.     return s*sqrt( min(cax*cax + cay*cay*baba,
  212.         cbx*cbx + cby*cby*baba) );
  213. }
  214.  
  215. // c is the sin/cos of the desired cone angle
  216. float sdSolidAngle(vec3 pos, vec2 c, float ra)
  217. {
  218.     vec2 p = vec2( length(pos.xz), pos.y );
  219.     float l = length(p) - ra;
  220.     float m = length(p - c*clamp(dot(p,c),0.0,ra) );
  221.     return max(l,m*sign(c.y*p.x-c.x*p.y));
  222. }
  223.  
  224. float sdOctahedron(vec3 p, float s)
  225. {
  226.     p = abs(p);
  227.     float m = p.x + p.y + p.z - s;
  228.  
  229.     // exact distance
  230.     vec3 o = min(3.0*p - m, 0.0);
  231.     o = max(6.0*p - m*2.0 - o*3.0 + (o.x+o.y+o.z), 0.0);
  232.     return length(p - s*o/(o.x+o.y+o.z));
  233.    
  234.     // exact distance
  235.     // #if 1
  236.     // vec3 q;
  237.     // if( 3.0*p.x < m ) q = p.xyz;
  238.     // else if( 3.0*p.y < m ) q = p.yzx;
  239.     // else if( 3.0*p.z < m ) q = p.zxy;
  240.     // else return m*0.57735027;
  241.     // float k = clamp(0.5*(q.z-q.y+s),0.0,s);
  242.     // return length(vec3(q.x,q.y-s+k,q.z-k));
  243.     // #endif
  244.    
  245.     // bound, not exact
  246.     return m*0.57735027;
  247. }
  248.  
  249. float sdPyramid( in vec3 p, in float h )
  250. {
  251.     float m2 = h*h + 0.25;
  252.    
  253.     // symmetry
  254.     p.xz = abs(p.xz);
  255.     p.xz = (p.z>p.x) ? p.zx : p.xz;
  256.     p.xz -= 0.5;
  257.    
  258.     // project into face plane (2D)
  259.     vec3 q = vec3( p.z, h*p.y - 0.5*p.x, h*p.x + 0.5*p.y);
  260.  
  261.     float s = max(-q.x,0.0);
  262.     float t = clamp( (q.y-0.5*p.z)/(m2+0.25), 0.0, 1.0 );
  263.    
  264.     float a = m2*(q.x+s)*(q.x+s) + q.y*q.y;
  265.     float b = m2*(q.x+0.5*t)*(q.x+0.5*t) + (q.y-m2*t)*(q.y-m2*t);
  266.    
  267.     float d2 = min(q.y,-q.x*m2-q.y*0.5) > 0.0 ? 0.0 : min(a,b);
  268.    
  269.     // recover 3D and scale, and add sign
  270.     return sqrt( (d2+q.z*q.z)/m2 ) * sign(max(q.z,-p.y));;
  271. }
  272.  
  273. // la,lb=semi axis, h=height, ra=corner
  274. float sdRhombus(vec3 p, float la, float lb, float h, float ra)
  275. {
  276.     p = abs(p);
  277.     vec2 b = vec2(la,lb);
  278.     float f = clamp( (ndot(b,b-2.0*p.xz))/dot(b,b), -1.0, 1.0 );
  279.     vec2 q = vec2(length(p.xz-0.5*b*vec2(1.0-f,1.0+f))*sign(p.x*b.y+p.z*b.x-b.x*b.y)-ra, p.y-h);
  280.     return min(max(q.x,q.y),0.0) + length(max(q,0.0));
  281. }
  282.  
  283. //------------------------------------------------------------------
  284.  
  285. vec2 opU( vec2 d1, vec2 d2 )
  286. {
  287.     return (d1.x<d2.x) ? d1 : d2;
  288. }
  289.  
  290. //------------------------------------------------------------------
  291.  
  292. vec2 map( in vec3 pos )
  293. {
  294.     vec2 res = vec2( 1e10, 0.0 );
  295.         res = opU( res, vec2( sdSphere(    pos-vec3(-2.0,0.25, 0.0), 0.25 ), 26.9 ) );
  296.  
  297.     // bounding box
  298.     if( sdBox( pos-vec3(0.0,0.3,-1.0),vec3(0.35,0.3,2.5) )<res.x )
  299.     {
  300.     // more primitives
  301.     res = opU( res, vec2( sdBoundingBox( pos-vec3( 0.0,0.25, 0.0), vec3(0.3,0.25,0.2), 0.025 ), 16.9 ) );
  302.     res = opU( res, vec2( sdTorus(      (pos-vec3( 0.0,0.30, 1.0)).xzy, vec2(0.25,0.05) ), 25.0 ) );
  303.     res = opU( res, vec2( sdCone(        pos-vec3( 0.0,0.45,-1.0), vec2(0.6,0.8),0.45 ), 55.0 ) );
  304.     res = opU( res, vec2( sdCappedCone(  pos-vec3( 0.0,0.25,-2.0), 0.25, 0.25, 0.1 ), 13.67 ) );
  305.     res = opU( res, vec2( sdSolidAngle(  pos-vec3( 0.0,0.00,-3.0), vec2(3,4)/5.0, 0.4 ), 49.13 ) );
  306.     }
  307.  
  308.     // bounding box
  309.     if( sdBox( pos-vec3(1.0,0.3,-1.0),vec3(0.35,0.3,2.5) )<res.x )
  310.     {
  311.     // more primitives
  312.     res = opU( res, vec2( sdCappedTorus((pos-vec3( 1.0,0.30, 1.0))*vec3(1,-1,1), vec2(0.866025,-0.5), 0.25, 0.05), 8.5) );
  313.     res = opU( res, vec2( sdBox(         pos-vec3( 1.0,0.25, 0.0), vec3(0.3,0.25,0.1) ), 3.0 ) );
  314.     res = opU( res, vec2( sdCapsule(     pos-vec3( 1.0,0.00,-1.0),vec3(-0.1,0.1,-0.1), vec3(0.2,0.4,0.2), 0.1  ), 31.9 ) );
  315.     res = opU( res, vec2( sdCylinder(    pos-vec3( 1.0,0.25,-2.0), vec2(0.15,0.25) ), 8.0 ) );
  316.     res = opU( res, vec2( sdHexPrism(    pos-vec3( 1.0,0.2,-3.0), vec2(0.2,0.05) ), 18.4 ) );
  317.     }
  318.  
  319.     // bounding box
  320.     if( sdBox( pos-vec3(-1.0,0.35,-1.0),vec3(0.35,0.35,2.5))<res.x )
  321.     {
  322.     // more primitives
  323.     res = opU( res, vec2( sdPyramid(    pos-vec3(-1.0,-0.6,-3.0), 1.0 ), 13.56 ) );
  324.     res = opU( res, vec2( sdOctahedron( pos-vec3(-1.0,0.15,-2.0), 0.35 ), 23.56 ) );
  325.     res = opU( res, vec2( sdTriPrism(   pos-vec3(-1.0,0.15,-1.0), vec2(0.3,0.05) ),43.5 ) );
  326.     res = opU( res, vec2( sdEllipsoid(  pos-vec3(-1.0,0.25, 0.0), vec3(0.2, 0.25, 0.05) ), 43.17 ) );
  327.     res = opU( res, vec2( sdRhombus(   (pos-vec3(-1.0,0.34, 1.0)).xzy, 0.15, 0.25, 0.04, 0.08 ),17.0 ) );
  328.     }
  329.  
  330.     // bounding box
  331.     if( sdBox( pos-vec3(2.0,0.3,-1.0),vec3(0.35,0.3,2.5) )<res.x )
  332.     {
  333.     // more primitives
  334.     res = opU( res, vec2( sdOctogonPrism(pos-vec3( 2.0,0.2,-3.0), 0.2, 0.05), 51.8 ) );
  335.     res = opU( res, vec2( sdCylinder(    pos-vec3( 2.0,0.15,-2.0), vec3(0.1,-0.1,0.0), vec3(-0.2,0.35,0.1), 0.08), 31.2 ) );
  336.     res = opU( res, vec2( sdCappedCone(  pos-vec3( 2.0,0.10,-1.0), vec3(0.1,0.0,0.0), vec3(-0.2,0.40,0.1), 0.15, 0.05), 46.1 ) );
  337.     res = opU( res, vec2( sdRoundCone(   pos-vec3( 2.0,0.15, 0.0), vec3(0.1,0.0,0.0), vec3(-0.1,0.35,0.1), 0.15, 0.05), 51.7 ) );
  338.     res = opU( res, vec2( sdRoundCone(   pos-vec3( 2.0,0.20, 1.0), 0.2, 0.1, 0.3 ), 37.0 ) );
  339.     }
  340.    
  341.     return res;
  342. }
  343.  
  344. // http://iquilezles.org/www/articles/boxfunctions/boxfunctions.htm
  345. vec2 iBox( in vec3 ro, in vec3 rd, in vec3 rad )
  346. {
  347.     vec3 m = 1.0/rd;
  348.     vec3 n = m*ro;
  349.     vec3 k = abs(m)*rad;
  350.     vec3 t1 = -n - k;
  351.     vec3 t2 = -n + k;
  352.     return vec2( max( max( t1.x, t1.y ), t1.z ),
  353.                 min( min( t2.x, t2.y ), t2.z ) );
  354. }
  355.  
  356. vec2 raycast( in vec3 ro, in vec3 rd )
  357. {
  358.     vec2 res = vec2(-1.0,-1.0);
  359.  
  360.     float tmin = 1.0;
  361.     float tmax = 20.0;
  362.  
  363.     // raytrace floor plane
  364.     float tp1 = (0.0-ro.y)/rd.y;
  365.     if( tp1>0.0 )
  366.     {
  367.         tmax = min( tmax, tp1 );
  368.         res = vec2( tp1, 1.0 );
  369.     }
  370.     //else return res;
  371.    
  372.     // raymarch primitives  
  373.     vec2 tb = iBox( ro-vec3(0.0,0.4,-0.5), rd, vec3(2.5,0.41,3.0) );
  374.     if( tb.x<tb.y && tb.y>0.0 && tb.x<tmax)
  375.     {
  376.         //return vec2(tb.x,2.0);
  377.         tmin = max(tb.x,tmin);
  378.         tmax = min(tb.y,tmax);
  379.  
  380.         float t = tmin;
  381.         for(int i=0; (i < 70) && (t < tmax); i++)
  382.         {
  383.             vec2 h = map( ro+rd*t );
  384.             if( abs(h.x)<(0.0001*t) )
  385.             {
  386.                 res = vec2(t,h.y);
  387.                 break;
  388.             }
  389.             t += h.x;
  390.         }
  391.     }
  392.    
  393.     return res;
  394. }
  395.  
  396. // http://iquilezles.org/www/articles/rmshadows/rmshadows.htm
  397. float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
  398. {
  399.     // bounding volume
  400.     float tp = (0.8-ro.y)/rd.y; if( tp>0.0 ) tmax = min( tmax, tp );
  401.  
  402.     float res = 1.0;
  403.     float t = mint;
  404.     for( int i=0; i<24; i++ )
  405.     {
  406.         float h = map( ro + rd*t ).x;
  407.         float s = clamp(8.0*h/t,0.0,1.0);
  408.         res = min( res, s*s*(3.0-2.0*s) );
  409.         t += clamp( h, 0.02, 0.2 );
  410.         if( res<0.004 || t>tmax ) break;
  411.     }
  412.     return clamp( res, 0.0, 1.0 );
  413. }
  414.  
  415. // http://iquilezles.org/www/articles/normalsSDF/normalsSDF.htm
  416. vec3 calcNormal( in vec3 pos )
  417. {
  418.     vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
  419.     return normalize( e.xyy*map( pos + e.xyy ).x +
  420.                         e.yyx*map( pos + e.yyx ).x +
  421.                         e.yxy*map( pos + e.yxy ).x +
  422.                         e.xxx*map( pos + e.xxx ).x );
  423. }
  424.  
  425. float calcAO( in vec3 pos, in vec3 nor )
  426. {
  427.     float occ = 0.0;
  428.     float sca = 1.0;
  429.     for( int i=0; i<5; i++ )
  430.     {
  431.         float h = 0.01 + 0.12*float(i)/4.0;
  432.         float d = map( pos + h*nor ).x;
  433.         occ += (h-d)*sca;
  434.         sca *= 0.95;
  435.         if( occ>0.35 ) break;
  436.     }
  437.     return clamp( 1.0 - 3.0*occ, 0.0, 1.0 ) * (0.5+0.5*nor.y);
  438. }
  439.  
  440. // http://iquilezles.org/www/articles/checkerfiltering/checkerfiltering.htm
  441. float checkersGradBox( in vec2 p, in vec2 dpdx, in vec2 dpdy )
  442. {
  443.     // filter kernel
  444.     vec2 w = abs(dpdx)+abs(dpdy) + 0.001;
  445.     // analytical integral (box filter)
  446.     vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
  447.     // xor pattern
  448.     return 0.5 - 0.5*i.x*i.y;                  
  449. }
  450.  
  451. vec3 render( in vec3 ro, in vec3 rd, in vec3 rdx, in vec3 rdy )
  452. {
  453.     // background
  454.     vec3 col = vec3(0.7, 0.7, 0.9) - max(rd.y,0.0)*0.3;
  455.    
  456.     // raycast scene
  457.     vec2 res = raycast(ro,rd);
  458.     float t = res.x;
  459.     float m = res.y;
  460.     if( m>-0.5 )
  461.     {
  462.         vec3 pos = ro + t*rd;
  463.         vec3 nor = (m<1.5) ? vec3(0.0,1.0,0.0) : calcNormal( pos );
  464.         vec3 ref = reflect( rd, nor );
  465.        
  466.         // material        
  467.         col = 0.2 + 0.2*sin( m*2.0 + vec3(0.0,1.0,2.0) );
  468.         float ks = 1.0;
  469.        
  470.         if( m<1.5 )
  471.         {
  472.             // project pixel footprint into the plane
  473.             vec3 dpdx = ro.y*(rd/rd.y-rdx/rdx.y);
  474.             vec3 dpdy = ro.y*(rd/rd.y-rdy/rdy.y);
  475.  
  476.             float f = checkersGradBox( 3.0*pos.xz, 3.0*dpdx.xz, 3.0*dpdy.xz );
  477.             col = 0.15 + f*vec3(0.05);
  478.             ks = 0.4;
  479.         }
  480.  
  481.         // lighting
  482.         float occ = calcAO( pos, nor );
  483.        
  484.         vec3 lin = vec3(0.0);
  485.  
  486.         // sun
  487.         {
  488.             vec3  lig = normalize( vec3(-0.5, 0.4, -0.6) );
  489.             vec3  hal = normalize( lig-rd );
  490.             float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
  491.             //if( dif>0.0001 )
  492.                   dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
  493.             float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0);
  494.                   spe *= dif;
  495.                   spe *= 0.04+0.96*pow(clamp(1.0-dot(hal,lig),0.0,1.0),5.0);
  496.                 //spe *= 0.04+0.96*pow(clamp(1.0-sqrt(0.5*(1.0-dot(rd,lig))),0.0,1.0),5.0);
  497.             lin += col*2.20*dif*vec3(1.30,1.00,0.70);
  498.             lin +=     5.00*spe*vec3(1.30,1.00,0.70)*ks;
  499.         }
  500.         // sky
  501.         {
  502.             float dif = sqrt(clamp( 0.5+0.5*nor.y, 0.0, 1.0 ));
  503.                   dif *= occ;
  504.             float spe = smoothstep( -0.2, 0.2, ref.y );
  505.                   spe *= dif;
  506.                   spe *= 0.04+0.96*pow(clamp(1.0+dot(nor,rd),0.0,1.0), 5.0 );
  507.             //if( spe>0.001 )
  508.                   spe *= calcSoftshadow( pos, ref, 0.02, 2.5 );
  509.             lin += col*0.60*dif*vec3(0.40,0.60,1.15);
  510.             lin +=     2.00*spe*vec3(0.40,0.60,1.30)*ks;
  511.         }
  512.         // back
  513.         {
  514.             float dif = clamp( dot( nor, normalize(vec3(0.5,0.0,0.6))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
  515.                     dif *= occ;
  516.             lin += col*0.55*dif*vec3(0.25,0.25,0.25);
  517.         }
  518.         // sss
  519.         {
  520.             float dif = pow(clamp(1.0+dot(nor,rd),0.0,1.0),2.0);
  521.                   dif *= occ;
  522.             lin += col*0.25*dif*vec3(1.00,1.00,1.00);
  523.         }
  524.        
  525.         col = lin;
  526.  
  527.         col = mix( col, vec3(0.7,0.7,0.9), 1.0-exp( -0.0001*t*t*t ) );
  528.     }
  529.  
  530.     return vec3( clamp(col,0.0,1.0) );
  531. }
  532.  
  533. mat3 setCamera( in vec3 ro, in vec3 ta, float cr )
  534. {
  535.     vec3 cw = normalize(ta-ro);
  536.     vec3 cp = vec3(sin(cr), cos(cr),0.0);
  537.     vec3 cu = normalize( cross(cw,cp) );
  538.     vec3 cv =          ( cross(cu,cw) );
  539.     return mat3( cu, cv, cw );
  540. }
  541.  
  542. void main(void) {
  543.     vec2 fragCoord = gl_FragCoord.xy;
  544.  
  545.     vec2 mo = iMouse.xy/iResolution.xy;
  546.     float time = 32.0 + iTime*1.5;
  547.  
  548.     // camera  
  549.     vec3 ta = vec3( 0.5, -0.5, -0.6 );
  550.     vec3 ro = ta + vec3( 4.5*cos(0.1*time + 7.0*mo.x), 1.3 + 2.0*mo.y, 4.5*sin(0.1*time + 7.0*mo.x) );
  551.     // camera-to-world transformation
  552.     mat3 ca = setCamera( ro, ta, 0.0 );
  553.  
  554.     vec3 tot = vec3(0.0);
  555.     for( int m=0; m<2; m++ ) {
  556.         for( int n=0; n<2; n++ )
  557.         {
  558.             // pixel coordinates
  559.             vec2 o = vec2(float(m),float(n)) / float(2) - 0.5;
  560.             vec2 p = (2.0*(fragCoord+o)-iResolution.xy)/iResolution.y;
  561.  
  562.             // focal length
  563.             const float fl = 2.5;
  564.            
  565.             // ray direction
  566.             vec3 rd = ca * normalize( vec3(p,fl) );
  567.  
  568.             // ray differentials
  569.             vec2 px = (2.0*(fragCoord+vec2(1.0,0.0))-iResolution.xy)/iResolution.y;
  570.             vec2 py = (2.0*(fragCoord+vec2(0.0,1.0))-iResolution.xy)/iResolution.y;
  571.             vec3 rdx = ca * normalize( vec3(px,fl) );
  572.             vec3 rdy = ca * normalize( vec3(py,fl) );
  573.            
  574.             // render  
  575.             vec3 col = render( ro, rd, rdx, rdy );
  576.  
  577.             // gain
  578.             // col = col*3.0/(2.5+col);
  579.            
  580.             // gamma
  581.             col = pow( col, vec3(0.4545) );
  582.  
  583.             tot += col;
  584.         }
  585.     }
  586.     tot /= float(2*2);
  587.    
  588.     gl_FragColor = vec4( tot, 1.0 );
  589. }
  590.    
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement