[Impeller] started scaling the gaussian blur sigma to match skia output (flutter/engine#47405)
fixes https://github.com/flutter/flutter/issues/127770 This will help performance as well since our kernels will be smaller. The justification for scaling the sigma is that we need to account in the math the scaling down that we are doing of the input. Here are the side-by-side comparisons with this math and skia, impeller is always on the right: ## sigma 10 <img width="1395" alt="blur_10" src="https://github.com/flutter/engine/assets/30870216/d534d71f-b35b-46aa-be79-8337172968a8"> ## sigma 75 <img width="1398" alt="blur_75" src="https://github.com/flutter/engine/assets/30870216/a8a77048-5212-470d-b537-a0aea98efce6"> ## sigma 164 (sigma in bug) <img width="1402" alt="blur_164" src="https://github.com/flutter/engine/assets/30870216/cc620d02-4460-4cc8-9798-8dd21530eeed"> ## sigma 400 <img width="1404" alt="blur_400" src="https://github.com/flutter/engine/assets/30870216/653c1f1b-8156-4cff-bfcf-bf1ba737b386"> ## sigma 1000 <img width="1395" alt="blur_1000" src="https://github.com/flutter/engine/assets/30870216/c3456275-7876-4733-a27b-6022140c6a24"> ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide] and the [C++, Objective-C, Java style guides]. - [x] I listed at least one issue that this PR fixes in the description above. - [ ] I added new tests to check the change I am making or feature I am adding, or the PR is [test-exempt]. See [testing the engine] for instructions on writing and running engine tests. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I signed the [CLA]. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/wiki/Tree-hygiene#overview [Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene [test-exempt]: https://github.com/flutter/flutter/wiki/Tree-hygiene#tests [Flutter Style Guide]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style [testing the engine]: https://github.com/flutter/flutter/wiki/Testing-the-engine [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/wiki/Chat
This commit is contained in:
@@ -23,6 +23,23 @@
|
||||
|
||||
namespace impeller {
|
||||
|
||||
// This function was derived with polynomial regression when comparing the
|
||||
// results with Skia. Changing the curve below should invalidate this.
|
||||
//
|
||||
// The following data points were used:
|
||||
// 0 | 1
|
||||
// 75 | 0.8
|
||||
// 150 | 0.5
|
||||
// 300 | 0.22
|
||||
// 400 | 0.2
|
||||
// 500 | 0.15
|
||||
Sigma ScaleSigma(Sigma sigma) {
|
||||
// Limit the kernel size to 1000x1000 pixels, like Skia does.
|
||||
Scalar clamped = std::min(sigma.sigma, 500.0f);
|
||||
Scalar scalar = 1.02 - 3.89e-3 * clamped + 4.36e-06 * clamped * clamped;
|
||||
return Sigma(clamped * scalar);
|
||||
}
|
||||
|
||||
DirectionalGaussianBlurFilterContents::DirectionalGaussianBlurFilterContents() =
|
||||
default;
|
||||
|
||||
@@ -76,8 +93,7 @@ std::optional<Entity> DirectionalGaussianBlurFilterContents::RenderFilter(
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
// Limit the kernel size to 1000x1000 pixels, like Skia does.
|
||||
auto radius = std::min(Radius{blur_sigma_}.radius, 500.0f);
|
||||
auto radius = Radius{ScaleSigma(blur_sigma_)}.radius;
|
||||
|
||||
auto transform = entity.GetTransformation() * effect_transform.Basis();
|
||||
auto transformed_blur_radius =
|
||||
|
||||
Reference in New Issue
Block a user