mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-15 06:45:59 +01:00
shaders: improve corner AA in borders shader
This commit is contained in:
parent
55ccb1a8cf
commit
0920572e70
3 changed files with 16 additions and 3 deletions
|
@ -1,6 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <format>
|
||||||
|
#include "SharedValues.hpp"
|
||||||
|
|
||||||
// makes a stencil without corners
|
// makes a stencil without corners
|
||||||
inline const std::string FRAGBORDER1 = R"#(
|
inline const std::string FRAGBORDER1 = R"#(
|
||||||
|
@ -72,18 +74,22 @@ void main() {
|
||||||
pixCoordOuter += vec2(1.0, 1.0) / fullSize;
|
pixCoordOuter += vec2(1.0, 1.0) / fullSize;
|
||||||
|
|
||||||
if (min(pixCoord.x, pixCoord.y) > 0.0 && radius > 0.0) {
|
if (min(pixCoord.x, pixCoord.y) > 0.0 && radius > 0.0) {
|
||||||
|
// smoothing constant for the edge: more = blurrier, but smoother
|
||||||
|
const float SMOOTHING_CONSTANT = )#" +
|
||||||
|
std::format("{:.7f}", SHADER_ROUNDED_SMOOTHING_FACTOR) + R"#(;
|
||||||
|
|
||||||
float dist = length(pixCoord);
|
float dist = length(pixCoord);
|
||||||
float distOuter = length(pixCoordOuter);
|
float distOuter = length(pixCoordOuter);
|
||||||
float h = (thick / 2.0);
|
float h = (thick / 2.0);
|
||||||
|
|
||||||
if (dist < radius - h) {
|
if (dist < radius - h) {
|
||||||
// lower
|
// lower
|
||||||
float normalized = smoothstep(0.0, 1.0, dist - radius + thick + 0.5);
|
float normalized = smoothstep(0.0, 1.0, (dist - radius + thick + SMOOTHING_CONSTANT) / (SMOOTHING_CONSTANT * 2.0));
|
||||||
additionalAlpha *= normalized;
|
additionalAlpha *= normalized;
|
||||||
done = true;
|
done = true;
|
||||||
} else if (min(pixCoordOuter.x, pixCoordOuter.y) > 0.0) {
|
} else if (min(pixCoordOuter.x, pixCoordOuter.y) > 0.0) {
|
||||||
// higher
|
// higher
|
||||||
float normalized = 1.0 - smoothstep(0.0, 1.0, distOuter - radiusOuter + 0.5);
|
float normalized = 1.0 - smoothstep(0.0, 1.0, (distOuter - radiusOuter + SMOOTHING_CONSTANT) / (SMOOTHING_CONSTANT * 2.0));
|
||||||
additionalAlpha *= normalized;
|
additionalAlpha *= normalized;
|
||||||
done = true;
|
done = true;
|
||||||
} else if (distOuter < radiusOuter - h) {
|
} else if (distOuter < radiusOuter - h) {
|
||||||
|
|
3
src/render/shaders/SharedValues.hpp
Normal file
3
src/render/shaders/SharedValues.hpp
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
constexpr float SHADER_ROUNDED_SMOOTHING_FACTOR = M_PI / 5.34665792551;
|
|
@ -1,6 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <format>
|
||||||
|
#include "SharedValues.hpp"
|
||||||
|
|
||||||
inline static constexpr auto ROUNDED_SHADER_FUNC = [](const std::string colorVarName) -> std::string {
|
inline static constexpr auto ROUNDED_SHADER_FUNC = [](const std::string colorVarName) -> std::string {
|
||||||
return R"#(
|
return R"#(
|
||||||
|
@ -13,7 +15,9 @@ inline static constexpr auto ROUNDED_SHADER_FUNC = [](const std::string colorVar
|
||||||
pixCoord -= fullSize * 0.5 - radius;
|
pixCoord -= fullSize * 0.5 - radius;
|
||||||
pixCoord += vec2(1.0, 1.0) / fullSize; // center the pix dont make it top-left
|
pixCoord += vec2(1.0, 1.0) / fullSize; // center the pix dont make it top-left
|
||||||
|
|
||||||
const float SMOOTHING_CONSTANT = 0.651724; // smoothing constant for the edge: more = blurrier, but smoother
|
// smoothing constant for the edge: more = blurrier, but smoother
|
||||||
|
const float SMOOTHING_CONSTANT = )#" +
|
||||||
|
std::format("{:.7f}", SHADER_ROUNDED_SMOOTHING_FACTOR) + R"#(;
|
||||||
|
|
||||||
if (pixCoord.x + pixCoord.y > radius) {
|
if (pixCoord.x + pixCoord.y > radius) {
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue