Я программирую библиотеку графического интерфейса в openGL и решил добавить закругленные углы, потому что я чувствую, что это дает гораздо более профессиональный вид подразделениям. Я реализовал общий метод
length(max(abs(p) - b, 0.0)) - radius
, и он почти идеально работает, за исключением того факта, что углы кажутся растянутыми:
Мой фрагментный шейдер:
in vec2 passTexCoords;
uniform vec4 color;
uniform int width;
uniform int height;
uniform int radius;
void main() {
fragment = color;
vec2 pos = (abs(passTexCoords - 0.5) + 0.5) * vec2(width, height);
float alpha = 1.0 - clamp(length(max(pos - (vec2(width, height) - radius), 0.0)) - radius, 0.0, 1.0);
fragment.a = alpha;
}
Растяжение имеет смысл для меня, но когда я заменяю на
vec2 pos = (abs(passTexCoords - 0.5) + 0.5) * vec2(width, height) * vec2(scaleX, scaleY);
и
float alpha = 1.0 - clamp(length(max(pos - (vec2(width, height) * vec2(scaleX, scaleY) - radius), 0.0)) - radius, 0.0, 1.0);
(где scaleX и scaleY - это скаляры между 0,0 и 1,0, которые представляют ширину и высоту прямоугольника относительно экрана), прямоугольник почти полностью исчезает: