From d4e4cbb6663f6e335ef40219db38b7894e1a3b29 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sat, 3 Jan 2026 20:17:24 +0300 Subject: [PATCH] Separated ESM Filter's and Image Filter's Scene Shader Data --- src/CRE/render_context.cpp | 10 +++++--- src/CRE/render_context.hpp | 22 +++++++++++------ src/CRE/render_manager.cpp | 50 +++++++++++++++++++------------------- src/CRE/shader_ft.cpp | 24 +++++++++--------- 4 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 77d45d42..f23f34a7 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -1132,9 +1132,10 @@ sprite_width(), sprite_height(), screen_x_offset(), screen_y_offset(), screen_wi camera_blur_ubo.Create(gl_state, sizeof(camera_blur_shader_data)); contour_coef_ubo.Create(gl_state, sizeof(contour_coef_shader_data)); contour_params_ubo.Create(gl_state, sizeof(contour_params_shader_data)); - filter_scene_ubo.Create(gl_state, sizeof(filter_scene_shader_data)); + esm_filter_scene_ubo.Create(gl_state, sizeof(esm_filter_scene_shader_data)); esm_filter_batch_ubo.Create(gl_state, sizeof(esm_filter_batch_shader_data)); - imgfilter_batch_ubo.Create(gl_state, sizeof(imgfilter_batch_shader_data)); + image_filter_scene_ubo.Create(gl_state, sizeof(image_filter_scene_shader_data)); + image_filter_batch_ubo.Create(gl_state, sizeof(image_filter_batch_shader_data)); exposure_measure_ubo.Create(gl_state, sizeof(exposure_measure_shader_data)); gaussian_coef_ubo.Create(gl_state, sizeof(gaussian_coef_shader_data)); glass_eye_batch_ubo.Create(gl_state, sizeof(glass_eye_batch_shader_data)); @@ -1304,9 +1305,10 @@ render_context::~render_context() { glass_eye_batch_ubo.Destroy(); gaussian_coef_ubo.Destroy(); exposure_measure_ubo.Destroy(); - imgfilter_batch_ubo.Destroy(); + image_filter_batch_ubo.Destroy(); + image_filter_scene_ubo.Destroy(); esm_filter_batch_ubo.Destroy(); - filter_scene_ubo.Destroy(); + esm_filter_scene_ubo.Destroy(); contour_params_ubo.Destroy(); contour_coef_ubo.Destroy(); camera_blur_ubo.Destroy(); diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 2e43ec09..9e94a5d7 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -120,11 +120,6 @@ struct contour_params_shader_data { vec4 g_near_far; }; -struct filter_scene_shader_data { - vec4 g_transform; - vec4 g_texcoord; -}; - struct exposure_measure_shader_data { vec4 g_spot_weight; vec4 g_spot_coefficients[32]; @@ -134,12 +129,22 @@ struct gaussian_coef_shader_data { vec4 g_coef[8]; }; +struct esm_filter_scene_shader_data { + vec4 g_transform; + vec4 g_texcoord; +}; + struct esm_filter_batch_shader_data { vec4 g_params; vec4 g_gauss[2]; }; -struct imgfilter_batch_shader_data { +struct image_filter_scene_shader_data { + vec4 g_transform; + vec4 g_texcoord; +}; + +struct image_filter_batch_shader_data { vec4 g_texture_lod; vec4 g_color_scale; vec4 g_color_offset; @@ -577,9 +582,10 @@ struct render_context { GL::UniformBuffer camera_blur_ubo; GL::UniformBuffer contour_coef_ubo; GL::UniformBuffer contour_params_ubo; - GL::UniformBuffer filter_scene_ubo; GL::UniformBuffer esm_filter_batch_ubo; - GL::UniformBuffer imgfilter_batch_ubo; + GL::UniformBuffer esm_filter_scene_ubo; + GL::UniformBuffer image_filter_batch_ubo; + GL::UniformBuffer image_filter_scene_ubo; GL::UniformBuffer exposure_measure_ubo; GL::UniformBuffer gaussian_coef_ubo; GL::UniformBuffer glass_eye_batch_ubo; diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index ff873ffe..e61fcaa9 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -1254,21 +1254,21 @@ void image_filter_scale(render_data_context& rend_data_ctx, dst->Bind(rend_data_ctx.state); dst->SetViewport(rend_data_ctx.state); - filter_scene_shader_data filter_scene = {}; + image_filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = { 1.0f, 1.0f, 0.0f, 0.0f }; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); + rctx->image_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); - imgfilter_batch_shader_data imgfilter_batch = {}; - imgfilter_batch.g_color_scale = scale; - imgfilter_batch.g_color_offset = 0.0f; - imgfilter_batch.g_texture_lod = 0.0f; - rctx->imgfilter_batch_ubo.WriteMemory(rend_data_ctx.state, imgfilter_batch); + image_filter_batch_shader_data image_filter_batch = {}; + image_filter_batch.g_color_scale = scale; + image_filter_batch.g_color_offset = 0.0f; + image_filter_batch.g_texture_lod = 0.0f; + rctx->image_filter_batch_ubo.WriteMemory(rend_data_ctx.state, image_filter_batch); rend_data_ctx.shader_flags.arr[U_IMAGE_FILTER] = 5; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_IMGFILT); - rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); - rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->imgfilter_batch_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->image_filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->image_filter_batch_ubo); rend_data_ctx.state.active_bind_texture_2d(0, src->glid); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); rend_data_ctx.state.bind_vertex_array(rctx->common_vao); @@ -1404,10 +1404,10 @@ static void apply_esm_filter(render_data_context& rend_data_ctx, render_context* rctx = rctx_ptr; rend_data_ctx.state.begin_event("`anonymous-namespace'::Impl::apply_esm_filter"); - filter_scene_shader_data filter_scene = {}; + esm_filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = 0.0f; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); + rctx->esm_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); esm_filter_batch_shader_data esm_filter_batch = {}; double_t v6 = 1.0 / (sqrt(M_PI * 2.0) * sigma); @@ -1417,7 +1417,7 @@ static void apply_esm_filter(render_data_context& rend_data_ctx, rend_data_ctx.shader_flags.arr[U_LIGHT_PROJ] = enable_lit_proj ? 1 : 0; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_ESMGAUSS); - rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->esm_filter_scene_ubo); rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->esm_filter_batch_ubo); rend_data_ctx.state.set_viewport(0, 0, dst_tex->width, dst_tex->height); @@ -1457,16 +1457,16 @@ static void apply_esm_min_filter(render_data_context& rend_data_ctx, render_context* rctx = rctx_ptr; rend_data_ctx.state.begin_event("minimize"); - filter_scene_shader_data filter_scene = {}; + esm_filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = 0.0f; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); + rctx->esm_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); esm_filter_batch_shader_data esm_filter_batch = {}; esm_filter_batch.g_gauss[0] = 0.0f; esm_filter_batch.g_gauss[1] = 0.0f; - rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->esm_filter_scene_ubo); rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->esm_filter_batch_ubo); rend_data_ctx.state.set_viewport(0, 0, dst_tex->width, dst_tex->height); @@ -1970,27 +1970,27 @@ static void apply_blur_filter_sub(render_data_context& rend_data_ctx, RenderText dst->Bind(rend_data_ctx.state); dst->SetViewport(rend_data_ctx.state); - filter_scene_shader_data filter_scene = {}; + image_filter_scene_shader_data filter_scene = {}; float_t w = res_scale.x / (float_t)src->GetWidth(); float_t h = res_scale.y / (float_t)src->GetHeight(); filter_scene.g_transform = { w, h, 0.0f, 0.0f }; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); + rctx->image_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); - imgfilter_batch_shader_data imgfilter_batch = {}; + image_filter_batch_shader_data image_filter_batch = {}; if (filter == BLUR_FILTER_32) - imgfilter_batch.g_color_scale = scale * (float_t)(1.0 / 8.0); + image_filter_batch.g_color_scale = scale * (float_t)(1.0 / 8.0); else - imgfilter_batch.g_color_scale = scale * (float_t)(1.0 / 4.0); - imgfilter_batch.g_color_offset = offset; - imgfilter_batch.g_texture_lod = 0.0f; - rctx->imgfilter_batch_ubo.WriteMemory(rend_data_ctx.state, imgfilter_batch); + image_filter_batch.g_color_scale = scale * (float_t)(1.0 / 4.0); + image_filter_batch.g_color_offset = offset; + image_filter_batch.g_texture_lod = 0.0f; + rctx->image_filter_batch_ubo.WriteMemory(rend_data_ctx.state, image_filter_batch); rend_data_ctx.shader_flags.arr[U_IMAGE_FILTER] = filter == BLUR_FILTER_32 ? 1 : 0; rend_data_ctx.state.bind_vertex_array(rctx->box_vao); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_IMGFILT); - rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->filter_scene_ubo); - rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->imgfilter_batch_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->image_filter_scene_ubo); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->image_filter_batch_ubo); rend_data_ctx.state.active_bind_texture_2d(0, src->GetColorTex()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, (GLint)(filter * 4LL), 4); diff --git a/src/CRE/shader_ft.cpp b/src/CRE/shader_ft.cpp index 9f9d929a..a77e5cf6 100644 --- a/src/CRE/shader_ft.cpp +++ b/src/CRE/shader_ft.cpp @@ -1107,7 +1107,7 @@ static const shader_description glass_eye_fpt_desc[] = { static const shader_description esm_gauss_vpt_desc[] = { { SHADER_DESCRIPTION_UNIFORM, 0, SHADER_DESCRIPTION_UNIFORM_READ_ONLY - | sizeof(filter_scene_shader_data), U_INVALID, }, + | sizeof(esm_filter_scene_shader_data), U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; @@ -1121,7 +1121,7 @@ static const shader_description esm_gauss_fpt_desc[] = { static const shader_description esm_filter_min_vpt_desc[] = { { SHADER_DESCRIPTION_UNIFORM, 0, SHADER_DESCRIPTION_UNIFORM_READ_ONLY - | sizeof(filter_scene_shader_data), U_INVALID, }, + | sizeof(esm_filter_scene_shader_data), U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; @@ -1135,7 +1135,7 @@ static const shader_description esm_filter_min_fpt_desc[] = { static const shader_description esm_filter_erosion_vpt_desc[] = { { SHADER_DESCRIPTION_UNIFORM, 0, SHADER_DESCRIPTION_UNIFORM_READ_ONLY - | sizeof(filter_scene_shader_data), U_INVALID, }, + | sizeof(esm_filter_scene_shader_data), U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; @@ -1955,14 +1955,14 @@ static const shader_description box4_vpt_desc[] = { { SHADER_DESCRIPTION_VERTEX_INPUT, 2, 2, U_INVALID, }, { SHADER_DESCRIPTION_VERTEX_INPUT, 3, 2, U_INVALID, }, { SHADER_DESCRIPTION_UNIFORM, 0, SHADER_DESCRIPTION_UNIFORM_READ_ONLY - | sizeof(filter_scene_shader_data), U_INVALID, }, + | sizeof(image_filter_scene_shader_data), U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; static const shader_description box4_fpt_desc[] = { { SHADER_DESCRIPTION_SAMPLER, 0, 0, U_INVALID, }, { SHADER_DESCRIPTION_UNIFORM, 1, SHADER_DESCRIPTION_UNIFORM_READ_ONLY - | sizeof(imgfilter_batch_shader_data), U_INVALID, }, + | sizeof(image_filter_batch_shader_data), U_INVALID, }, { SHADER_DESCRIPTION_FRAGMENT_OUTPUT, 0, 4, U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; @@ -1977,28 +1977,28 @@ static const shader_description box8_vpt_desc[] = { { SHADER_DESCRIPTION_VERTEX_INPUT, 6, 2, U_INVALID, }, { SHADER_DESCRIPTION_VERTEX_INPUT, 7, 2, U_INVALID, }, { SHADER_DESCRIPTION_UNIFORM, 0, SHADER_DESCRIPTION_UNIFORM_READ_ONLY - | sizeof(filter_scene_shader_data), U_INVALID, }, + | sizeof(image_filter_scene_shader_data), U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; static const shader_description box8_fpt_desc[] = { { SHADER_DESCRIPTION_SAMPLER, 0, 0, U_INVALID, }, { SHADER_DESCRIPTION_UNIFORM, 1, SHADER_DESCRIPTION_UNIFORM_READ_ONLY - | sizeof(imgfilter_batch_shader_data), U_INVALID, }, + | sizeof(image_filter_batch_shader_data), U_INVALID, }, { SHADER_DESCRIPTION_FRAGMENT_OUTPUT, 0, 4, U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; static const shader_description copy_vpt_desc[] = { { SHADER_DESCRIPTION_UNIFORM, 0, SHADER_DESCRIPTION_UNIFORM_READ_ONLY - | sizeof(filter_scene_shader_data), U_INVALID, }, + | sizeof(image_filter_scene_shader_data), U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; static const shader_description copy_fpt_desc[] = { { SHADER_DESCRIPTION_SAMPLER, 0, 0, U_INVALID, }, { SHADER_DESCRIPTION_UNIFORM, 1, SHADER_DESCRIPTION_UNIFORM_READ_ONLY - | sizeof(imgfilter_batch_shader_data), U_INVALID, }, + | sizeof(image_filter_batch_shader_data), U_INVALID, }, { SHADER_DESCRIPTION_FRAGMENT_OUTPUT, 0, 4, U_INVALID, }, { SHADER_DESCRIPTION_END, -1, -1, U_INVALID, }, }; @@ -2687,7 +2687,7 @@ static void shader_bind_snow_particle(p_gl_rend_state& p_gl_rend_st, uniform_value& shader_flags, shader_set_data* set, shader* shad); static void shader_bind_star(p_gl_rend_state& p_gl_rend_st, uniform_value& shader_flags, shader_set_data* set, shader* shad); -static void shader_bind_imgfilter(p_gl_rend_state& p_gl_rend_st, +static void shader_bind_image_filter(p_gl_rend_state& p_gl_rend_st, uniform_value& shader_flags, shader_set_data* set, shader* shad); static void shader_bind_dof(p_gl_rend_state& p_gl_rend_st, uniform_value& shader_flags, shader_set_data* set, shader* shad); @@ -2751,7 +2751,7 @@ const shader_bind_func shader_ft_bind_func_table[] = { }, { SHADER_FT_IMGFILT, - shader_bind_imgfilter, + shader_bind_image_filter, }, { SHADER_FT_DOF, @@ -3083,7 +3083,7 @@ static void shader_bind_star(p_gl_rend_state& p_gl_rend_st, } } -static void shader_bind_imgfilter(p_gl_rend_state& p_gl_rend_st, +static void shader_bind_image_filter(p_gl_rend_state& p_gl_rend_st, uniform_value& shader_flags, shader_set_data* set, shader* shad) { switch (shader_flags.arr[U_IMAGE_FILTER]) { case 0: