first sorta working port
[fishladder.git] / shaders / background.h
1 #ifndef SHADER_background_H
2 #define SHADER_background_H
3 static void shader_background_link(void);
4 static void shader_background_register(void);
5 static struct vg_shader _shader_background = {
6 .name = "background",
7 .link = shader_background_link,
8 .vs =
9 {
10 .orig_file = "shaders/background.vs.glsl",
11 .static_src =
12 "layout (location=0) in vec2 a_co;\n"
13 "uniform mat3 uPv;\n"
14 "uniform vec3 uOffset;\n"
15 "\n"
16 "out vec2 aTexCoords;\n"
17 "\n"
18 "void main(){\n"
19 " vec2 world_pos = a_co * uOffset.z + uOffset.xy;\n"
20 " gl_Position = vec4( uPv * vec3( world_pos, 1.0 ), 1.0 );\n"
21 " aTexCoords = a_co;\n"
22 "}\n"
23 ""},
24 .fs =
25 {
26 .orig_file = "shaders/background.fs.glsl",
27 .static_src =
28 "out vec4 FragColor;\n"
29 "\n"
30 "uniform sampler2D uTexMain;\n"
31 "uniform sampler2D uSamplerNoise;\n"
32 "uniform float uVariance;\n"
33 "uniform float uVisibility;\n"
34 "\n"
35 "in vec2 aTexCoords;\n"
36 "\n"
37 "void main(){\n"
38 " vec4 data_this_tile = texture( uTexMain, aTexCoords );\n"
39 "\n"
40 " float ao_accum = 0.0;\n"
41 " vec2 random_noise;\n"
42 "\n"
43 " for( int i=0; i<10; ++i ){\n"
44 " random_noise = (texture( uSamplerNoise, \n"
45 " aTexCoords*10.0 + float(i)*0.2 ).xy - vec2(0.5)) \n"
46 " * uVariance;\n"
47 " vec4 background = texture( uTexMain, aTexCoords + random_noise );\n"
48 " float height_diff = min(data_this_tile.r - background.r,0.0);\n"
49 " ao_accum += height_diff * clamp((1.0 - length( random_noise )), 0.0, 1.0);\n"
50 " }\n"
51 " ao_accum *= 0.15;\n"
52 "\n"
53 " vec2 square_coords = fract( aTexCoords * 64.0 );\n"
54 " vec2 grid_coords = abs( square_coords - 0.5 );\n"
55 " float gridline = step( 0.49, max(grid_coords.x,grid_coords.y) );\n"
56 "\n"
57 " vec3 colour_main = mix( vec3( 0.14 ) + random_noise.x*0.5, \n"
58 " vec3( 0.1 ) + gridline*0.02, \n"
59 " data_this_tile.g * uVisibility );\n"
60 " FragColor = vec4( colour_main + ao_accum*0.05, 1.0 );\n"
61 "}\n"
62 ""},
63 };
64
65 static GLuint _uniform_background_uPv;
66 static GLuint _uniform_background_uOffset;
67 static GLuint _uniform_background_uTexMain;
68 static GLuint _uniform_background_uSamplerNoise;
69 static GLuint _uniform_background_uVariance;
70 static GLuint _uniform_background_uVisibility;
71 static void shader_background_uPv(m3x3f m){
72 glUniformMatrix3fv(_uniform_background_uPv,1,GL_FALSE,(float*)m);
73 }
74 static void shader_background_uOffset(v3f const v){
75 glUniform3fv(_uniform_background_uOffset,1,v);
76 }
77 static void shader_background_uTexMain(int i){
78 glUniform1i(_uniform_background_uTexMain,i);
79 }
80 static void shader_background_uSamplerNoise(int i){
81 glUniform1i(_uniform_background_uSamplerNoise,i);
82 }
83 static void shader_background_uVariance(float f){
84 glUniform1f(_uniform_background_uVariance,f);
85 }
86 static void shader_background_uVisibility(float f){
87 glUniform1f(_uniform_background_uVisibility,f);
88 }
89 static void shader_background_register(void){
90 vg_shader_register( &_shader_background );
91 }
92 static void shader_background_use(void){ glUseProgram(_shader_background.id); }
93 static void shader_background_link(void){
94 _uniform_background_uPv = glGetUniformLocation( _shader_background.id, "uPv" );
95 _uniform_background_uOffset = glGetUniformLocation( _shader_background.id, "uOffset" );
96 _uniform_background_uTexMain = glGetUniformLocation( _shader_background.id, "uTexMain" );
97 _uniform_background_uSamplerNoise = glGetUniformLocation( _shader_background.id, "uSamplerNoise" );
98 _uniform_background_uVariance = glGetUniformLocation( _shader_background.id, "uVariance" );
99 _uniform_background_uVisibility = glGetUniformLocation( _shader_background.id, "uVisibility" );
100 }
101 #endif /* SHADER_background_H */