paint: expose bloom strength

This commit is contained in:
luboslenco
2026-07-11 20:05:11 +02:00
parent 0790b0f406
commit 748e6f87b4
7 changed files with 34 additions and 21 deletions
+11 -5
View File
@@ -32,15 +32,21 @@ fun bloom_downsample_pass_vert(input: vert_in): vert_out {
return output;
}
fun clamp_coord(coord: float2, texel_size: float2): float2 {
var lo: float2 = texel_size * 0.5;
var hi: float2 = float2(1.0, 1.0) - lo;
return float2(clamp(coord.x, lo.x, hi.x), clamp(coord.y, lo.y, hi.y));
}
fun downsample_dual_filter(tex_coord: float2, texel_size: float2): float3 {
var delta: float3 = float3(texel_size.xy, texel_size.x) * float3(0.5, 0.5, -0.5);
var result: float3;
result = sample_lod(tex, sampler_linear, tex_coord, 0.0).rgb * 4.0;
result += sample_lod(tex, sampler_linear, tex_coord - delta.xy, 0.0).rgb;
result += sample_lod(tex, sampler_linear, tex_coord - delta.zy, 0.0).rgb;
result += sample_lod(tex, sampler_linear, tex_coord + delta.zy, 0.0).rgb;
result += sample_lod(tex, sampler_linear, tex_coord + delta.xy, 0.0).rgb;
result = sample_lod(tex, sampler_linear, clamp_coord(tex_coord, texel_size), 0.0).rgb * 4.0;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord - delta.xy, texel_size), 0.0).rgb;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord - delta.zy, texel_size), 0.0).rgb;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord + delta.zy, texel_size), 0.0).rgb;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord + delta.xy, texel_size), 0.0).rgb;
return result * (1.0 / 8.0);
}
+14 -8
View File
@@ -30,18 +30,24 @@ fun bloom_upsample_pass_vert(input: vert_in): vert_out {
return output;
}
fun clamp_coord(coord: float2, texel_size: float2): float2 {
var lo: float2 = texel_size * 1.5;
var hi: float2 = float2(1.0, 1.0) - lo;
return float2(clamp(coord.x, lo.x, hi.x), clamp(coord.y, lo.y, hi.y));
}
fun upsample_dual_filter(tex_coord: float2, texel_size: float2): float3 {
var delta: float2 = texel_size * constants.sample_scale;
var result: float3;
result = sample_lod(tex, sampler_linear, tex_coord + float2(-delta.x * 2.0, 0.0), 0.0).rgb;
result += sample_lod(tex, sampler_linear, tex_coord + float2(-delta.x, delta.y), 0.0).rgb * 2.0;
result += sample_lod(tex, sampler_linear, tex_coord + float2(0.0, delta.y * 2.0), 0.0).rgb;
result += sample_lod(tex, sampler_linear, tex_coord + delta, 0.0).rgb * 2.0;
result += sample_lod(tex, sampler_linear, tex_coord + float2(delta.x * 2.0, 0.0), 0.0).rgb;
result += sample_lod(tex, sampler_linear, tex_coord + float2(delta.x, -delta.y), 0.0).rgb * 2.0;
result += sample_lod(tex, sampler_linear, tex_coord + float2(0.0, -delta.y * 2.0), 0.0).rgb;
result += sample_lod(tex, sampler_linear, tex_coord - delta, 0.0).rgb * 2.0;
result = sample_lod(tex, sampler_linear, clamp_coord(tex_coord + float2(-delta.x * 2.0, 0.0), texel_size), 0.0).rgb;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord + float2(-delta.x, delta.y), texel_size), 0.0).rgb * 2.0;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord + float2(0.0, delta.y * 2.0), texel_size), 0.0).rgb;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord + delta, texel_size), 0.0).rgb * 2.0;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord + float2(delta.x * 2.0, 0.0), texel_size), 0.0).rgb;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord + float2(delta.x, -delta.y), texel_size), 0.0).rgb * 2.0;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord + float2(0.0, -delta.y * 2.0), texel_size), 0.0).rgb;
result += sample_lod(tex, sampler_linear, clamp_coord(tex_coord - delta, texel_size), 0.0).rgb * 2.0;
return result * (1.0 / 12.0);
}
+2 -2
View File
@@ -72,7 +72,7 @@ void config_save() {
json_encode_f32("window_scale", g_config->window_scale);
json_encode_f32("rp_supersample", g_config->rp_supersample);
json_encode_bool("rp_ssao", g_config->rp_ssao);
json_encode_bool("rp_bloom", g_config->rp_bloom);
json_encode_f32("rp_bloom", g_config->rp_bloom);
json_encode_f32("rp_vignette", g_config->rp_vignette);
json_encode_f32("rp_grain", g_config->rp_grain);
json_encode_string("lut_path", g_config->lut_path);
@@ -178,7 +178,7 @@ void config_init() {
#endif
g_config->window_vsync = true;
g_config->window_frequency = sys_display_frequency();
g_config->rp_bloom = false;
g_config->rp_bloom = 0.0;
g_config->rp_vignette = 0.2;
g_config->rp_grain = 0.09;
g_config->lut_path = "";
+1 -1
View File
@@ -185,7 +185,7 @@ void render_path_base_commands(void (*draw_commands)(void)) {
}
void render_path_base_draw_bloom(char *source, char *target) {
if (g_config->rp_bloom == false) {
if (g_config->rp_bloom == 0.0) {
return;
}
+1 -1
View File
@@ -93,7 +93,7 @@ typedef struct config {
// Render path
f32 rp_supersample;
bool rp_ssao;
bool rp_bloom;
f32 rp_bloom;
f32 rp_vignette;
f32 rp_grain;
char *lut_path; // .cube
+3 -3
View File
@@ -663,10 +663,10 @@ void box_preferences_viewport_tab() {
}
ui_handle_t *h_bloom = ui_handle(__ID__);
h_bloom->b = g_config->rp_bloom;
g_config->rp_bloom = ui_check(h_bloom, tr("Bloom"), "");
h_bloom->f = g_config->rp_bloom;
g_config->rp_bloom = ui_slider(h_bloom, tr("Bloom"), 0.0, 1.0, true, 100.0, true, UI_ALIGN_RIGHT, true);
if (h_bloom->changed) {
config_apply();
g_context->ddirty = 2;
}
}
+2 -1
View File
@@ -53,7 +53,8 @@ f32 uniforms_ext_f32_link(object_t *object, material_data_t *mat, char *link) {
return render_path_base_bloom_sample_scale;
}
else if (string_equals(link, "_bloom_strength")) {
return g_context->viewport_mode == VIEWPORT_MODE_PATH_TRACE ? 0.2 : 0.02;
f32 base = g_context->viewport_mode == VIEWPORT_MODE_PATH_TRACE ? 0.2 : 0.02;
return base * g_config->rp_bloom;
}
else if (string_equals(link, "_brush_scale_x")) {
return 1 / (float)g_context->brush_scale_x;