Advertisement
Guest User

dot-for-uborder.slang

a guest
Nov 30th, 2024
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.39 KB | Source Code | 0 0
  1. #version 450
  2.  
  3. /*
  4. Author: Themaister, tweaked to allow frame positioning
  5. License: Public domain
  6. */
  7.  
  8. // Defines user's parameters for shader adjustment
  9. layout(push_constant) uniform Push
  10. {
  11. float box_scale;
  12. float in_res_x;
  13. float in_res_y;
  14. float geom_center_x;
  15. float geom_center_y;
  16. } params;
  17.  
  18. #pragma parameter frame_nonono "FRAME:" 0.0 0.0 1.0 1.0
  19. #pragma parameter box_scale " Image Scale" 4.0 1.0 10.0 0.02
  20. #pragma parameter in_res_x " Viewport Size X" 320.0 100.0 600.0 1.0
  21. #pragma parameter in_res_y " Viewport Size Y" 240.0 64.0 512.0 1.0
  22. #pragma parameter geom_center_x " Center X" 0.0 -1.0 1.0 0.001
  23. #pragma parameter geom_center_y " Center Y" 0.0 -1.0 1.0 0.01
  24.  
  25. // Defines a uniform buffer object (UBO) with a Model-View-Projection (MVP) matrix
  26. // for transforming vertex positions.
  27. layout(std140, set = 0, binding = 0) uniform UBO
  28. {
  29. mat4 MVP;
  30. vec4 OutputSize;
  31. vec4 OriginalSize;
  32. vec4 SourceSize;
  33. } global;
  34.  
  35. // Define variables
  36. #define gamma 2.4
  37. #define shine 0.05
  38. #define blend 0.65
  39. #define TEX(coord) texture(Source, vTexCoord).rgb
  40.  
  41. // Helper function
  42. float dist(vec2 coord, vec2 source)
  43. {
  44. vec2 delta = coord - source;
  45. return sqrt(dot(delta, delta));
  46. }
  47.  
  48. float color_bloom(vec3 color)
  49. {
  50. const vec3 gray_coeff = vec3(0.30, 0.59, 0.11);
  51. float bright = dot(color, gray_coeff);
  52. return mix(1.0 + shine, 1.0 - shine, bright);
  53. }
  54.  
  55. vec3 lookup(vec2 pixel_no, float offset_x, float offset_y, vec3 color)
  56. {
  57. vec2 offset = vec2(offset_x, offset_y);
  58. float delta = dist(fract(pixel_no), offset + vec2(0.5, 0.5));
  59. return color * exp(-gamma * delta * color_bloom(color));
  60. }
  61.  
  62. // Vertex stage
  63. #pragma stage vertex
  64. layout(location = 0) in vec4 Position;
  65. layout(location = 1) in vec2 TexCoord;
  66. layout(location = 0) out vec2 vTexCoord;
  67. layout(location = 1) out vec4 c00_10;
  68. layout(location = 2) out vec4 c00_01;
  69. layout(location = 3) out vec4 c20_01;
  70. layout(location = 4) out vec4 c21_02;
  71. layout(location = 5) out vec4 c12_22;
  72. layout(location = 6) out vec2 c11;
  73. layout(location = 7) out vec2 pixel_no;
  74.  
  75. void main()
  76. {
  77. // Transform the vertex position
  78. gl_Position = global.MVP * Position;
  79.  
  80. // Calculate new texture coordinate
  81. vec2 corrected_size = vec2(params.in_res_x, params.in_res_y) * params.box_scale;
  82. vec2 scale = vec2(1920.0, 1080.0) / corrected_size;
  83. vec2 middle = vec2(params.geom_center_x, params.geom_center_y) + vec2(0.5, 0.5);
  84. vec2 diff = TexCoord - middle;
  85. vTexCoord = middle + diff * scale;
  86.  
  87. // Get coordinate of surrounding vertex
  88. float dx = global.SourceSize.z;
  89. float dy = global.SourceSize.w;
  90.  
  91. c00_10 = vec4(vTexCoord + vec2(-dx, -dy), vTexCoord + vec2(0, -dy));
  92. c20_01 = vec4(vTexCoord + vec2(dx, -dy), vTexCoord + vec2(-dx, 0));
  93. c21_02 = vec4(vTexCoord + vec2(dx, 0), vTexCoord + vec2(-dx, dy));
  94. c12_22 = vec4(vTexCoord + vec2(0, dy), vTexCoord + vec2(dx, dy));
  95. c11 = vTexCoord;
  96. pixel_no = vTexCoord * global.SourceSize.xy;
  97. }
  98.  
  99. #pragma stage fragment
  100. layout(location = 0) in vec2 vTexCoord;
  101. layout(location = 1) in vec4 c00_10;
  102. layout(location = 2) in vec4 c00_01;
  103. layout(location = 3) in vec4 c20_01;
  104. layout(location = 4) in vec4 c21_02;
  105. layout(location = 5) in vec4 c12_22;
  106. layout(location = 6) in vec2 c11;
  107. layout(location = 7) in vec2 pixel_no;
  108. layout(location = 0) out vec4 FragColor;
  109. layout(set = 0, binding = 2) uniform sampler2D Source;
  110.  
  111. void main()
  112. {
  113. // Calculate output color
  114. vec3 mid_color = lookup(pixel_no, 0.0, 0.0, TEX(c11));
  115. vec3 color = vec3(0.0, 0.0, 0.0);
  116. color += lookup(pixel_no, -1.0, -1.0, TEX(c00_10.xy));
  117. color += lookup(pixel_no, 0.0, -1.0, TEX(c00_10.zw));
  118. color += lookup(pixel_no, 1.0, -1.0, TEX(c20_01.xy));
  119. color += lookup(pixel_no, -1.0, 0.0, TEX(c20_01.zw));
  120. color += mid_color;
  121. color += lookup(pixel_no, 1.0, 0.0, TEX(c21_02.xy));
  122. color += lookup(pixel_no, -1.0, 1.0, TEX(c21_02.zw));
  123. color += lookup(pixel_no, 0.0, 1.0, TEX(c12_22.xy));
  124. color += lookup(pixel_no, 1.0, 1.0, TEX(c12_22.zw));
  125. vec3 out_color = mix(1.2 * mid_color, color, blend);
  126.  
  127. // Calculate alpha
  128. bool outsideRealView =
  129. vTexCoord.x < 0 || vTexCoord.y < 0 ||
  130. vTexCoord.x > 1 || vTexCoord.y > 1;
  131. float alpha = outsideRealView ? 0.0 : 1.0;
  132.  
  133. FragColor = vec4(out_color, alpha);
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement