Optimize undercurl shader

This removes the if and lowers amount of operations.
This commit is contained in:
Kirill Chibisov 2023-12-01 21:40:20 +04:00 committed by GitHub
parent 28d913cfd0
commit 546d5951aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 11 additions and 10 deletions

View File

@ -41,16 +41,17 @@ color_t draw_undercurl(float_t x, float_t y) {
float_t undercurlTop = undercurl + max((underlineThickness - 1.), 0.) / 2.;
float_t undercurlBottom = undercurl - max((underlineThickness - 1.), 0.) / 2.;
// Compute resulted alpha based on distance from `gl_FragCoord.y` to the
// cosine curve.
float_t alpha = 1.;
if (y > undercurlTop || y < undercurlBottom) {
// Doing proper SDF is complicated for this shader, so just make AA
// stronger by 1/x^2, which renders preserving underline thickness and
// being bold enough.
float_t dst = min(abs(undercurlTop - y), abs(undercurlBottom - y));
alpha -= dst * dst;
}
// The distance to the curve boundary is always positive when it should
// be used for AA. When both `y - undercurlTop` and `undercurlBottom - y`
// expressions are negative, it means that the point is inside the curve
// and we should just use alpha 1. To do so, we max one value with 0
// so it'll use the alpha 1 in the end.
float_t dst = max(y - undercurlTop, max(undercurlBottom - y, 0.));
// Doing proper SDF is complicated for this shader, so just make AA
// stronger by 1/x^2, which renders preserving underline thickness and
// being bold enough.
float_t alpha = 1. - dst * dst;
// The result is an alpha mask on a rect, which leaves only curve opaque.
return vec4(color.rgb, alpha);