1 | [vert.glsl] |
---|
2 | |
---|
3 | #version 120 |
---|
4 | |
---|
5 | void main() |
---|
6 | { |
---|
7 | gl_Position = gl_Vertex; |
---|
8 | } |
---|
9 | |
---|
10 | [frag.glsl] |
---|
11 | |
---|
12 | #version 120 |
---|
13 | |
---|
14 | uniform sampler2D texture; |
---|
15 | uniform vec2 screen_size; |
---|
16 | uniform vec2 ratio_2d; |
---|
17 | uniform float time; |
---|
18 | uniform vec2 deform; |
---|
19 | uniform vec4 ghost1; |
---|
20 | uniform vec4 ghost2; |
---|
21 | uniform vec4 glass; |
---|
22 | uniform vec3 gradient; |
---|
23 | uniform vec3 gradient_color; |
---|
24 | uniform float vignetting; |
---|
25 | uniform float aberration; |
---|
26 | uniform vec4 moire_h; |
---|
27 | uniform vec4 moire_v; |
---|
28 | uniform vec4 scanline_h; |
---|
29 | uniform vec4 scanline_v; |
---|
30 | uniform vec3 corner; |
---|
31 | uniform float sync; |
---|
32 | uniform float beat; |
---|
33 | |
---|
34 | const float PI=3.14159265358979323846; |
---|
35 | vec2 angle=screen_size*PI; |
---|
36 | |
---|
37 | vec2 screen(in vec2 p,in float bend,in float radius) |
---|
38 | { |
---|
39 | float d=bend+sync*0.0625+beat*0.0375; |
---|
40 | return p*(1.5-(radius*cos(p.x*d)+radius*cos(p.y*d)))-0.5; |
---|
41 | } |
---|
42 | |
---|
43 | vec3 get_color(in sampler2D tex,in vec2 p) |
---|
44 | { |
---|
45 | return texture2D(tex,clamp(p,-1.0,0.0)).xyz; |
---|
46 | } |
---|
47 | |
---|
48 | float letterbox(in vec2 p,in float w,in float radius,in float smooth) |
---|
49 | { |
---|
50 | return 1.0-smoothstep(smooth,1.0,length(max(abs(p*w+w/2.0)-vec2(radius),0.0))+radius); |
---|
51 | } |
---|
52 | |
---|
53 | void main(void) |
---|
54 | { |
---|
55 | vec2 q=gl_FragCoord.xy/screen_size.xy; |
---|
56 | vec2 p=-1.0+2.0*gl_FragCoord.xy/screen_size.xy; |
---|
57 | p.y+=0.025*sync; |
---|
58 | vec2 z=screen(p,deform.x,deform.y); |
---|
59 | vec2 z1=screen(p,deform.x,deform.y+ghost1.z); |
---|
60 | vec2 z2=screen(p,deform.x,deform.y+ghost2.z); |
---|
61 | vec2 z3=screen(p,glass.w,deform.y+glass.x-glass.y); |
---|
62 | vec2 z4=screen(p,glass.w,deform.y+glass.x+glass.y); |
---|
63 | float mask=q.x*(6.0-q.x*6.0)*q.y*(6.0-q.y*6.0); |
---|
64 | |
---|
65 | vec3 source=get_color(texture,z); |
---|
66 | vec3 g1=get_color(texture,z1-ghost1.xy); |
---|
67 | vec3 g2=get_color(texture,z2-ghost2.xy); |
---|
68 | vec3 g3=get_color(texture,z3); |
---|
69 | vec3 g4=get_color(texture,z4); |
---|
70 | |
---|
71 | vec3 c=source+g1*ghost1.w+g2*ghost2.w; // mix |
---|
72 | |
---|
73 | float v=aberration/float(screen_size.x/ratio_2d.x); //+aberration/float(screen_size.x)*(2.0-mask); |
---|
74 | vec3 ca1=get_color(texture,vec2(z.x-v,z.y)); |
---|
75 | vec3 ca2=get_color(texture,vec2(z.x+v,z.y)); |
---|
76 | c+=vec3(ca1.x,c.y,ca2.z); // chromatic aberration |
---|
77 | |
---|
78 | vec3 c1=vec3(gradient_color.x,gradient_color.y,gradient_color.z); |
---|
79 | vec3 c2=vec3(gradient_color.x,gradient_color.y,gradient_color.z)/4; |
---|
80 | vec3 c3=vec3(1.0,1.0,1.0); |
---|
81 | vec3 c4=vec3(gradient_color.z,gradient_color.y,gradient_color.x); |
---|
82 | vec3 c5=vec3(gradient_color.z,gradient_color.y,gradient_color.x)/4; |
---|
83 | vec3 r; |
---|
84 | float r_p=gradient.x; |
---|
85 | float r_h=gradient.y; |
---|
86 | float r_h2=gradient.y/2; |
---|
87 | float k=z.y+1.0; |
---|
88 | |
---|
89 | if(k<=r_p-r_h2) r=mix(c1,c2,k*(1/(r_p-r_h2))); |
---|
90 | if(k>r_p-r_h2&&k<=r_p) r=mix(c2,c3,(k-(r_p-r_h2))*(1/r_h2)); |
---|
91 | if(k>r_p&&k<r_p+r_h) r=mix(c3,c4,(k-r_p)*(1/r_h)); |
---|
92 | if(k>=r_p+r_h) r=mix(c4,c5,k*((k-(r_p+r_h))/(r_p-r_h))); |
---|
93 | |
---|
94 | //c*=moire_h.x+moire_h.y*sin(z.y*float(screen_size.y*moire_h.z)/ratio_2d.y)*sin(0.5+z.x*float(screen_size.x*moire_h.w)/ratio_2d.x); // moire h |
---|
95 | //c*=moire_v.x+moire_v.y*sin(z.x*float(screen_size.x*moire_v.z)/ratio_2d.x)*sin(0.5+z.y*float(screen_size.y*moire_v.w)/ratio_2d.y); // moire v |
---|
96 | |
---|
97 | c*=moire_h.x+moire_h.y*sin(z.y*float(angle.y*moire_h.z)/ratio_2d.y)*sin(PI+z.x*float(screen_size.x*moire_h.w)/ratio_2d.x); // moire h |
---|
98 | c*=moire_v.x+moire_v.y*sin(z.x*float(angle.x*moire_v.z)/ratio_2d.x)*sin(PI+z.y*float(screen_size.y*moire_v.w)/ratio_2d.y); // moire v |
---|
99 | c*=scanline_h.x+scanline_h.y*cos(z.y*float(angle.y*scanline_h.z+scanline_h.w)/ratio_2d.y); // scanline h |
---|
100 | c*=scanline_v.x+scanline_v.y*cos(z.x*float(angle.x*scanline_v.z+scanline_v.w)/ratio_2d.x); // scanline v |
---|
101 | c+=r*gradient.z; // gradient |
---|
102 | c*=mix(1.0,mask,vignetting); // vignetting |
---|
103 | c*=letterbox(z,corner.x+2.0,corner.y,corner.z); // corner |
---|
104 | c+=(g3+g4)*glass.z; // glass |
---|
105 | gl_FragColor=vec4(c,1.0); |
---|
106 | } |
---|