Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 

116 řádky
3.0 KiB

  1. -- GLSL.Vert --
  2. #version 120
  3. void main()
  4. {
  5. gl_Position=gl_Vertex;
  6. gl_TexCoord[0]=gl_MultiTexCoord0;
  7. }
  8. -- GLSL.Frag --
  9. #version 120
  10. uniform sampler2D texture;
  11. uniform vec2 screen_size;
  12. uniform float time;
  13. uniform float deform;
  14. uniform vec3 filter;
  15. uniform vec3 retrace;
  16. uniform float noise;
  17. uniform float noise_h;
  18. uniform float noise_v;
  19. uniform float aberration;
  20. uniform bool moire;
  21. uniform vec4 moire_h;
  22. uniform vec4 moire_v;
  23. uniform bool scanline;
  24. uniform vec4 scanline_h;
  25. uniform vec4 scanline_v;
  26. uniform float flash;
  27. uniform float sync;
  28. const float PI=3.14159265358979323846;
  29. vec2 zoom(in vec2 p,in float radius)
  30. {
  31. float d=deform+sync*0.0625;
  32. float zoom=1.5-(radius*cos(p.x*d)+radius*cos(p.y*d));
  33. return p*zoom-0.5;
  34. }
  35. vec3 get_color(in sampler2D tex,in vec2 p)
  36. {
  37. return texture2D(tex,clamp(p,-1.0,0.0)).xyz;
  38. }
  39. float rand(in vec2 p)
  40. {
  41. return fract(sin(dot(p,vec2(12.9898,78.233)))*43758.5453);
  42. }
  43. float letterbox(in vec2 p,in float radius,in float smooth)
  44. {
  45. return 1.0-smoothstep(smooth,1.0,length(max(abs(p*2.0+1.0)+vec2(radius),0.0))-radius);
  46. }
  47. void main(void)
  48. {
  49. vec2 q=gl_FragCoord.xy/screen_size.xy;
  50. vec2 p=-1.0+2.0*gl_FragCoord.xy/screen_size.xy;
  51. p.y+=0.025*sync;
  52. vec2 z =zoom(p,0.5250);
  53. vec2 z1=zoom(p,0.5225);
  54. vec2 z2=zoom(p,0.5275);
  55. float mask=q.x*(6.0-q.x*6.0)*q.y*(6.0-q.y*6.0);
  56. float rnd1=rand(vec2(p.x+time,p.y-time));
  57. float rnd2=rand(vec2(p.x-time,p.y+time));
  58. float d1=(noise_h-noise_h*2.0*rnd1)/float(screen_size.x);
  59. float d2=(noise_v-noise_v*2.0*rnd1)/float(screen_size.y);
  60. vec3 source;
  61. source.x=get_color(texture,vec2(z.x+d1,z.y)).x;
  62. source.y=get_color(texture,vec2(z.x+d1,z.y)).y;
  63. source.z=get_color(texture,vec2(z.x+d1,z.y)).z;
  64. vec3 glass1=get_color(texture,z1);
  65. vec3 glass2=get_color(texture,z2);
  66. float v=aberration/float(screen_size.x)+aberration/float(screen_size.x)*(2.0-mask);
  67. vec3 scramble;
  68. scramble.x=get_color(texture,vec2(z.x+d1-v,z.y+d2)).x;
  69. scramble.y=get_color(texture,vec2(z.x+d1 ,z.y+d2)).y;
  70. scramble.z=get_color(texture,vec2(z.x+d1+v,z.y+d2)).z;
  71. vec3 color=source+glass1*glass1*0.25+glass2*glass2*0.25;
  72. color+=flash; // flash
  73. color+=scramble; // scramble
  74. color-=retrace.x*mod(z.y*retrace.y+time*retrace.z,1.0); // retrace
  75. color-=(vec3(rnd1,rnd1,rnd1)-vec3(rnd2,rnd2,rnd2))*noise; // noise
  76. if(moire)
  77. {
  78. color*=moire_h.x+moire_h.y*sin(z.y*float(screen_size.y*moire_h.z))*sin(0.5+z.x*float(screen_size.x*moire_h.w)); // moire h
  79. color*=moire_v.x+moire_v.y*sin(z.x*float(screen_size.x*moire_v.z))*sin(0.5+z.y*float(screen_size.y*moire_v.w)); // moire v
  80. }
  81. else
  82. {
  83. color*=(moire_h.x+moire_v.x)*0.5;
  84. }
  85. if(scanline)
  86. {
  87. color*=scanline_h.x+scanline_h.y*cos(z.y*float(screen_size.y*scanline_h.z+scanline_h.w)); // scanline h
  88. color*=scanline_v.x+scanline_v.y*cos(z.x*float(screen_size.x*scanline_v.z+scanline_v.w)); // scanline v
  89. }
  90. else
  91. {
  92. color*=(scanline_h.x+scanline_v.x)*0.5;
  93. }
  94. color*=filter; // hue
  95. color*=mask; // vignetting
  96. color*=letterbox(z,-0.75,0.95); // letterbox
  97. gl_FragColor=vec4(color,1.0);
  98. }