Advertisement
Guest User

Untitled

a guest
Jun 18th, 2025
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OpenGL Shading 5.72 KB | Source Code | 0 0
  1. shader_type canvas_item;
  2. render_mode blend_mix;
  3.  
  4. uniform vec2 Size = vec2(540.0, 289.0);
  5. uniform vec4 Padding = vec4(50.0, 50.0, -50, -50);
  6. uniform vec4 Corner_Radii = vec4(2.0, 10.0, 20.0, 50.0);
  7. uniform float Blur_Level = 2.0;
  8. uniform sampler2D Screen : source_color, filter_linear_mipmap, hint_screen_texture;
  9. uniform vec4 ColorParameter : source_color = vec4(0.051361, 0.170669, 0.398438, 1.000000);
  10.  
  11. uniform float antialiasing_amount = .05;
  12. uniform float edge_thickness = .1;
  13. uniform float edge_effect_strength = .5;
  14. uniform float softblur_strength = .5;
  15. uniform float softblur_blur = 5.0;
  16.  
  17. float _min(float a, float b, float c)
  18. {
  19.     return min(min(a, b), c);
  20. }
  21. float _min(float a, float b, float c, float d)
  22. {
  23.     return min(min(min(a, b), c), d);
  24. }
  25.  
  26. float distance_to_edge_or_corner(float edge_pos, float pixel_pos, float corner_distance, bool is_between_corners)
  27. {
  28.     float edge_distance = abs(edge_pos - pixel_pos);
  29.     float min_distance = min(corner_distance, edge_distance);
  30.     // Don't consider the edge outside the corners, we just want the corner distance there
  31.     return min_distance * float(is_between_corners) + corner_distance * float(!is_between_corners);
  32. }
  33.  
  34. void fragment()
  35. {
  36.     // UV scaled by window size
  37.     vec2 pos = UV * Size;
  38.  
  39.     // Corner circles
  40.     vec2 top_left_corner = vec2(Corner_Radii.x + Padding.x, Corner_Radii.x + Padding.y);
  41.     vec2 top_right_corner = vec2(Size.x - Corner_Radii.y - Padding.x, Corner_Radii.y + Padding.y);
  42.     vec2 bottom_right_corner = vec2(Size.x - Corner_Radii.z - Padding.x, Size.y - Corner_Radii.z - Padding.y);
  43.     vec2 bottom_left_corner = vec2(Corner_Radii.w + Padding.x, Size.y - Corner_Radii.w - Padding.y);
  44.  
  45.     // Distance to each circle
  46.     float distance_to_top_left_circle = max(distance(pos, top_left_corner) - Corner_Radii.x, 0.0);
  47.     float distance_to_top_right_circle = max(distance(pos, top_right_corner) - Corner_Radii.y, 0.0);
  48.     float distance_to_bottom_right_corner = max(distance(pos, bottom_right_corner) - Corner_Radii.z, 0.0);
  49.     float distance_to_bottom_left_corner = max(distance(pos, bottom_left_corner) - Corner_Radii.w, 0.0);
  50.  
  51.     // Minimum distance to any corner
  52.     float min_distance_to_corner = _min(distance_to_top_left_circle, distance_to_top_right_circle, distance_to_bottom_left_corner, distance_to_bottom_right_corner);
  53.  
  54.     bool is_above_top_corner_centers = (UV.x < .5 && pos.y < top_left_corner.y) || (UV.x >= .5 && pos.y < top_right_corner.y);
  55.     bool is_below_bottom_corner_centers = (UV.x < .5 && pos.y > bottom_left_corner.y) || (UV.x >= .5 && pos.y > bottom_right_corner.y);
  56.     bool is_before_left_corner_centers = (UV.y < .5 && pos.x < top_left_corner.x) || (UV.y >= .5 && pos.x < bottom_left_corner.x);
  57.     bool is_after_right_corner_centers = (UV.y < .5 && pos.x > top_right_corner.x) || (UV.y >= .5 && pos.x > bottom_right_corner.x);
  58.  
  59.     bool is_between_corners_vertically = !is_above_top_corner_centers && !is_below_bottom_corner_centers;
  60.     bool is_between_corners_horizontally = !is_before_left_corner_centers && !is_after_right_corner_centers;
  61.  
  62.     float min_distance_to_corner_or_left_edge = distance_to_edge_or_corner(Padding.x, pos.x, min_distance_to_corner, is_between_corners_vertically);
  63.     float min_distance_to_corner_or_right_edge = distance_to_edge_or_corner(Size.x - Padding.x, pos.x, min_distance_to_corner, is_between_corners_vertically);
  64.     float min_distance_to_corner_or_top_edge = distance_to_edge_or_corner(Padding.y, pos.y, min_distance_to_corner, is_between_corners_horizontally);
  65.     float min_distance_to_corner_or_bottom_edge = distance_to_edge_or_corner(Size.y - Padding.y, pos.y, min_distance_to_corner, is_between_corners_horizontally);
  66.  
  67.     float min_distance_to_edge_or_corner = _min(min_distance_to_corner_or_left_edge, min_distance_to_corner_or_right_edge, min_distance_to_corner_or_bottom_edge, min_distance_to_corner_or_top_edge);
  68.  
  69.     bool is_left_of_padding = pos.x < Padding.x;
  70.     bool is_right_of_padding = pos.x > (Size.x - Padding.x);
  71.     bool is_above_padding = pos.y < Padding.y;
  72.     bool is_below_padding = pos.y > (Size.y - Padding.y);
  73.  
  74.     bool is_outside_padding = is_left_of_padding || is_right_of_padding || is_above_padding || is_below_padding;
  75.  
  76.     bool is_top_left_corner = pos.x < (Corner_Radii.x + Padding.x) && pos.y < (Corner_Radii.x + Padding.y);
  77.     bool is_top_right_corner = pos.x > (Size.x - Corner_Radii.y - Padding.x) && pos.y < (Corner_Radii.y + Padding.y);
  78.     bool is_bottom_left_corner = pos.x < (Corner_Radii.w + Padding.x) && pos.y > (Size.y - Corner_Radii.w - Padding.y);
  79.     bool is_bottom_right_corner = pos.x > (Size.x - Corner_Radii.z - Padding.x) && pos.y > (Size.y - Corner_Radii.z - Padding.y);
  80.     bool is_corner = is_top_left_corner || is_top_right_corner || is_bottom_left_corner || is_bottom_right_corner;
  81.  
  82.     bool is_outside = is_outside_padding || is_corner;
  83.  
  84.     vec3 outer_gradient = vec3(min_distance_to_edge_or_corner) * float(is_outside);
  85.     float max_distance = min(Padding.x, Padding.y);
  86.     outer_gradient = outer_gradient / max_distance;
  87.     vec3 inverted_gradient = 1.0 - outer_gradient;
  88.  
  89.     vec2 refracted_screen_uv = log(1.0+outer_gradient.x) * edge_effect_strength + SCREEN_UV;
  90.     vec3 tint = ColorParameter.rgb * ColorParameter.a;
  91.     vec3 inside_window_color = textureLod(Screen, refracted_screen_uv, Blur_Level).rgb + tint;
  92.  
  93.     float antialiase_start = 1.0 - edge_thickness - antialiasing_amount;
  94.     float antialiase_end = antialiase_start + antialiasing_amount;
  95.  
  96.     float inside_outside_transition = smoothstep(antialiase_start, antialiase_end, inverted_gradient.x);
  97.     vec3 extra_blurry_screen = textureLod(Screen, SCREEN_UV, softblur_blur).rgb;
  98.     COLOR.rgb = mix(extra_blurry_screen, inside_window_color, inside_outside_transition);
  99.     float soft_blur_amount = inverted_gradient.r * softblur_strength;
  100.     COLOR.a = max(0.0, mix(soft_blur_amount, 1.0, inside_outside_transition));
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement