Separated ESM Filter's and Image Filter's Scene Shader Data

This commit is contained in:
korenkonder
2026-01-03 20:17:24 +03:00
parent 3bd5f2c764
commit d4e4cbb666
4 changed files with 57 additions and 49 deletions
+6 -4
View File
@@ -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();
+14 -8
View File
@@ -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;
+25 -25
View File
@@ -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);
+12 -12
View File
@@ -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: