X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=shaders%2Fgpos.h;fp=shaders%2Fgpos.h;h=6b8d9cbd0576d32a4c240e75ce057a735b596492;hb=ecc4dfbfb3adf91d2dfc03ba0ec9a821fcc2390c;hp=0000000000000000000000000000000000000000;hpb=3bb0287d544a4cb75de9afe2927ac8e946f3a18e;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/shaders/gpos.h b/shaders/gpos.h new file mode 100644 index 0000000..6b8d9cb --- /dev/null +++ b/shaders/gpos.h @@ -0,0 +1,158 @@ +#ifndef SHADER_gpos_H +#define SHADER_gpos_H +static void shader_gpos_link(void); +static void shader_gpos_register(void); +static struct vg_shader _shader_gpos = { + .name = "gpos", + .link = shader_gpos_link, + .vs = +{ +.orig_file = "../shaders/standard.vs", +.static_src = +"layout (location=0) in vec3 a_co;\n" +"layout (location=1) in vec3 a_norm;\n" +"layout (location=2) in vec4 a_colour;\n" +"layout (location=3) in vec2 a_uv;\n" +"\n" +"#line 2 0 \n" +"\n" +"uniform mat4 uPv;\n" +"uniform mat4x3 uMdl;\n" +"\n" +"out vec4 aColour;\n" +"out vec2 aUv;\n" +"out vec3 aNorm;\n" +"out vec3 aCo;\n" +"\n" +"void main()\n" +"{\n" +" gl_Position = uPv * vec4( uMdl * vec4(a_co,1.0), 1.0 );\n" +" aColour = a_colour;\n" +" aUv = a_uv;\n" +" aNorm = mat3(uMdl) * a_norm;\n" +" aCo = a_co;\n" +"}\n" +""}, + .fs = +{ +.orig_file = "../shaders/gpos.fs", +.static_src = +"out vec4 FragColor;\n" +"\n" +"uniform vec3 uCamera;\n" +"\n" +"in vec4 aColour;\n" +"in vec2 aUv;\n" +"in vec3 aNorm;\n" +"in vec3 aCo;\n" +"\n" +"#line 1 1 \n" +"layout (std140) uniform ub_world_lighting\n" +"{\n" +" vec3 g_directional;\n" +" vec3 g_sun_colour;\n" +" vec3 g_shadow_colour;\n" +" vec4 g_water_plane;\n" +" vec4 g_depth_bounds;\n" +" float g_water_fog;\n" +"};\n" +"\n" +"uniform sampler2D g_world_depth;\n" +"\n" +"// Standard diffuse + spec models\n" +"// ==============================\n" +"\n" +"vec3 do_light_diffuse( vec3 vfrag, vec3 wnormal )\n" +"{\n" +" float flight = dot( g_directional, wnormal )*0.5+0.5;\n" +" return vfrag * mix( g_shadow_colour, g_sun_colour, flight );\n" +"}\n" +"\n" +"vec3 do_light_spec( vec3 vfrag, vec3 wnormal, vec3 halfview, float fintensity )\n" +"{\n" +" vec3 specdir = reflect( -g_directional, wnormal );\n" +" float spec = pow(max(dot( halfview, specdir ), 0.0), 10.0);\n" +" return vfrag + g_sun_colour*spec*fintensity;\n" +"}\n" +"\n" +"float world_depth_sample( vec3 pos )\n" +"{\n" +" vec2 depth_coord = (pos.xz - g_depth_bounds.xy) * g_depth_bounds.zw; \n" +" return texture( g_world_depth, depth_coord ).r;\n" +"}\n" +"\n" +"float shadow_sample( vec3 vdir )\n" +"{\n" +" vec3 sample_pos = aCo + vdir;\n" +" float height_sample = world_depth_sample( sample_pos );\n" +"\n" +" float fdelta = height_sample - sample_pos.y;\n" +" return clamp( fdelta, 0.1, 0.2 )-0.1;\n" +"}\n" +"\n" +"vec3 do_light_shadowing( vec3 vfrag )\n" +"{\n" +" float faccum = 0.0;\n" +" faccum += shadow_sample( vec3( 0.0, 0.5, 0.0 ));\n" +" faccum += shadow_sample( vec3( 2.0, 0.3, 0.0 ));\n" +" faccum += shadow_sample( vec3( 3.0, 1.0, 0.0 ));\n" +" faccum += shadow_sample( vec3( 5.0, 1.0, 0.0 ));\n" +" faccum += shadow_sample( vec3( 0.0, 0.5, 0.0 )*1.5);\n" +" faccum += shadow_sample( vec3( 2.0, 0.3, 0.0 )*1.5);\n" +" faccum += shadow_sample( vec3( 3.0, 1.0, 0.0 )*1.5);\n" +" faccum += shadow_sample( vec3( 5.0, 1.0, 0.0 )*1.5);\n" +" return mix( vfrag, g_shadow_colour, faccum );\n" +"}\n" +"\n" +"\n" +"#line 11 0 \n" +"\n" +"// Water blending\n" +"// ==============\n" +"\n" +"float water_depth( vec3 pos, vec3 halfview )\n" +"{\n" +" vec3 pnorm = g_water_plane.xyz;\n" +" float pdist = g_water_plane.w;\n" +"\n" +" float d = dot( pnorm, halfview );\n" +" float t = dot((pnorm*pdist - pos), pnorm) / d;\n" +" return t * g_water_fog;\n" +"}\n" +"\n" +"void main()\n" +"{\n" +" vec3 halfview = normalize( uCamera - aCo );\n" +" vec3 world_pos = vec3( aCo.y, aCo.x, aCo.z );\n" +" FragColor = vec4( world_pos, water_depth( aCo, halfview ) );\n" +"}\n" +""}, +}; + +static GLuint _uniform_gpos_uPv; +static GLuint _uniform_gpos_uMdl; +static GLuint _uniform_gpos_uCamera; +static GLuint _uniform_gpos_g_world_depth; +static void shader_gpos_uPv(m4x4f m){ + glUniformMatrix4fv( _uniform_gpos_uPv, 1, GL_FALSE, (float *)m ); +} +static void shader_gpos_uMdl(m4x3f m){ + glUniformMatrix4x3fv( _uniform_gpos_uMdl, 1, GL_FALSE, (float *)m ); +} +static void shader_gpos_uCamera(v3f v){ + glUniform3fv( _uniform_gpos_uCamera, 1, v ); +} +static void shader_gpos_g_world_depth(int i){ + glUniform1i( _uniform_gpos_g_world_depth, i ); +} +static void shader_gpos_register(void){ + vg_shader_register( &_shader_gpos ); +} +static void shader_gpos_use(void){ glUseProgram(_shader_gpos.id); } +static void shader_gpos_link(void){ + _uniform_gpos_uPv = glGetUniformLocation( _shader_gpos.id, "uPv" ); + _uniform_gpos_uMdl = glGetUniformLocation( _shader_gpos.id, "uMdl" ); + _uniform_gpos_uCamera = glGetUniformLocation( _shader_gpos.id, "uCamera" ); + _uniform_gpos_g_world_depth = glGetUniformLocation( _shader_gpos.id, "g_world_depth" ); +} +#endif /* SHADER_gpos_H */