josemorval

Pencil shader

Oct 5th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.47 KB | None | 0 0
  1. const mat2 rot180 = mat2(cos(3.14159),sin(3.14159),-sin(3.14159),cos(3.14159));
  2. float time = iGlobalTime;
  3.  
  4. vec3 rgbcol(float r, float g, float b){
  5.   return vec3(r/256.,g/256.,b/256.);
  6. }
  7.  
  8. float sineCurve(vec2 p){
  9.   return p.x-sin(3.*p.y-8.*time);
  10. }
  11.  
  12. vec2 gradSineCurve(vec2 p){
  13.   vec2 h = vec2( 0.1, 0.0 );
  14.     return vec2( sineCurve(p+h.xy) - sineCurve(p-h.xy),
  15.                  sineCurve(p+h.yx) - sineCurve(p-h.yx) )/(2.0*h.x);
  16. }
  17.  
  18. float boxRegion(vec2 p,float a, float b){
  19.   return min(1.-abs(a*p.x),1.-abs(b*p.y));
  20. }
  21.  
  22. float pseudoCircle(vec2 p,float r, float alpha){
  23.   float f = pow(p.x,alpha)+pow(p.y,alpha);
  24.   return r-pow(f,1./alpha);
  25. }
  26.  
  27. float triangle(vec2 p,float a,float b){
  28.   return min(p.y,min(p.x-p.y+0.5,-p.x-p.y+0.5));
  29. }
  30.  
  31. void main(){
  32.  
  33.   float angle = sin(8.*time);
  34.   mat2 m = mat2(cos(angle),sin(angle),-sin(angle),cos(angle));
  35.  
  36.   vec2 p = gl_FragCoord.xy/iResolution.xy-0.5;
  37.   p.x*=iResolution.x/iResolution.y;
  38.  
  39.   //Curve
  40.   vec2 pcurve = 10.*p;
  41.   float lineCurve = abs(sineCurve(pcurve));
  42.   vec2 gradLineCurve = gradSineCurve(pcurve);
  43.   lineCurve = lineCurve/length(gradLineCurve);
  44.   lineCurve = smoothstep(0.025,0.025,lineCurve)+step(0.,-pcurve.y);
  45.   lineCurve = clamp(0.,1.,lineCurve);
  46.  
  47.   //Base pencil
  48.   vec3 colBasePencil;
  49.  
  50.   float height = cos(8.*time);
  51.   height*=height;
  52.  
  53.   vec2 ppencil = (m*(p-vec2(0.0,0.05*height+0.07)));
  54.   float basePencil = boxRegion(ppencil,15.,5.);
  55.   basePencil = step(0.5,basePencil);
  56.   basePencil = max(step(0.,pseudoCircle(30.*ppencil+vec2(0.,-3.),1.,2.5)),basePencil);
  57.  
  58.   float bandcircle = step(0.,length(ppencil)-0.05)*step(0.,0.07-length(ppencil));
  59.   colBasePencil = vec3(1.0)*basePencil;
  60.   colBasePencil = mix(colBasePencil,rgbcol(102.,204.,255.),bandcircle);
  61.   colBasePencil = mix(colBasePencil,0.85*colBasePencil,step(0.02,-ppencil.x)*basePencil);
  62.  
  63.   //Corner pencil
  64.   vec3 colCornerPencil;
  65.   float cornerPencil = step(0.,triangle(vec2(15.,12.)*(rot180*ppencil+vec2(0.,-0.1)),1.,2.));
  66.  
  67.   colCornerPencil = rgbcol(244.,240.,194.)*cornerPencil;
  68.   colCornerPencil = mix(colCornerPencil,rgbcol(102.,204.,255.),step(0.125,-ppencil.y)*cornerPencil);
  69.   colCornerPencil = mix(colCornerPencil,0.85*colCornerPencil,step(0.0,-ppencil.x-0.6*ppencil.y-0.08)*cornerPencil);
  70.  
  71.   //Layer combination
  72.   vec3 col = rgbcol(45.,53.,89.);
  73.   col = mix(rgbcol(102.,204.,255.),col,lineCurve);
  74.   col = mix(col,colBasePencil,basePencil);
  75.   col = mix(col,colCornerPencil,cornerPencil);
  76.  
  77.   gl_FragColor = vec4(col,1.0);
  78. }
Advertisement
Add Comment
Please, Sign In to add comment