From 3168f7b5db068af4d648b361c79dfc1dec23bd9d Mon Sep 17 00:00:00 2001 From: tovjemam Date: Wed, 27 May 2026 18:40:48 +0200 Subject: [PATCH] Fog --- src/gameview/worldenv.cpp | 3 ++- src/gfx/renderer.cpp | 17 ++++++++++++----- src/gfx/shader.cpp | 1 + src/gfx/shader.hpp | 3 ++- src/gfx/surface_render_flags.hpp | 11 ++++++----- src/gfx/surface_shader.cpp | 22 ++++++++++++++++++++-- src/gfx/surface_shader.hpp | 1 + 7 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/gameview/worldenv.cpp b/src/gameview/worldenv.cpp index cc33963..29e1f71 100644 --- a/src/gameview/worldenv.cpp +++ b/src/gameview/worldenv.cpp @@ -164,7 +164,8 @@ void game::view::WorldEnv::Draw(const DrawArgs& args) args.env.clear_color = glm::mix(kf1->clear_color, kf2->clear_color, t); args.env.ambient_light = glm::mix(kf1->ambient_color, kf2->ambient_color, t); args.env.sun_color = glm::mix(kf1->sun_color, kf2->sun_color, t); - args.env.fog = glm::mix(kf1->fog, kf2->fog, t); + // args.env.fog = glm::mix(kf1->fog, kf2->fog, t); + args.env.fog = glm::vec4(args.env.clear_color, 0.00001f); float dist = args.farplane * 0.5f; diff --git a/src/gfx/renderer.cpp b/src/gfx/renderer.cpp index bfd3fed..289c054 100644 --- a/src/gfx/renderer.cpp +++ b/src/gfx/renderer.cpp @@ -127,15 +127,20 @@ void gfx::Renderer::SetupSurfaceShader(SurfaceShader& sshader, const DrawListPar return; // Global uniforms are already set up } - glUniformMatrix4fv(shader.U(gfx::SU_VIEW_PROJ), 1, GL_FALSE, ¶ms.view_proj[0][0]); + glUniformMatrix4fv(shader.U(SU_VIEW_PROJ), 1, GL_FALSE, ¶ms.view_proj[0][0]); + if (sshader.iflags & SIF_FOG_DATA) + { + glUniform3fv(shader.U(SU_CAMERA_POS), 1, ¶ms.cam_pos[0]); + glUniform4fv(shader.U(SU_FOG), 1, ¶ms.env.fog[0]); + } + // setup lighting if (sshader.iflags & SIF_LIGHTING_DATA) { - glUniform3fv(shader.U(gfx::SU_AMBIENT_LIGHT), 1, ¶ms.env.ambient_light[0]); - glUniform3fv(shader.U(gfx::SU_SUN_COLOR), 1, ¶ms.env.sun_color[0]); - glUniform3fv(shader.U(gfx::SU_SUN_DIRECTION), 1, ¶ms.env.sun_direction[0]); - // glUniform4fv(shader.U(gfx::SU_FOG), 1, ¶ms.env.fog[0]); + glUniform3fv(shader.U(SU_AMBIENT_LIGHT), 1, ¶ms.env.ambient_light[0]); + glUniform3fv(shader.U(SU_SUN_COLOR), 1, ¶ms.env.sun_color[0]); + glUniform3fv(shader.U(SU_SUN_DIRECTION), 1, ¶ms.env.sun_direction[0]); } sshader.global_setup = true; @@ -194,6 +199,8 @@ void gfx::Renderer::DrawSurfaceList(std::span list, const DrawLi { if (cmd.surface->sflags & SF_BLEND) cmd.rflags |= SRF_BLEND; + else + cmd.rflags |= SRF_FOG; if (cmd.surface->texture) cmd.rflags |= SRF_TEXTURE; diff --git a/src/gfx/shader.cpp b/src/gfx/shader.cpp index aa66fa1..6e0dfac 100644 --- a/src/gfx/shader.cpp +++ b/src/gfx/shader.cpp @@ -20,6 +20,7 @@ static const char* const s_uni_names[] = { "u_num_lights", "u_light_positions", "u_light_colors_rs", + "u_camera_pos", }; // Vytvori shader z daneho zdroje diff --git a/src/gfx/shader.hpp b/src/gfx/shader.hpp index 3519cf3..677f66c 100644 --- a/src/gfx/shader.hpp +++ b/src/gfx/shader.hpp @@ -25,7 +25,8 @@ namespace gfx SU_NUMLIGHTS, SU_LIGHT_POSITIONS, SU_LIGHT_COLORS_RS, - + SU_CAMERA_POS, + SU_COUNT }; diff --git a/src/gfx/surface_render_flags.hpp b/src/gfx/surface_render_flags.hpp index 2512d80..a342ded 100644 --- a/src/gfx/surface_render_flags.hpp +++ b/src/gfx/surface_render_flags.hpp @@ -19,14 +19,15 @@ enum SurfaceRenderFlag : SurfaceRenderFlags SRF_OBJECT_COLOR_BACKGROUND = 16, SRF_MULTICOLOR = 32, SRF_LIT = 64, - SRF_DEFORM = 128, - SRF_SKELETAL = 256, - SRF_TEXTURE = 512, + SRF_FOG = 128, + SRF_DEFORM = 256, + SRF_SKELETAL = 512, + SRF_TEXTURE = 1024, - SRF__SHADER = SRF_CULL_ALPHA | SRF_OBJECT_COLOR | SRF_OBJECT_COLOR_BACKGROUND | SRF_MULTICOLOR | SRF_LIT | SRF_SKELETAL | SRF_DEFORM | SRF_TEXTURE, + SRF__SHADER = SRF_CULL_ALPHA | SRF_OBJECT_COLOR | SRF_OBJECT_COLOR_BACKGROUND | SRF_MULTICOLOR | SRF_LIT | SRF_FOG | SRF_SKELETAL | SRF_DEFORM | SRF_TEXTURE, // order affects visual result - SRF_BLEND = 1024, + SRF_BLEND = 2048, }; diff --git a/src/gfx/surface_shader.cpp b/src/gfx/surface_shader.cpp index 1ab2ef6..6403fa8 100644 --- a/src/gfx/surface_shader.cpp +++ b/src/gfx/surface_shader.cpp @@ -25,6 +25,7 @@ std::unique_ptr gfx::CreateSurfaceShader(SurfaceRenderFlags flags, vert_outs = R"GLSL( out vec3 v_color; + out vec3 v_world_pos; )GLSL"; vert_pos_calc = R"GLSL( @@ -35,10 +36,12 @@ std::unique_ptr gfx::CreateSurfaceShader(SurfaceRenderFlags flags, vert_main = R"GLSL( gl_Position = u_view_proj * world_pos; v_color = a_color.rgb; + v_world_pos = world_pos.xyz; )GLSL"; frag_ins = R"GLSL( in vec3 v_color; + in vec3 v_world_pos; )GLSL"; frag_main = R"GLSL( @@ -201,13 +204,28 @@ std::unique_ptr gfx::CreateSurfaceShader(SurfaceRenderFlags flags, if (flags & SRF_MULTICOLOR) { - frag_main += "o_color.rgb *= mix(v_color, vec3(1.5), emis);"; + frag_main += "o_color.rgb *= mix(v_color, vec3(1.5), emis);\n"; } else { - frag_main += "o_color.rgb *= v_color;"; + frag_main += "o_color.rgb *= v_color;\n"; } + if (flags & SRF_FOG) + { + frag_uniforms += R"GLSL( + uniform vec4 u_fog; + uniform vec3 u_camera_pos; + )GLSL"; + + frag_main += R"GLSL( + float dist = distance(v_world_pos, u_camera_pos); + float fog_factor = 1.0 / (1.0 + dist * dist * u_fog.a); + o_color.rgb = mix(u_fog.rgb, o_color.rgb, fog_factor); + )GLSL"; + + input_flags |= SIF_FOG_DATA; + } vert_main = vert_pos_calc + vert_main; diff --git a/src/gfx/surface_shader.hpp b/src/gfx/surface_shader.hpp index c85d364..a290f26 100644 --- a/src/gfx/surface_shader.hpp +++ b/src/gfx/surface_shader.hpp @@ -18,6 +18,7 @@ enum SurfaceShaderInputFlag : SurfaceShaderInputFlags SIF_SKELETAL_DATA = 8, SIF_DEFORM_DATA = 16, SIF_MULTICOLOR_DATA = 32, + SIF_FOG_DATA = 64, }; std::unique_ptr CreateSurfaceShader(SurfaceRenderFlags flags, SurfaceShaderInputFlags& input_flags);