Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #version 330
- #vertex
- layout(location = 0) in uvec2 a_Position;
- layout(location = 1) in vec4 a_OffsetSize;
- layout(location = 2) in uvec4 a_ColorScale;
- layout(location = 3) in uvec4 a_TexcoordBorderAttrSize;
- uniform mat4 u_MVPMatrix;
- uniform uvec2 u_TexSize;
- uniform uint u_FontLineHeight;
- flat out vec3 v_Color;
- out vec2 v_TexCoord;
- flat out vec2 v_Border;
- flat out vec3 v_BorderColor;
- flat out uint v_CharAttribs;
- flat out float v_Scale;
- const uint ITALIC_BIT = 0x4u;
- const float SKEW_FACTOR = 0.3;
- void main() {
- vec2 i_Position = a_Position;
- vec2 i_Offset = a_OffsetSize.xy;
- vec2 i_Size = a_OffsetSize.zw;
- v_Color = vec3(a_ColorScale.xyz) / 255.0;
- v_TexCoord = vec2(a_TexcoordBorderAttrSize.xy + i_Position * i_Size) / u_TexSize;
- v_Border = vec2(float((a_TexcoordBorderAttrSize.z & 0xf000u) >> 12) / 15, float((a_TexcoordBorderAttrSize.z & 0x0f00u) >> 8) / 15);
- v_BorderColor = vec3(float((a_TexcoordBorderAttrSize.w & 0xf000u) >> 12) / 15, float((a_TexcoordBorderAttrSize.w & 0x0f00u) >> 8) / 15, float((a_TexcoordBorderAttrSize.w & 0x00f0u) >> 4) / 15);
- v_CharAttribs = a_TexcoordBorderAttrSize.w & 0x000fu;
- v_Scale = float(a_ColorScale.w + ((a_TexcoordBorderAttrSize.w & 0x3u) << 8)) / u_FontLineHeight;
- float skew = float(bool(v_CharAttribs & ITALIC_BIT)) * (1.0 - i_Position.y) * i_Size.y * v_Scale * SKEW_FACTOR;
- gl_Position = u_MVPMatrix * vec4(i_Position * i_Size * v_Scale + i_Offset + vec2(skew, 0.0), 0.0, 1.0);
- }
- #fragment
- layout(location = 0) out vec4 out_Color;
- uniform sampler2D u_Tex;
- flat in vec3 v_Color;
- in vec2 v_TexCoord;
- flat in vec2 v_Border;
- flat in vec3 v_BorderColor;
- flat in uint v_CharAttribs;
- flat in float v_Scale;
- const uint BOLD_BIT = 0x8u;
- const float BASE_FADEOUT = 0.1;
- const float CHAR_BASE_WIDTH = 0.5;
- const float CHAR_SCALED_WIDTH_ADDON = 0.05;
- const float CHAR_BOLD_WIDTH_ADDON = 0.1;
- const float BORDER_MAX_WIDTH = 0.9;
- void main() {
- // ================================ BASE ================================
- vec4 sample = texture(u_Tex, v_TexCoord);
- float distance = 1.0 - sample.a;
- float fadeoutDistance = BASE_FADEOUT / v_Scale;
- float charWidth = CHAR_BASE_WIDTH + CHAR_SCALED_WIDTH_ADDON / v_Scale;
- float charBold = float(bool(v_CharAttribs & BOLD_BIT));
- float charBoldWidth = charWidth + CHAR_BOLD_WIDTH_ADDON * charBold;
- float charStart = charBoldWidth - fadeoutDistance;
- float charEnd = charBoldWidth;
- float charAlpha = 1.0 - smoothstep(charStart, charEnd, distance);
- // ================================ BASE ================================
- // ================================ BORDER ================================
- float borderSize = v_Border.x;
- float borderStrength = v_Border.y;
- float borderWidth = (1.0 - (charWidth + CHAR_BOLD_WIDTH_ADDON)) * borderSize * BORDER_MAX_WIDTH;
- float borderStart = charStart + borderWidth * borderStrength;
- float borderEnd = charEnd + borderWidth;
- float borderAlpha = (1.0 - smoothstep(borderStart, borderEnd, distance)) * (1.0 - charAlpha);
- vec3 charBorderColor = v_Color;
- if(borderSize > 0)
- charBorderColor = mix(v_BorderColor, v_Color, charAlpha);
- float charBorderAlpha = min(charAlpha + borderAlpha, 1.0);
- // ================================ BORDER ================================
- out_Color = vec4(charBorderColor, charBorderAlpha);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement