Skip to content

Commit

Permalink
[impeller] move gaussian blur vertex uniforms to fragment uniforms (f…
Browse files Browse the repository at this point in the history
  • Loading branch information
jonahwilliams authored Aug 6, 2022
1 parent f047672 commit d70259d
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 50 deletions.
27 changes: 14 additions & 13 deletions impeller/entity/contents/filters/gaussian_blur_filter_contents.cc
Original file line number Diff line number Diff line change
Expand Up @@ -130,15 +130,18 @@ bool DirectionalGaussianBlurFilterContents::RenderFilter(
blur_direction_ * blur_sigma_.sigma);

VS::FrameInfo frame_info;
frame_info.texture_size = Point(input_snapshot->GetCoverage().value().size);
frame_info.blur_sigma = transformed_blur.GetLength();
frame_info.blur_radius = Radius{Sigma{frame_info.blur_sigma}}.radius;
frame_info.blur_direction = input_snapshot->transform.Invert()
.TransformDirection(transformed_blur)
.Normalize();
frame_info.src_factor = src_color_factor_;
frame_info.inner_blur_factor = inner_blur_factor_;
frame_info.outer_blur_factor = outer_blur_factor_;
frame_info.mvp = Matrix::MakeOrthographic(ISize(1, 1));

FS::FragInfo frag_info;
frag_info.blur_sigma = transformed_blur.GetLength();
frag_info.blur_radius = Radius{Sigma{frag_info.blur_sigma}}.radius;
frag_info.blur_direction = input_snapshot->transform.Invert()
.TransformDirection(transformed_blur)
.Normalize();
frag_info.src_factor = src_color_factor_;
frag_info.inner_blur_factor = inner_blur_factor_;
frag_info.outer_blur_factor = outer_blur_factor_;
frag_info.texture_size = Point(input_snapshot->GetCoverage().value().size);

SamplerDescriptor sampler_desc;
sampler_desc.min_filter = MinMagFilter::kLinear;
Expand All @@ -155,10 +158,8 @@ bool DirectionalGaussianBlurFilterContents::RenderFilter(

FS::BindTextureSampler(cmd, input_snapshot->texture, sampler);
FS::BindAlphaMaskSampler(cmd, source_snapshot->texture, sampler);

frame_info.mvp = Matrix::MakeOrthographic(ISize(1, 1));
auto uniform_view = host_buffer.EmplaceUniform(frame_info);
VS::BindFrameInfo(cmd, uniform_view);
VS::BindFrameInfo(cmd, host_buffer.EmplaceUniform(frame_info));
FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));

return pass.AddCommand(cmd);
}
Expand Down
32 changes: 18 additions & 14 deletions impeller/entity/shaders/gaussian_blur.frag
Original file line number Diff line number Diff line change
Expand Up @@ -14,31 +14,35 @@
uniform sampler2D texture_sampler;
uniform sampler2D alpha_mask_sampler;

uniform FragInfo {
vec2 texture_size;
vec2 blur_direction;

float blur_sigma;
float blur_radius;
float src_factor;
float inner_blur_factor;
float outer_blur_factor;
} frag_info;

in vec2 v_texture_coords;
in vec2 v_src_texture_coords;
in vec2 v_texture_size;
in vec2 v_blur_direction;
in float v_blur_sigma;
in float v_blur_radius;
in float v_src_factor;
in float v_inner_blur_factor;
in float v_outer_blur_factor;

out vec4 frag_color;

const float kSqrtTwoPi = 2.50662827463;

float Gaussian(float x) {
float variance = v_blur_sigma * v_blur_sigma;
return exp(-0.5 * x * x / variance) / (kSqrtTwoPi * v_blur_sigma);
float variance = frag_info.blur_sigma * frag_info.blur_sigma;
return exp(-0.5 * x * x / variance) / (kSqrtTwoPi * frag_info.blur_sigma);
}

void main() {
vec4 total_color = vec4(0);
float gaussian_integral = 0;
vec2 blur_uv_offset = v_blur_direction / v_texture_size;
vec2 blur_uv_offset = frag_info.blur_direction / frag_info.texture_size;

for (float i = -v_blur_radius; i <= v_blur_radius; i++) {
for (float i = -frag_info.blur_radius; i <= frag_info.blur_radius; i++) {
float gaussian = Gaussian(i);
gaussian_integral += gaussian;
total_color +=
Expand All @@ -50,8 +54,8 @@ void main() {

vec4 src_color =
IPSampleClampToBorder(alpha_mask_sampler, v_src_texture_coords);
float blur_factor = v_inner_blur_factor * float(src_color.a > 0) +
v_outer_blur_factor * float(src_color.a == 0);
float blur_factor = frag_info.inner_blur_factor * float(src_color.a > 0) +
frag_info.outer_blur_factor * float(src_color.a == 0);

frag_color = blur_color * blur_factor + src_color * v_src_factor;
frag_color = blur_color * blur_factor + src_color * frag_info.src_factor;
}
23 changes: 0 additions & 23 deletions impeller/entity/shaders/gaussian_blur.vert
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,6 @@

uniform FrameInfo {
mat4 mvp;
vec2 texture_size;

vec2 blur_direction;
float blur_sigma;
float blur_radius;

float src_factor;
float inner_blur_factor;
float outer_blur_factor;
}
frame_info;

Expand All @@ -22,23 +13,9 @@ in vec2 src_texture_coords;

out vec2 v_texture_coords;
out vec2 v_src_texture_coords;
out vec2 v_texture_size;
out vec2 v_blur_direction;
out float v_blur_sigma;
out float v_blur_radius;
out float v_src_factor;
out float v_inner_blur_factor;
out float v_outer_blur_factor;

void main() {
gl_Position = frame_info.mvp * vec4(vertices, 0.0, 1.0);
v_texture_coords = texture_coords;
v_src_texture_coords = src_texture_coords;
v_texture_size = frame_info.texture_size;
v_blur_direction = frame_info.blur_direction;
v_blur_sigma = frame_info.blur_sigma;
v_blur_radius = frame_info.blur_radius;
v_src_factor = frame_info.src_factor;
v_inner_blur_factor = frame_info.inner_blur_factor;
v_outer_blur_factor = frame_info.outer_blur_factor;
}

0 comments on commit d70259d

Please sign in to comment.