From 37d87919a54110cf7964bd1843fc69bda12d32d7 Mon Sep 17 00:00:00 2001 From: hgn Date: Mon, 31 Oct 2022 19:04:17 +0000 Subject: [PATCH] 1.0 --- main.c | 4 +- models_src/ch_outlaw.mdl | Bin 607424 -> 607424 bytes shaders.sh | 1 + shaders/water_fast.fs | 60 +++++++++ shaders/water_fast.h | 257 +++++++++++++++++++++++++++++++++++++++ world_water.h | 108 ++++++++++------ 6 files changed, 394 insertions(+), 36 deletions(-) create mode 100644 shaders/water_fast.fs create mode 100644 shaders/water_fast.h 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 6ff28b6a3ce579422419db1b76e9dabe7ea8de84..f3d78588041729450696b67dc85d709e414b5ffe 100644 GIT binary patch delta 2566 zcma)+4^UNg7RUR67tZV95FrAVsR54!`S%`(2=`u0;Ax;}iTo4UCnAD?qKJwCnjtEI znBr+gKy(;d(=|%ws&MZ$?FE&t%8KT?t3wKGsU@;3YijO6ory-B>CXJ#y>s68cYf!5 z@BN(Po869YcKg&-%PhBdzUaOoN?Q`8Wwb14S<)Iti=$;FMQN>P^=kbu{KzlR>jkYT zUuw8-ZRWHEhhG%d{yjiUy6B6mEFebP>KZ6EoZcX;nXbc&7T~5m6?amY`*uEmeRQT| zZ3zJu+K0!pM5hi}sCCt&k%Qu*?u=wH&tDa)S)Jg~xm74%6DB@Z3hZp0H*6BBoAX3EYaK4Of;rj|WAcT2>$1eC)fL!k1#6tj_Vw^$;{&mD zXVzHfcz1E>u_>Z2gc+nbYdCMMy+obHQ>UGyGcnMXT2Cdr7Cx~n%@)Y617ue|*_B9k z1v)^?W_BR}OH21^1A5+2maft5g1fck(>) zuH&(Hc+nBMwD4P(QmYe;w_$qhb%kUm<7_wZWCyXp4Swc4uiC0pFh>WTny-`JR36^{ zkI;+tI*4U1_&^8SnHO$zhZJ^9>UW0*#;UM-JOr|zuwy(WnTX5-Jh`C$FBJ{?4L)AK z-=XY4lLz=PJKRP$uCQg4U_i46++YLP=t+NE!%j~~=Ju`I#lL~!6DUs&=1hP@mVl=x z(2n&s{%Qd-FG_bw)~NyL=S90_p~(vpHSbj>tBvnEE2Gft1tlyMXLv&zn~P1}q%mWc zH%Kf3t9>ZA2{~Wb%1&aXFQszU@04$&*_UK*VZSf9vtk_W2Yp;_(D!mTI_OC{1MBtF z`c!Vz@5{{ykLcFA~o74c}=9MnFgBz={|t`Br5c4te*s>%ohEE=qzW~ zZoU&!gQ%Vs><^;S-79P5qv$pnnmN0yo5B0BYcjZN?){Lb-d($$_eY0ddapWM84M+w z`nkF4%{nXPB61-l3Qd@*mj5qL(P2Oc6`zl(gHgN`ryeucD!Eu0LRB5bFG9dznK~v< z8VCVr#(dFEAhnEB1n{&e^q8eKFb8$Pj6;67T7WmW&(Fjl=NNOBHL8n6?aVk zl8;!{s#Ik(3I}o%o~wT=gp+sOzbl^pw1e+`)u_DGW)>E;FM5_< zsd;C*64jY6-jK|5pwz;+$vHeIx?(`w^3QJG&+~oxJMXi+!KLt7nO+zilDqeN2M5Lf zB9>KM;oC>QBzx`nRwy`yquRVW3#t>IKBv5V8F?pV zxIA*vfN1~TzxWYnqm=UKcHUt*cE^D(*r{fs8nSw?d?!@@+`}uURmgK92E@*lZG8IS zd&)Oi0w243J{sfc@LRD{)XdE)A8W6}RfB>5MnuRnYXtG5Y!7URhbE2l^&@ih=?w8A zrY3--b%=8nDo0=D-}YOJ?uoQv$)4px;Q4dH=S3!rrGTbq)IDLc;UlqWKKNLQeTY5t;i$#K z1Zi(F%w)_4d;bI~+kuTH=p)kV7eKP*$tewJodU(&pJ(O?AL6zYVxbx36fkgGgfiu- z)Sp71BO8l$sWhDiq^wl1wP1gf3ev!Z(Ris_3|qOsCR?iQQb0OHGu9&&XTX4kO`e#c z-aYZH(sgB{jMI$Zs;R8aRCCs~ztYU1N zpY(AKI5F<4Iaic8G%u%`e6V*pG_xP@;0hW`w`jzcNOrk!c^He7Zmp(+HM`Q!DAMg< zHB1W6heM3DV*gs2DB05bccIpTeISi1f+|iEvw4#0@3%w9lg#f!Bx5rryN&RQwKkgw zn@)rk6Jdd61k^7?SR4`7NQ7Y-y`}~tjDJE{D=8ik_5l&59E?=|0AX@G5%v)gwm&!F zx%wf5$+w9xTOus2ebKY@SXB-V?1t1>4oine3;{~k6Hu24C_k6NXKj20)DR}*K_zrk2%%#Q1!|2E@(dziClO#A4E&Cf z8o1;*1ZR2nYmad*B%IS~N$pF3>?A;D6ChYiufjxtOd>#<2#|qVDAr~Y5#2n6?WF2Dc!#lvQtw_kQ}=)AcJ+P$ delta 2566 zcma)+3s4p3703C&<(}(B5fwqAX{QNX*OLO=@6;?al=){5UINw>?n4PX%w349q@uN*y&mqGz&{tH}Db45=mnMKE}G7 zV~L{X$W3AFV`tQJkeB<-un2KjMyD{eajW2TtyCz<3KU-6{Z~j zKRwPg1q-u|akavS*%@M4p-Vlcm_mdur?65e7?mnkWS3%#DP&oD{A%Fu{`f+SI*|6! zy=SAvC(CAt&OLS>QnUunYIK+1bQ-2C!HMS7x+~eWjqC~~yOPa;>`EoOR+3#QWYyOw7o@j7_+w3vcJJTO+c+DB&x!Uzxc}EO#p*-6#-34OU zTs-MQJN|6ut!5*0rF1{b_Nq5}xYDjrOmKx5?H3jCYJK)dWh5G0A)hV8knxbrqOoB- zX}-ty@gOlhR=H8I5IJ`!WzAUOPN{4>x5)R=;7+m`*yRom>~kFL0S~zhzc%?gT6&Un zHr9Dk>w);flL~xfvs`V*1TQM-=B;yb0anl>TZ9HLh~ZY5juKMQ&KvT%E5j_+NUZk; zFSY>Ny(#k;9OMHn%n8r=fCJ|s^MVH11Zwn=W`GS7>E469FBRH?b-qx<2BU`` zon>QtgTIPNepHWwU4B%$eMPnWE!s_jMs8@@9sfPpJ_#JOPj6z_jZ^n7m*7fkvMOvy0Iryu|=N%Dn1L7dZSw|MXQGm)yhh&2%xGO@w))< zGPyV0R_YFbk&L;ag+S^f_^|-aX4y_*>Q~HCO$gavkE;b3$JPH7ri5Xg08yNH&rAIW zG7*Y6m*y4f-?3bT+g$pzL%aq*n@q(oXl;@wNcEE;#)L~v%~1b>7J>A&S-5|y?)&nk zJU|Kx1S`g+G~GYqBP9gE2TXfmYLPPk(x;*s=1qfqU4h>SH5rDA8%GaAD?I@?`D(JV zzbaV#cccaC^)#JMM;%v+!gJ-9x+S=q6uHwwMycl9ec7d8y7-~v0^#hi=(k46o#p~L z_TUrIRQ!=2nAN7RkrxEzV(@$QWgCs;%I8nST|sU9vV>5@%g`azgv7l|FU_0|S`90e zB10jW)7H$Hq0G9rM!X{#BB01vpR)DqNnvH(Vq*G3zPo2^D<#Da+uq6s2wN`%C>c4Wl#NW^^ z8upCvJqWVZqHgidh+F*TS92AkGoSFW2D}js_WnV-09Cu`yu7Ez`MrmiIF!h>N!{X{ zC8zlzRRh)Sk6Q!sKZ-*ATsquvB3PXfa*RJV+Xh$l2ByvlmecZQiVa6?aQ9qj&{|*r zRt`P6SiFQu^FY!qkBAUVl5H18-jHUAl{_5?I~&!A&;w^ohfX>@E&9{8(4QqUUM&)9M7T1yjUneilb@|_ zQ#3?a)5YNT>iZEU_ap3GdaNt~OLkYPFM(x)ru73#?gc8a52$x->;vk5Ovt@VJURWE ziACGMUbm8XDkh#BTGvUq4g8o@KLX@l0;=8+&{0Lk^g{@(wo~AjHv}9c0`$Fs|1x6e zWn?>Cvg(Jk?0dWq=fi|^ay6-o2@pnr#1SA^O|QcC4ItqJNOv{l={67%c0|NkA|k&A a+L?rDJ7`)Dk*apU9L8Qsojc*wj{g8h`1l0? 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 */ -- 2.25.1