From 313de221328d756742ddc6f52386d9ddae067e7c Mon Sep 17 00:00:00 2001 From: hgn Date: Fri, 3 Dec 2021 02:56:05 +0000 Subject: [PATCH] actually good ball shader --- fishladder.c | 7 ++--- fishladder_resources.h | 58 ++++++++++++++++++++++++++++++++++++++++- textures/bnoise.png | Bin 0 -> 12788 bytes 3 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 textures/bnoise.png diff --git a/fishladder.c b/fishladder.c index eb56b5a..4ff7458 100644 --- a/fishladder.c +++ b/fishladder.c @@ -182,7 +182,7 @@ v2f const curve_7_1[] = {{0.5f,0.8438f},{1.0f-0.875f,0.8438f},{1.0-0.625f,0.5f}, float const curve_7_linear_section = 0.1562f; v3f colour_sets[] = -{ { 0.9f, 0.6f, 0.20f }, +{ { 1.0f, 0.9f, 0.3f }, { 0.2f, 0.9f, 0.14f }, { 0.4f, 0.8f, 1.00f } }; @@ -1911,7 +1911,7 @@ void vg_render(void) SHADER_USE( shader_ball ); glUniformMatrix3fv( SHADER_UNIFORM( shader_ball, "uPv" ), 1, GL_FALSE, (float *)vg_pv ); - vg_tex2d_bind( &tex_ball, 0 ); + vg_tex2d_bind( &tex_ball_noise, 0 ); glUniform1i( SHADER_UNIFORM( shader_ball, "uTexMain" ), 0 ); // Draw 'fish' @@ -1932,7 +1932,8 @@ void vg_render(void) glUniform3fv( SHADER_UNIFORM( shader_ball, "uColour" ), 1, dot_colour ); glUniform2fv( SHADER_UNIFORM( shader_ball, "uOffset" ), 1, fish->physics_co ); - draw_mesh( 0, 32 ); + glUniform2f( SHADER_UNIFORM( shader_ball, "uTexOffset" ), (float)i * 1.2334, (float)i * -0.3579f ); + draw_mesh( 0, 2 ); } } diff --git a/fishladder_resources.h b/fishladder_resources.h index 2bd1442..e3abf07 100644 --- a/fishladder_resources.h +++ b/fishladder_resources.h @@ -6,8 +6,9 @@ vg_tex2d tex_tile_detail = { .path = "textures/tile_overlays.qoi" }; vg_tex2d tex_wood = { .path = "textures/wood.qoi" }; vg_tex2d tex_ball = { .path = "textures/ball.qoi", .flags = VG_TEXTURE_CLAMP }; vg_tex2d tex_background = { .path = "textures/background.qoi" }; +vg_tex2d tex_ball_noise = { .path = "textures/bnoise.qoi" }; -vg_tex2d *texture_list[] = { &tex_tile_detail, &tex_tile_data, &tex_wood, &tex_ball, &tex_background }; +vg_tex2d *texture_list[] = { &tex_tile_detail, &tex_tile_data, &tex_wood, &tex_ball, &tex_background, &tex_ball_noise }; // AUDIO // =========================================================================================================== @@ -138,6 +139,7 @@ SHADER_DEFINE( shader_tile_colour, UNIFORMS({ "uPv", "uOffset", "uColour" }) ) +/* SHADER_DEFINE( shader_ball, // VERTEX "layout (location=0) in vec2 a_co;" @@ -172,6 +174,60 @@ SHADER_DEFINE( shader_ball, , UNIFORMS({ "uTexMain", "uColour", "uOffset", "uPv" }) ) +*/ + +SHADER_DEFINE( shader_ball, + // VERTEX + "layout (location=0) in vec2 a_co;" + "uniform vec2 uOffset;" + "uniform mat3 uPv;" + "" + "out vec4 aTexCoords;" + "" + "void main()" + "{" + // Vertex transform + "vec3 worldpos = vec3( a_co * 0.5 - 0.25 + uOffset, 1.0 );" + "gl_Position = vec4( uPv * worldpos, 1.0 );" + + // Create texture coords + "aTexCoords = vec4( a_co, worldpos.xy );" + "}", + + // FRAGMENT + "out vec4 FragColor;" + "" + "uniform sampler2D uTexMain;" + "uniform vec3 uColour;" + "uniform vec2 uTexOffset;" + "" + "in vec4 aTexCoords;" + "" + "void main()" + "{" + "vec2 center_coords = aTexCoords.xy - 0.5;" + "vec2 center_coords_sqr = center_coords*center_coords;" + "float circle_factor = smoothstep( 0.07, 0.0625, center_coords_sqr.x+center_coords_sqr.y );" + + "float bulge_amt = center_coords_sqr.x+center_coords_sqr.y;" + "vec2 warped_coords = aTexCoords.zw+uTexOffset - center_coords;" + "vec4 noise_sample = texture( uTexMain, warped_coords );" + + "float rim_light = (center_coords_sqr.x+center_coords_sqr.y)*15.0;" + + "vec2 shadow_coords = center_coords + vec2(0.02,0.07);" + "vec2 shadow_coords_sqr = shadow_coords*shadow_coords;" + //"float shadow = exp(-abs(shadow_coords_sqr.x+shadow_coords_sqr.y)*20.0);" + "float shadow = exp(-((shadow_coords_sqr.x+shadow_coords_sqr.y)-0.0125)*15.0);" + + "vec3 marble_comp = uColour*0.9 + (noise_sample.x*0.7+pow(rim_light,3.0)*2.0) * 0.1;" + "vec4 colour_comp = mix( vec4(0.74,0.53,0.34,shadow), vec4(marble_comp,1.0), circle_factor );" + + "FragColor = colour_comp;" + "}" + , + UNIFORMS({ "uTexMain", "uColour", "uOffset", "uPv", "uTexOffset" }) +) SHADER_DEFINE( shader_tile_main, // VERTEX diff --git a/textures/bnoise.png b/textures/bnoise.png new file mode 100644 index 0000000000000000000000000000000000000000..23b4a8ff5b10258a1e6fdff2b3dc24eabad1c158 GIT binary patch literal 12788 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 literal 0 HcmV?d00001 -- 2.25.1