Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #version 330
  2.  
  3. #vertex
  4.  
  5. layout(location = 0) in uvec2 a_Position;
  6. layout(location = 1) in vec4  a_OffsetSize;
  7. layout(location = 2) in uvec4 a_ColorScale;
  8. layout(location = 3) in uvec4 a_TexcoordBorderAttrSize;
  9.  
  10. uniform mat4  u_MVPMatrix;
  11. uniform uvec2 u_TexSize;
  12. uniform uint  u_FontLineHeight;
  13.  
  14. flat out vec3  v_Color;
  15.      out vec2  v_TexCoord;
  16. flat out vec2  v_Border;
  17. flat out vec3  v_BorderColor;
  18. flat out uint  v_CharAttribs;
  19. flat out float v_Scale;
  20.  
  21. const uint ITALIC_BIT = 0x4u;
  22.  
  23. const float SKEW_FACTOR = 0.3;
  24.  
  25. void main() {
  26.     vec2  i_Position = a_Position;
  27.     vec2  i_Offset   = a_OffsetSize.xy;
  28.     vec2  i_Size     = a_OffsetSize.zw;
  29.    
  30.     v_Color       = vec3(a_ColorScale.xyz) / 255.0;
  31.     v_TexCoord    = vec2(a_TexcoordBorderAttrSize.xy + i_Position * i_Size) / u_TexSize;
  32.     v_Border      = vec2(float((a_TexcoordBorderAttrSize.z & 0xf000u) >> 12) / 15, float((a_TexcoordBorderAttrSize.z & 0x0f00u) >> 8) / 15);
  33.     v_BorderColor = vec3(float((a_TexcoordBorderAttrSize.w & 0xf000u) >> 12) / 15, float((a_TexcoordBorderAttrSize.w & 0x0f00u) >> 8) / 15, float((a_TexcoordBorderAttrSize.w & 0x00f0u) >> 4) / 15);
  34.     v_CharAttribs = a_TexcoordBorderAttrSize.w & 0x000fu;
  35.     v_Scale       = float(a_ColorScale.w + ((a_TexcoordBorderAttrSize.w & 0x3u) << 8)) / u_FontLineHeight;
  36.  
  37.     float skew = float(bool(v_CharAttribs & ITALIC_BIT)) * (1.0 - i_Position.y) * i_Size.y * v_Scale * SKEW_FACTOR;
  38.     gl_Position = u_MVPMatrix * vec4(i_Position * i_Size * v_Scale + i_Offset + vec2(skew, 0.0), 0.0, 1.0);
  39. }
  40.  
  41.  
  42.  
  43. #fragment
  44.  
  45. layout(location = 0) out vec4 out_Color;
  46.  
  47. uniform sampler2D u_Tex;
  48.  
  49. flat in vec3  v_Color;
  50.      in vec2  v_TexCoord;
  51. flat in vec2  v_Border;
  52. flat in vec3  v_BorderColor;
  53. flat in uint  v_CharAttribs;
  54. flat in float v_Scale;
  55.  
  56. const uint BOLD_BIT = 0x8u;
  57.  
  58. const float BASE_FADEOUT = 0.1;
  59.  
  60. const float CHAR_BASE_WIDTH = 0.5;
  61. const float CHAR_SCALED_WIDTH_ADDON = 0.05;
  62. const float CHAR_BOLD_WIDTH_ADDON = 0.1;
  63.  
  64. const float BORDER_MAX_WIDTH = 0.9;
  65.  
  66. void main() {
  67.     // ================================ BASE ================================
  68.     vec4 sample = texture(u_Tex, v_TexCoord);
  69.     float distance = 1.0 - sample.a;
  70.     float fadeoutDistance = BASE_FADEOUT / v_Scale;
  71.  
  72.     float charWidth = CHAR_BASE_WIDTH + CHAR_SCALED_WIDTH_ADDON / v_Scale;
  73.  
  74.     float charBold = float(bool(v_CharAttribs & BOLD_BIT));
  75.     float charBoldWidth = charWidth + CHAR_BOLD_WIDTH_ADDON * charBold;
  76.    
  77.     float charStart = charBoldWidth - fadeoutDistance;
  78.     float charEnd = charBoldWidth;
  79.     float charAlpha = 1.0 - smoothstep(charStart, charEnd, distance);
  80.     // ================================ BASE ================================
  81.  
  82.  
  83.  
  84.     // ================================ BORDER ================================
  85.     float borderSize = v_Border.x;
  86.     float borderStrength = v_Border.y;
  87.     float borderWidth = (1.0 - (charWidth + CHAR_BOLD_WIDTH_ADDON)) * borderSize * BORDER_MAX_WIDTH;
  88.  
  89.     float borderStart = charStart + borderWidth * borderStrength;
  90.     float borderEnd = charEnd + borderWidth;
  91.     float borderAlpha = (1.0 - smoothstep(borderStart, borderEnd, distance)) * (1.0 - charAlpha);
  92.    
  93.     vec3 charBorderColor = v_Color;
  94.     if(borderSize > 0)
  95.         charBorderColor = mix(v_BorderColor, v_Color, charAlpha);
  96.     float charBorderAlpha = min(charAlpha + borderAlpha, 1.0);
  97.     // ================================ BORDER ================================
  98.  
  99.    
  100.    
  101.     out_Color = vec4(charBorderColor, charBorderAlpha);
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement