Advertisement
roninkoi

Glowy shader

Apr 3rd, 2020
526
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.03 KB | None | 0 0
  1. #version 410 core
  2.  
  3. uniform float fGlobalTime; // in seconds
  4. uniform vec2 v2Resolution; // viewport resolution (in pixels)
  5.  
  6. uniform sampler2D texChecker;
  7.  
  8. layout(location = 0) out vec4 out_color; // out_color must be written in order to see anything
  9.  
  10. #define PI 3.14159265
  11. #define MAXIT 128
  12. #define EPSILON 0.001
  13.  
  14. #define minx4(a, b) ((a.w) < (b.w) ? (a) : (b))
  15. #define minx2(a, b) ((a.x) < (b.x) ? (a) : (b))
  16.  
  17. #define MAT0 0.0
  18. #define MAT1 1.0
  19.  
  20. mat3 rotX(float a)
  21. {
  22.     return mat3(
  23.         1., 0., 0.,
  24.         0., cos(a), -sin(a),
  25.         0., sin(a), cos(a)
  26.     );
  27. }
  28.  
  29. mat3 rotY(float a)
  30. {
  31.     return mat3(
  32.         cos(a), 0.0, -sin(a),
  33.         0., 1., 0.,
  34.         sin(a), 0.0, cos(a)
  35.     );
  36. }
  37.  
  38. mat3 rotZ(float a)
  39. {
  40.     return mat3(
  41.         cos(a), -sin(a), 0.,
  42.         sin(a), cos(a), 0.,
  43.         0., 0., 1.
  44.     );
  45. }
  46.  
  47. float t;
  48.  
  49. float sphere(vec3 r, float a)
  50. {
  51.     return length(r) - a;
  52. }
  53.  
  54. float torus(vec3 r, vec2 a)
  55. {
  56.     a.y += sin(length(r.xy + t) * 7.) * 0.09;
  57.     vec2 p = vec2(length(r.xz) - a.x, r.y);
  58.     return length(p) - a.y;
  59. }
  60.  
  61. float plane(vec3 r, vec3 o, vec3 n) {
  62.     return dot(r - o, n);
  63. }
  64.  
  65. float box(vec3 r, vec3 a)
  66. {
  67.     vec3 p = abs(r) - a;
  68.     return length(max(p - p.x * 0.4 - p.y * 0.4, 0.)) + min(max(p.x - p.y * 0.5, max(p.y, p.z) - p.x * 0.3), 0.);
  69. }
  70.  
  71. float shade(vec3 n, vec3 rd)
  72. {
  73.     return clamp(max(dot(n, -rd), 0.) + 1., 0., 1.);
  74. }
  75.  
  76. vec3 fog(float z, vec3 col, vec3 fogCol)
  77. {
  78.     return mix(fogCol, col, exp(-z));
  79. }
  80.  
  81. mat3 obj;
  82.  
  83. vec2 map(vec3 r)
  84. {
  85.     obj = rotZ((-t + r.z * 0.2) * 0.3) * rotY(1. * t);
  86.    
  87.     vec2 b1 = vec2(
  88.         box(obj * obj * (r) + vec3(0., sin(2. * t) * 1., 0.), vec3(.75, .5, .5)),
  89.         MAT0
  90.     );
  91.    
  92.     vec2 t1 = vec2(
  93.         torus(- obj *r, vec2(2.0, 0.1)),
  94.         MAT1
  95.     );
  96.    
  97.     return minx2(b1, t1);
  98. }
  99.  
  100. float hash(vec2 r) {
  101.     return fract(sin(dot(r, vec2(15.5921, 96.654654))) * 23626.3663);
  102. }
  103.  
  104. vec3 matCol(vec2 o)
  105. {
  106.     if (o.y == MAT0)
  107.         return normalize(vec3(1., 0.5, .0));
  108.    
  109.     if (o.y == MAT1)
  110.         return normalize(vec3(0., 1.7, 0.0));
  111.    
  112.     return vec3(0.);
  113. }
  114.  
  115. void main(void)
  116. {
  117.     t = fGlobalTime;
  118.    
  119.     vec2 uv = gl_FragCoord.xy / v2Resolution;
  120.     uv -= 0.5;
  121.     uv.x *= v2Resolution.x / v2Resolution.y;
  122.    
  123.     mat3 cam = rotY(t * 0. - PI);
  124.        
  125.     vec3 ro = vec3(0., 0., -3.0);
  126.     vec3 rd = cam * normalize(vec3(uv * 2., -1.));
  127.     vec3 r = ro;
  128.    
  129.     vec3 bcol = normalize((vec3(1., 0., 1.0) + 0.5) * (uv.y + 0.3) * (sin(t) + 1.) + vec3(0., 0.5, 1.0)) * 1.5 + 0.4;
  130.     vec4 col = vec4(0.);
  131.     col.rgb = bcol;
  132.    
  133.     vec2 c = vec2(10000., MAT0);
  134.    
  135.     float sh = 1.;
  136.    
  137.     float glow = 0.;
  138.    
  139.     vec3 gcol = bcol;
  140.    
  141.     for (int i = 0; i < MAXIT; ++i) {
  142.         vec2 d = map(r);
  143.         float z = length(r - ro);
  144.        
  145.         glow += exp(-d.x * 5.);
  146.         gcol += matCol(d) * exp(-d.x * 1.);
  147.        
  148.         if (d.x < EPSILON) {
  149.             col.rgb = mix(col.rgb, matCol(d), shade(normalize(r), rd));
  150.             col.rgb = fog(z * 0.1, col.rgb, bcol);
  151.             break;
  152.         }
  153.        
  154.         d.x *= 0.7 - 0.1 * hash(uv);
  155.         r += rd * clamp(d.x, -0.5, 0.5) * 0.7;
  156.         //r += rd * d.w * 0.5;
  157.        
  158.         sh = (float(i) / float(MAXIT));
  159.     }
  160.    
  161.     col.rgb *= exp(-sh * .9);
  162.     col.rgb = mix(col.rgb, gcol, glow * 0.005);
  163.    
  164.     out_color = vec4(col.rgb, 1.);
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement