From: hgn Date: Mon, 31 Oct 2022 19:04:17 +0000 (+0000) Subject: 1.0 X-Git-Url: https://skaterift.com/git/?a=commitdiff_plain;h=37d87919a54110cf7964bd1843fc69bda12d32d7;p=carveJwlIkooP6JGAAIwe30JlM.git 1.0 --- diff --git a/main.c b/main.c index 22052fa..e105621 100644 --- a/main.c +++ b/main.c @@ -19,8 +19,8 @@ */ #define VG_3D -//#define VG_STATIC static -#define VG_STATIC +#define VG_STATIC static +//#define VG_STATIC //#define VG_MINIMAL_TEST #ifndef VG_MINIMAL_TEST diff --git a/models_src/ch_outlaw.mdl b/models_src/ch_outlaw.mdl index 6ff28b6..f3d7858 100644 Binary files a/models_src/ch_outlaw.mdl and b/models_src/ch_outlaw.mdl differ diff --git a/shaders.sh b/shaders.sh index f2ca0d4..79604a6 100755 --- a/shaders.sh +++ b/shaders.sh @@ -21,6 +21,7 @@ shader fscolour blit.vs colour.fs shader alphatest standard.vs std_alphatest.fs shader scoretext scoretext.vs vblend.fs shader water standard.vs water.fs +shader water_fast standard.vs water_fast.fs shader gate gate.vs gate.fs shader gatelq gate.vs gate_lq.fs shader route standard.vs route.fs diff --git a/shaders/water_fast.fs b/shaders/water_fast.fs new file mode 100644 index 0000000..2919e09 --- /dev/null +++ b/shaders/water_fast.fs @@ -0,0 +1,60 @@ +out vec4 FragColor; + +uniform sampler2D uTexDudv; + +uniform float uTime; +uniform vec3 uCamera; +uniform float uSurfaceY; + +uniform vec3 uShoreColour; +uniform vec3 uOceanColour; + +in vec4 aColour; +in vec2 aUv; +in vec3 aNorm; +in vec3 aCo; +in vec3 aWorldCo; + +#include "common_world.glsl" + +vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue ) +{ + vec3 surface_tint = mix(uShoreColour, uOceanColour, depthvalue); + + float ffresnel = pow(1.0-dot( vnorm, halfview ),5.0); + + vec3 lightdir = vec3(0.95,0.0,-0.3); + vec3 specdir = reflect( -lightdir, vnorm ); + float spec = pow(max(dot(halfview,specdir),0.0),20.0)*0.3; + + return vec4( surface_tint + spec, max(min(depthvalue*4.0, 1.0),0.0) ); +} + +void main() +{ + // Surface colour composite + float depthvalue = clamp( -world_depth_sample( aCo )*(1.0/25.0), 0.0, 1.0 ); + + vec2 world_coord = aCo.xz * 0.008; + vec4 time_offsets = vec4( uTime ) * vec4( 0.008, 0.006, 0.003, 0.03 ); + vec4 dudva = texture( uTexDudv, world_coord + time_offsets.xy )-0.5; + vec4 dudvb = texture( uTexDudv, world_coord *7.0 - time_offsets.zw )-0.5; + + vec3 surfnorm = dudva.rgb + dudvb.rgb; + surfnorm = normalize(vec3(0.0,1.0,0.0) + dudva.xyz*0.4 + dudvb.xyz*0.1); + + // Foam + float fband = fract( aCo.z*0.02+uTime*0.1+depthvalue*10.0 ); + fband = step( fband+dudva.a*0.8, 0.3 ) * max((1.0-depthvalue*4.0),0.0); + + // Lighting + vec3 halfview = -normalize( aCo-uCamera ); + + // Fog + float fdist = pow(length( aCo.xz-uCamera.xz ) * 0.00047, 2.6); + + // Composite + vec4 vsurface = water_surf( halfview, surfnorm, depthvalue ); + vsurface.a -= fdist; + FragColor = mix( vsurface, vec4(1.0,1.0,1.0,0.5), fband ); +} diff --git a/shaders/water_fast.h b/shaders/water_fast.h new file mode 100644 index 0000000..7b92ea8 --- /dev/null +++ b/shaders/water_fast.h @@ -0,0 +1,257 @@ +#ifndef SHADER_water_fast_H +#define SHADER_water_fast_H +static void shader_water_fast_link(void); +static void shader_water_fast_register(void); +static struct vg_shader _shader_water_fast = { + .name = "water_fast", + .link = shader_water_fast_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 vec2 a_uv;\n" +"layout (location=3) in vec4 a_colour;\n" +"layout (location=4) in vec4 a_weights;\n" +"layout (location=5) in ivec4 a_groups;\n" +"\n" +"#line 2 0 \n" +"\n" +"uniform mat4x3 uMdl;\n" +"uniform mat4 uPv;\n" +"\n" +"out vec4 aColour;\n" +"out vec2 aUv;\n" +"out vec3 aNorm;\n" +"out vec3 aCo;\n" +"out vec3 aWorldCo;\n" +"\n" +"void main()\n" +"{\n" +" vec3 world_pos = uMdl * vec4(a_co,1.0);\n" +" gl_Position = uPv * vec4( world_pos, 1.0 );\n" +" aColour = a_colour;\n" +" aUv = a_uv;\n" +" aNorm = mat3(uMdl) * a_norm;\n" +" aCo = a_co;\n" +" aWorldCo = world_pos;\n" +"}\n" +""}, + .fs = +{ +.orig_file = "../../shaders/water_fast.fs", +.static_src = +"out vec4 FragColor;\n" +"\n" +"uniform sampler2D uTexDudv;\n" +"\n" +"uniform float uTime;\n" +"uniform vec3 uCamera;\n" +"uniform float uSurfaceY;\n" +"\n" +"uniform vec3 uShoreColour;\n" +"uniform vec3 uOceanColour;\n" +"\n" +"in vec4 aColour;\n" +"in vec2 aUv;\n" +"in vec3 aNorm;\n" +"in vec3 aCo;\n" +"in vec3 aWorldCo;\n" +"\n" +"#line 1 1 \n" +"layout (std140) uniform ub_world_lighting\n" +"{\n" +" vec4 g_light_colours[3];\n" +" vec4 g_light_directions[3];\n" +" vec4 g_ambient_colour;\n" +"\n" +" vec4 g_water_plane;\n" +" vec4 g_depth_bounds;\n" +" float g_water_fog;\n" +" int g_light_count;\n" +" int g_light_preview;\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" +" vec3 vtotal = g_ambient_colour.rgb;\n" +"\n" +" for( int i=0; iinfo.shader == k_shader_water ) + { + shader_water_uShoreColour( mat->info.colour ); + shader_water_uOceanColour( mat->info.colour1 ); - mesh_bind( &world.mesh_no_collide ); + mdl_draw_submesh( &mat->sm_no_collide ); + } + } - for( int i=0; iinfo.shader == k_shader_water ) + vg_tex2d_bind( &tex_water_surf, 1 ); + shader_water_fast_uTexDudv( 1 ); + shader_water_fast_uTime( world.time ); + shader_water_fast_uCamera( camera[3] ); + shader_water_fast_uSurfaceY( world.water.height ); + shader_link_standard_ub( _shader_water_fast.id, 2 ); + + m4x3f full; + m4x3_identity( full ); + shader_water_fast_uMdl( full ); + shader_water_fast_uPv( pv ); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + mesh_bind( &world.mesh_no_collide ); + + for( int i=0; iinfo.colour ); - shader_water_uOceanColour( mat->info.colour1 ); + struct world_material *mat = &world.materials[i]; - mdl_draw_submesh( &mat->sm_no_collide ); + if( mat->info.shader == k_shader_water ) + { + shader_water_fast_uShoreColour( mat->info.colour ); + shader_water_fast_uOceanColour( mat->info.colour1 ); + + mdl_draw_submesh( &mat->sm_no_collide ); + } } - } - glDisable(GL_BLEND); + glDisable(GL_BLEND); + } } #endif /* WATER_H */