nano11xbro

Untitled

Sep 15th, 2025
469
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OpenGL Shading 8.11 KB | Source Code | 0 0
  1. #if HW_PERFORMANCE==0
  2. #define AA 1
  3. #else
  4. #define AA 2
  5. #endif
  6.  
  7.  
  8. float shpIntersect( in vec3 ro, in vec3 rd, in vec4 sph )
  9. {
  10.     vec3 oc = ro - sph.xyz;
  11.     float b = dot( rd, oc );
  12.     float c = dot( oc, oc ) - sph.w*sph.w;
  13.     float h = b*b - c;
  14.     if( h>0.0 ) h = -b - sqrt( h );
  15.     return h;
  16. }
  17.  
  18. float sphDistance( in vec3 ro, in vec3 rd, in vec4 sph )
  19. {
  20.     vec3 oc = ro - sph.xyz;
  21.     float b = dot( oc, rd );
  22.     float h = dot( oc, oc ) - b*b;
  23.     return sqrt( max(0.0,h)) - sph.w;
  24. }
  25.  
  26. float sphSoftShadow( in vec3 ro, in vec3 rd, in vec4 sph, in float k )
  27. {
  28.     vec3 oc = sph.xyz - ro;
  29.     float b = dot( oc, rd );
  30.     float c = dot( oc, oc ) - sph.w*sph.w;
  31.     float h = b*b - c;
  32.     return (b<0.0) ? 1.0 : 1.0 - smoothstep( 0.0, 1.0, k*h/b );
  33. }    
  34.  
  35. vec3 sphNormal( in vec3 pos, in vec4 sph )
  36. {
  37.     return (pos - sph.xyz)/sph.w;    
  38. }
  39.  
  40. vec3 fancyCube( sampler2D sam, in vec3 d, in float s, in float b )
  41. {
  42.     vec3 colx = texture( sam, 0.5 + s*d.yz/d.x, b ).xyz;
  43.     vec3 coly = texture( sam, 0.5 + s*d.zx/d.y, b ).xyz;
  44.     vec3 colz = texture( sam, 0.5 + s*d.xy/d.z, b ).xyz;
  45.     vec3 n = d*d;
  46.     return (colx*n.x + coly*n.y + colz*n.z)/(n.x+n.y+n.z);
  47. }
  48.  
  49. vec2 hash( vec2 p ) { p=vec2(dot(p,vec2(127.1,311.7)),dot(p,vec2(269.5,183.3))); return fract(sin(p)*43758.5453); }
  50.  
  51. vec2 voronoi( in vec2 x )
  52. {
  53.     vec2 n = floor( x );
  54.     vec2 f = fract( x );
  55.  
  56.     vec3 m = vec3( 8.0 );
  57.     for( int j=-1; j<=1; j++ )
  58.     for( int i=-1; i<=1; i++ )
  59.     {
  60.         vec2  g = vec2( float(i), float(j) );
  61.         vec2  o = hash( n + g );
  62.         vec2  r = g - f + o;
  63.         float d = dot( r, r );
  64.         if( d<m.x ) m = vec3( d, o );
  65.     }
  66.  
  67.     return vec2( sqrt(m.x), m.y+m.z );
  68. }
  69.  
  70. //=======================================================
  71.  
  72. vec3 background( in vec3 d, in vec3 l )
  73. {
  74.     vec3 col = vec3(0.0);
  75.          col += 0.5*pow( fancyCube( iChannel1, d, 0.05, 5.0 ).zyx, vec3(2.0) );
  76.          col += 0.2*pow( fancyCube( iChannel1, d, 0.10, 3.0 ).zyx, vec3(1.5) );
  77.          col += 0.8*vec3(0.80,0.5,0.6)*pow( fancyCube( iChannel1, d, 0.1, 0.0 ).xxx, vec3(6.0) );
  78.     float stars = smoothstep( 0.3, 0.7, fancyCube( iChannel1, d, 0.91, 0.0 ).x );
  79.  
  80.     vec3 n = abs(d);
  81.     n = n*n*n;
  82.    
  83.     vec2 vxy = voronoi( 50.0*d.xy );
  84.     vec2 vyz = voronoi( 50.0*d.yz );
  85.     vec2 vzx = voronoi( 50.0*d.zx );
  86.     vec2 r = (vyz*n.x + vzx*n.y + vxy*n.z) / (n.x+n.y+n.z);
  87.     col += 0.5 * stars * clamp(1.0-(3.0+r.y*5.0)*r.x,0.0,1.0);
  88.  
  89.     col = 1.5*col - 0.2;
  90.     col += vec3(-0.05,0.1,0.0);
  91.  
  92.     float s = clamp( dot(d,l), 0.0, 1.0 );
  93.     col += 0.4*pow(s,5.0)*vec3(1.0,0.7,0.6)*2.0;
  94.     col += 0.4*pow(s,64.0)*vec3(1.0,0.9,0.8)*2.0;
  95.    
  96.     return col;
  97. }
  98.  
  99. //--------------------------------------------------------------------
  100.  
  101. const vec4 sph1 = vec4( 0.0, 0.0, 0.0, 1.0 );
  102.  
  103. float rayTrace( in vec3 ro, in vec3 rd )
  104. {
  105.     return shpIntersect( ro, rd, sph1 );
  106. }
  107.  
  108. float map( in vec3 pos )
  109. {
  110.     vec2 r = pos.xz - sph1.xz;
  111.     float h = 1.0-2.0/(1.0+0.3*dot(r,r));
  112.     return pos.y - h;
  113. }
  114.  
  115. float rayMarch( in vec3 ro, in vec3 rd, float tmax )
  116. {
  117.     float t = 0.0;
  118.    
  119.     // bounding plane
  120.     float h = (1.0-ro.y)/rd.y;
  121.     if( h>0.0 ) t=h;
  122.  
  123.     // raymarch
  124.     for( int i=0; i<20; i++ )    
  125.     {        
  126.         vec3 pos = ro + t*rd;
  127.         float h = map( pos );
  128.         if( h<0.001 || t>tmax ) break;
  129.         t += h;
  130.     }
  131.     return t;    
  132. }
  133.  
  134. vec3 render( in vec3 ro, in vec3 rd )
  135. {
  136.     vec3 lig = normalize( vec3(1.0,0.2,1.0) );
  137.     vec3 col = background( rd, lig );
  138.    
  139.     // raytrace stuff    
  140.     float t = rayTrace( ro, rd );
  141.  
  142.     if( t>0.0 )
  143.     {
  144.         vec3 mat = vec3( 0.18 );
  145.         vec3 pos = ro + t*rd;
  146.         vec3 nor = sphNormal( pos, sph1 );
  147.            
  148.         float am = 0.1*iTime;
  149.         vec2 pr = vec2( cos(am), sin(am) );
  150.         vec3 tnor = nor;
  151.         tnor.xz = mat2( pr.x, -pr.y, pr.y, pr.x ) * tnor.xz;
  152.  
  153.         float am2 = 0.08*iTime - 1.0*(1.0-nor.y*nor.y);
  154.         pr = vec2( cos(am2), sin(am2) );
  155.         vec3 tnor2 = nor;
  156.         tnor2.xz = mat2( pr.x, -pr.y, pr.y, pr.x ) * tnor2.xz;
  157.  
  158.         vec3 ref = reflect( rd, nor );
  159.         float fre = clamp( 1.0+dot( nor, rd ), 0.0 ,1.0 );
  160.  
  161.         float l = fancyCube( iChannel0, tnor, 0.03, 0.0 ).x;
  162.         l += -0.1 + 0.3*fancyCube( iChannel0, tnor, 8.0, 0.0 ).x;
  163.  
  164.         vec3 sea  = mix( vec3(0.0,0.07,0.2), vec3(0.0,0.01,0.3), fre );
  165.         sea *= 0.15;
  166.  
  167.         vec3 land = vec3(0.02,0.04,0.0);
  168.         land = mix( land, vec3(0.05,0.1,0.0), smoothstep(0.4,1.0,fancyCube( iChannel0, tnor, 0.1, 0.0 ).x ));
  169.         land *= fancyCube( iChannel0, tnor, 0.3, 0.0 ).xyz;
  170.         land *= 0.5;
  171.  
  172.         float los = smoothstep(0.45,0.46, l);
  173.         mat = mix( sea, land, los );
  174.  
  175.         vec3 wrap = -1.0 + 2.0*fancyCube( iChannel1, tnor2.xzy, 0.025, 0.0 ).xyz;
  176.         float cc1 = fancyCube( iChannel1, tnor2 + 0.2*wrap, 0.05, 0.0 ).y;
  177.         float clouds = smoothstep( 0.3, 0.6, cc1 );
  178.  
  179.         mat = mix( mat, vec3(0.93*0.15), clouds );
  180.  
  181.         float dif = clamp( dot(nor, lig), 0.0, 1.0 );
  182.         mat *= 0.8;
  183.         vec3 lin  = vec3(3.0,2.5,2.0)*dif;
  184.         lin += 0.01;
  185.         col = mat * lin;
  186.         col = pow( col, vec3(0.4545) );
  187.         col += 0.6*fre*fre*vec3(0.9,0.9,1.0)*(0.3+0.7*dif);
  188.  
  189.         float spe = clamp( dot(ref,lig), 0.0, 1.0 );
  190.         float tspe = pow( spe, 3.0 ) + 0.5*pow( spe, 16.0 );
  191.         col += (1.0-0.5*los)*clamp(1.0-2.0*clouds,0.0,1.0)*0.3*vec3(0.5,0.4,0.3)*tspe*dif;;
  192.     }
  193.    
  194.     // raymarch stuff    
  195.     float tmax = 20.0;
  196.     if( t>0.0 ) tmax = t;
  197.     t = rayMarch( ro, rd, tmax );    
  198.     if( t<tmax )
  199.     {
  200.         vec3 pos = ro + t*rd;
  201.  
  202.         vec2 scp = sin(2.0*6.2831*pos.xz);
  203.  
  204.         vec3 wir = vec3( 0.0 );
  205.         wir += 1.0*exp(-12.0*abs(scp.x));
  206.         wir += 1.0*exp(-12.0*abs(scp.y));
  207.         wir += 0.5*exp( -4.0*abs(scp.x));
  208.         wir += 0.5*exp( -4.0*abs(scp.y));
  209.         wir *= 0.2 + 1.0*sphSoftShadow( pos, lig, sph1, 4.0 );
  210.  
  211.         col += wir*0.5*exp( -0.05*t*t );
  212.     }        
  213.  
  214.     // outter glow
  215.     if( dot(rd,sph1.xyz-ro)>0.0 )
  216.     {
  217.         float d = sphDistance( ro, rd, sph1 );
  218.         vec3 glo = vec3(0.0);
  219.         glo += vec3(0.6,0.7,1.0)*0.3*exp(-2.0*abs(d))*step(0.0,d);
  220.         glo += 0.6*vec3(0.6,0.7,1.0)*0.3*exp(-8.0*abs(d));
  221.         glo += 0.6*vec3(0.8,0.9,1.0)*0.4*exp(-100.0*abs(d));
  222.         col += glo*1.5;
  223.     }        
  224.    
  225.     col *= smoothstep( 0.0, 6.0, iTime );
  226.  
  227.     return col;
  228. }
  229.  
  230. mat3 setCamera( in vec3 ro, in vec3 rt, in float cr )
  231. {
  232.     vec3 cw = normalize(rt-ro);
  233.     vec3 cp = vec3(sin(cr), cos(cr),0.0);
  234.     vec3 cu = normalize( cross(cw,cp) );
  235.     vec3 cv = normalize( cross(cu,cw) );
  236.     return mat3( cu, cv, -cw );
  237. }
  238.  
  239. void mainImage( out vec4 fragColor, in vec2 fragCoord )
  240. {
  241.     vec3 col = vec3(0.0);
  242. #if AA>1
  243.     #define ZERO min(iFrame,0)
  244.     for( int m=ZERO; m<AA; m++ )
  245.     for( int n=ZERO; n<AA; n++ )
  246.     {
  247.         // pixel coordinates
  248.         vec2 o = vec2(float(m),float(n)) / float(AA) - 0.5;
  249.         vec2 p = (2.0*(fragCoord+o)-iResolution.xy)/iResolution.y;
  250. #else    
  251.         vec2 p = (2.0*fragCoord-iResolution.xy)/iResolution.y;
  252. #endif
  253.  
  254.         float zo = 1.0 + smoothstep( 5.0, 15.0, abs(iTime-48.0) );
  255.         float an = 3.0 + 0.05*iTime + 6.0*iMouse.x/iResolution.x;
  256.         vec3 ro = zo*vec3( 2.0*cos(an), 1.0, 2.0*sin(an) );
  257.         vec3 rt = vec3( 1.0, 0.0, 0.0 );
  258.         mat3 cam = setCamera( ro, rt, 0.35 );
  259.         vec3 rd = normalize( cam * vec3( p, -2.0) );
  260.  
  261.         col += render( ro, rd );
  262.  
  263. #if AA>1
  264.     }
  265.     col /= float(AA*AA);
  266. #endif
  267.  
  268.     vec2 q = fragCoord / iResolution.xy;
  269.     col *= 0.2 + 0.8*pow( 16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y), 0.1 );
  270.  
  271.     fragColor = vec4( col, 1.0 );
  272. }
  273.  
  274. void mainVR( out vec4 fragColor, in vec2 fragCoord, in vec3 fragRayOri, in vec3 fragRayDir )
  275. {
  276.     float zo = 1.0 + smoothstep( 5.0, 15.0, abs(iTime-48.0) );
  277.     float an = 3.0 + 0.05*iTime;
  278.     vec3 ro = zo*vec3( 2.0*cos(an), 1.0, 2.0*sin(an) );
  279.  
  280.     vec3 rt = vec3( 1.0, 0.0, 0.0 );
  281.     mat3 cam = setCamera( ro, rt, 0.35 );
  282.    
  283.     fragColor = vec4( render( ro + cam*fragRayOri,
  284.                                    cam*fragRayDir ), 1.0 );
  285.  
  286. }
Tags: shaders
Advertisement
Add Comment
Please, Sign In to add comment