Skip to content

Commit

Permalink
vignette improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
AmesingFlank committed Aug 16, 2024
1 parent 44fe14a commit 4aa098b
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 36 deletions.
6 changes: 3 additions & 3 deletions src/salon_core/src/editor/edit.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::ir::{ColorMixGroup, Frame, GlobalMask, Mask, MaskPrimitive, MaskTerm};
use crate::ir::{ColorMixGroup, Frame, GlobalMask, Mask, MaskPrimitive, MaskTerm, Vignette};

use crate::utils::rectangle::Rectangle;

Expand Down Expand Up @@ -68,7 +68,7 @@ pub struct GlobalEdit {
pub color_mixer_edits: [ColorMixGroup; 8],

pub dehaze: f32,
pub vignette: f32,
pub vignette: Vignette,
}

impl GlobalEdit {
Expand All @@ -92,7 +92,7 @@ impl GlobalEdit {
color_mixer_edits: [ColorMixGroup::new(); 8],

dehaze: 0.0,
vignette: 0.0,
vignette: Vignette::new(),
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/salon_core/src/editor/ir_generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -288,12 +288,12 @@ fn maybe_add_color_mix(edit: &GlobalEdit, module: &mut Module, current_output_id
}

fn maybe_add_vignette(edit: &GlobalEdit, module: &mut Module, current_output_id: &mut Id) {
if edit.vignette != 0.0 {
if edit.vignette.vignette != 0.0 {
let adjusted_image_id = module.alloc_id();
module.push_op(Op::AdjustVignette(AdjustVignetteOp {
result: adjusted_image_id,
arg: *current_output_id,
vignette: edit.vignette,
vignette: edit.vignette.clone(),
}));
*current_output_id = adjusted_image_id;
}
Expand Down
36 changes: 26 additions & 10 deletions src/salon_core/src/engine/ops/shaders/vignette.wgsl
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ var input: texture_2d<f32>;
var output: texture_storage_2d<rgba16float, write>;

struct Params {
value: f32,
vignette: f32,
midpoint: f32,
feather: f32,
roundness: f32,
};

@group(0) @binding(2)
Expand All @@ -20,25 +23,38 @@ fn cs_main(@builtin(global_invocation_id) global_id: vec3<u32>) {
if(global_id.x >= input_size.x || global_id.y >= input_size.y){
return;
}

var rgb = textureLoad(input, global_id.xy, 0).rgb;

var uv = vec2(f32(global_id.x) / f32(input_size.x - 1u), f32(global_id.y) / f32(input_size.y - 1u));

let aspect_ratio = f32(input_size.x) / f32(input_size.y);
// make the vignette a bit more round
let x_factor = sqrt(aspect_ratio);
let x_factor = mix(1.0, aspect_ratio, params.roundness * 0.01);
uv.x *= x_factor;

let inner_radius = 0.2;
let outer_radius = 0.5 * max(1.0, x_factor) * 1.1;
let min_midpoint = 0.5 * 0.75;
let max_midpoint = 0.5 * 1.25;
let midpoint = mix(min_midpoint, max_midpoint, params.midpoint * 0.01);

var strength = params.value * 0.01;
strength = sign(strength) * sqrt(abs(strength));
var delta = params.vignette * 0.01;
delta = sign(delta) * sqrt(abs(delta));

var feather = params.feather * 0.01;

let dist = length(uv - vec2(0.5 * x_factor, 0.5));
let vignette = smoothstep(inner_radius, outer_radius, dist) ;
var dist = length(uv - vec2(0.5 * x_factor, 0.5));
dist = dist - midpoint;

// sigmoid function
var coeff = 1.0 / (1.0 + exp(-1.0 * dist * (1.01 - pow(feather, 0.05)) * 500.0));
coeff = sqrt(sqrt(coeff));
var hsv = rgb_to_hsv(rgb);

rgb *= 1.0 + vignette * strength;
hsv.z *= 1.0 + coeff * delta;

hsv.y *= inverseSqrt(1.0 + coeff * delta * hsv.y);
hsv.y = min(hsv.y, 1.0);

rgb = hsv_to_rgb(hsv);

textureStore(output, global_id.xy, vec4<f32>(rgb, 1.0));
}
24 changes: 14 additions & 10 deletions src/salon_core/src/engine/ops/vignette.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,9 @@ use std::{mem::size_of, sync::Arc};
use crate::runtime::Toolbox;

use crate::{
engine::{value_store::ValueStore},
ir::{AdjustVignetteOp},
runtime::{
BindGroupDescriptor, BindGroupEntry, BindGroupManager,
BindingResource, Runtime,
},
engine::value_store::ValueStore,
ir::AdjustVignetteOp,
runtime::{BindGroupDescriptor, BindGroupEntry, BindGroupManager, BindingResource, Runtime},
runtime::{BufferProperties, RingBuffer},
shader::{Shader, ShaderLibraryModule},
utils::math::div_up,
Expand All @@ -34,7 +31,7 @@ impl AdjustVignetteImpl {
let ring_buffer = RingBuffer::new(
runtime.clone(),
BufferProperties {
size: size_of::<f32>(),
size: size_of::<f32>() * 4,
host_readable: false,
},
);
Expand Down Expand Up @@ -69,9 +66,16 @@ impl AdjustVignetteImpl {

let buffer = self.ring_buffer.get();

self.runtime
.queue
.write_buffer(&buffer.buffer, 0, bytemuck::cast_slice(&[op.vignette]));
self.runtime.queue.write_buffer(
&buffer.buffer,
0,
bytemuck::cast_slice(&[
op.vignette.vignette,
op.vignette.midpoint,
op.vignette.feather,
op.vignette.roundness,
]),
);

let bind_group = self.bind_group_manager.get_or_create(BindGroupDescriptor {
entries: vec![
Expand Down
21 changes: 20 additions & 1 deletion src/salon_core/src/ir/op.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,11 +166,30 @@ impl ColorMixGroup {
}
}

#[derive(Clone, PartialEq, Debug, serde::Deserialize, serde::Serialize)]
pub struct Vignette {
pub vignette: f32,
pub midpoint: f32,
pub feather: f32,
pub roundness: f32,
}

impl Vignette {
pub fn new() -> Self {
Self {
vignette: 0.0,
midpoint: 50.0,
feather: 50.0,
roundness: 0.0,
}
}
}

#[derive(Clone, PartialEq, Debug)]
pub struct AdjustVignetteOp {
pub result: Id,
pub arg: Id,
pub vignette: f32,
pub vignette: Vignette,
}

#[derive(Clone, PartialEq, Debug)]
Expand Down
3 changes: 3 additions & 0 deletions src/salon_exe/src/ui/app_ui_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ pub struct AppUiState {
pub export_image_full_resolution: Option<Arc<Image>>,
pub export_image_selected_resolution: Option<Arc<Image>>,
pub export_quality: Option<u8>,

pub vignette_expanded: bool,
}

impl AppUiState {
Expand Down Expand Up @@ -81,6 +83,7 @@ impl AppUiState {
export_image_full_resolution: None,
export_image_selected_resolution: None,
export_quality: None,
vignette_expanded: false,
}
}

Expand Down
49 changes: 39 additions & 10 deletions src/salon_exe/src/ui/effects.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
use eframe::{
egui::{CollapsingHeader, Ui},
};
use eframe::egui::{CollapsingHeader, Ui};

use salon_core::{editor::GlobalEdit, session::Session};
use salon_core::{editor::GlobalEdit, ir::Vignette, session::Session};

use super::{widgets::EditorSlider, AppUiState};

pub fn effects(
ui: &mut Ui,
_session: &mut Session,
_ui_state: &mut AppUiState,
ui_state: &mut AppUiState,
edit: &mut GlobalEdit,
) {
CollapsingHeader::new("Effects")
Expand All @@ -21,10 +19,41 @@ pub fn effects(
.double_click_reset_value(0.0)
.text("Dehaze"),
);
ui.add(
EditorSlider::new(&mut edit.vignette, -100.0..=100.0)
.double_click_reset_value(0.0)
.text("Vignette"),
);
let defualt_vignette = Vignette::new();
ui.horizontal(|ui| {
ui.add(
EditorSlider::new(&mut edit.vignette.vignette, -100.0..=100.0)
.double_click_reset_value(defualt_vignette.vignette as f64)
.text("Vignette"),
);
let expand_icon = if ui_state.vignette_expanded {
"⏷"
} else {
"⏴"
};
if ui
.selectable_label(ui_state.vignette_expanded, expand_icon)
.clicked()
{
ui_state.vignette_expanded = !ui_state.vignette_expanded;
}
});
if ui_state.vignette_expanded {
ui.add(
EditorSlider::new(&mut edit.vignette.midpoint, 0.0..=100.0)
.double_click_reset_value(defualt_vignette.midpoint as f64)
.text("Midpoint"),
);
ui.add(
EditorSlider::new(&mut edit.vignette.feather, 0.0..=100.0)
.double_click_reset_value(defualt_vignette.feather as f64)
.text("Feather"),
);
ui.add(
EditorSlider::new(&mut edit.vignette.roundness, 0.0..=100.0)
.double_click_reset_value(defualt_vignette.roundness as f64)
.text("Roundness"),
);
}
});
}

0 comments on commit 4aa098b

Please sign in to comment.