source: trunk/tools/neercs/video/postfx.lolfx @ 2039

Last change on this file since 2039 was 2039, checked in by rez, 8 years ago

neercs: added a protection glass above the monitor

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