needs a lot of cleaning but lights are OK
[carveJwlIkooP6JGAAIwe30JlM.git] / shaders / blitblur.h
1 #ifndef SHADER_blitblur_H
2 #define SHADER_blitblur_H
3 static void shader_blitblur_link(void);
4 static void shader_blitblur_register(void);
5 static struct vg_shader _shader_blitblur = {
6 .name = "blitblur",
7 .link = shader_blitblur_link,
8 .vs =
9 {
10 .orig_file = "shaders/blit.vs",
11 .static_src =
12 "layout (location=0) in vec2 a_co;\n"
13 "out vec2 aUv;\n"
14 "\n"
15 "void main()\n"
16 "{\n"
17 " gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);\n"
18 " aUv = a_co;\n"
19 "}\n"
20 ""},
21 .fs =
22 {
23 .orig_file = "shaders/blitblur.fs",
24 .static_src =
25 "out vec4 FragColor;\n"
26 "uniform sampler2D uTexMain;\n"
27 "uniform sampler2D uTexMotion;\n"
28 "uniform float uBlurStrength;\n"
29 "uniform vec2 uOverrideDir;\n"
30 "\n"
31 "in vec2 aUv;\n"
32 "\n"
33 "vec2 rand_hash22( vec2 p )\n"
34 "{\n"
35 " vec3 p3 = fract(vec3(p.xyx) * 213.8976123);\n"
36 " p3 += dot(p3, p3.yzx+19.19);\n"
37 " return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));\n"
38 "}\n"
39 "\n"
40 "void main()\n"
41 "{\n"
42 " vec2 vcenter = (aUv-vec2(0.5))*vec2(2.0);\n"
43 " vec2 vrand = rand_hash22( aUv ) * 2.0 - vec2(1.0);\n"
44 " vec2 vrand1 = rand_hash22( vrand ) * 2.0 - vec2(1.0);\n"
45 " \n"
46 " vec2 vdir = texture( uTexMotion, aUv ).xy * uBlurStrength + uOverrideDir;\n"
47 "\n"
48 " vec4 vcolour0 = texture( uTexMain, aUv + vdir*vrand.x );\n"
49 " vec4 vcolour1 = texture( uTexMain, aUv + vdir*vrand.y );\n"
50 " vec4 vcolour2 = texture( uTexMain, aUv + vdir*vrand1.x );\n"
51 " vec4 vcolour3 = texture( uTexMain, aUv + vdir*vrand1.y );\n"
52 "\n"
53 " FragColor = ( vcolour0 + vcolour1 + vcolour2 + vcolour3 ) * 0.25;\n"
54 "}\n"
55 ""},
56 };
57
58 static GLuint _uniform_blitblur_uTexMain;
59 static GLuint _uniform_blitblur_uTexMotion;
60 static GLuint _uniform_blitblur_uBlurStrength;
61 static GLuint _uniform_blitblur_uOverrideDir;
62 static void shader_blitblur_uTexMain(int i){
63 glUniform1i(_uniform_blitblur_uTexMain,i);
64 }
65 static void shader_blitblur_uTexMotion(int i){
66 glUniform1i(_uniform_blitblur_uTexMotion,i);
67 }
68 static void shader_blitblur_uBlurStrength(float f){
69 glUniform1f(_uniform_blitblur_uBlurStrength,f);
70 }
71 static void shader_blitblur_uOverrideDir(v2f v){
72 glUniform2fv(_uniform_blitblur_uOverrideDir,1,v);
73 }
74 static void shader_blitblur_register(void){
75 vg_shader_register( &_shader_blitblur );
76 }
77 static void shader_blitblur_use(void){ glUseProgram(_shader_blitblur.id); }
78 static void shader_blitblur_link(void){
79 _uniform_blitblur_uTexMain = glGetUniformLocation( _shader_blitblur.id, "uTexMain" );
80 _uniform_blitblur_uTexMotion = glGetUniformLocation( _shader_blitblur.id, "uTexMotion" );
81 _uniform_blitblur_uBlurStrength = glGetUniformLocation( _shader_blitblur.id, "uBlurStrength" );
82 _uniform_blitblur_uOverrideDir = glGetUniformLocation( _shader_blitblur.id, "uOverrideDir" );
83 }
84 #endif /* SHADER_blitblur_H */