diff options
Diffstat (limited to 'glow/src/shader')
| -rw-r--r-- | glow/src/shader/common/triangle.frag | 18 | ||||
| -rw-r--r-- | glow/src/shader/common/triangle.vert (renamed from glow/src/shader/triangle.vert) | 8 | ||||
| -rw-r--r-- | glow/src/shader/compatibility/quad.frag | 67 | ||||
| -rw-r--r-- | glow/src/shader/compatibility/quad.vert | 44 | ||||
| -rw-r--r-- | glow/src/shader/core/quad.frag (renamed from glow/src/shader/quad.frag) | 25 | ||||
| -rw-r--r-- | glow/src/shader/core/quad.vert (renamed from glow/src/shader/quad.vert) | 16 | ||||
| -rw-r--r-- | glow/src/shader/triangle.frag | 9 | 
7 files changed, 156 insertions, 31 deletions
| diff --git a/glow/src/shader/common/triangle.frag b/glow/src/shader/common/triangle.frag new file mode 100644 index 00000000..e8689f2e --- /dev/null +++ b/glow/src/shader/common/triangle.frag @@ -0,0 +1,18 @@ +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#endif + +#ifdef HIGHER_THAN_300 +out vec4 fragColor; +#define gl_FragColor fragColor +#endif + +in vec4 v_Color; + +void main() { +    gl_FragColor = v_Color; +}
\ No newline at end of file diff --git a/glow/src/shader/triangle.vert b/glow/src/shader/common/triangle.vert index 5723436a..d0494a5f 100644 --- a/glow/src/shader/triangle.vert +++ b/glow/src/shader/common/triangle.vert @@ -1,13 +1,11 @@ -#version 330 -  uniform mat4 u_Transform; -layout(location = 0) in vec2 i_Position; -layout(location = 1) in vec4 i_Color; +in vec2 i_Position; +in vec4 i_Color;  out vec4 v_Color;  void main() {      gl_Position = u_Transform * vec4(i_Position, 0.0, 1.0);      v_Color = i_Color; -} +}
\ No newline at end of file diff --git a/glow/src/shader/compatibility/quad.frag b/glow/src/shader/compatibility/quad.frag new file mode 100644 index 00000000..8ea5693d --- /dev/null +++ b/glow/src/shader/compatibility/quad.frag @@ -0,0 +1,67 @@ +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#endif + +uniform float u_ScreenHeight; + +varying vec4 v_Color; +varying vec4 v_BorderColor; +varying vec2 v_Pos; +varying vec2 v_Scale; +varying float v_BorderRadius; +varying float v_BorderWidth; + +float _distance(vec2 frag_coord, vec2 position, vec2 size, float radius) +{ +    // TODO: Try SDF approach: https://www.shadertoy.com/view/wd3XRN +    vec2 inner_size = size - vec2(radius, radius) * 2.0; +    vec2 top_left = position + vec2(radius, radius); +    vec2 bottom_right = top_left + inner_size; + +    vec2 top_left_distance = top_left - frag_coord; +    vec2 bottom_right_distance = frag_coord - bottom_right; + +    vec2 distance = vec2( +        max(max(top_left_distance.x, bottom_right_distance.x), 0.0), +        max(max(top_left_distance.y, bottom_right_distance.y), 0.0) +    ); + +    return sqrt(distance.x * distance.x + distance.y * distance.y); +} + +void main() { +    vec2 fragCoord = vec2(gl_FragCoord.x, u_ScreenHeight - gl_FragCoord.y); + +    float internal_border = max(v_BorderRadius - v_BorderWidth, 0.0); + +    float internal_distance = _distance( +        fragCoord, +        v_Pos + vec2(v_BorderWidth), +        v_Scale - vec2(v_BorderWidth * 2.0), +        internal_border +    ); + +    float border_mix = smoothstep( +        max(internal_border - 0.5, 0.0), +        internal_border + 0.5, +        internal_distance +    ); + +    vec4 mixed_color = mix(v_Color, v_BorderColor, border_mix); + +    float d = _distance( +        fragCoord, +        v_Pos, +        v_Scale, +        v_BorderRadius +    ); + +    float radius_alpha = +        1.0 - smoothstep(max(v_BorderRadius - 0.5, 0.0), v_BorderRadius + 0.5, d); + +    gl_FragColor = vec4(mixed_color.xyz, mixed_color.w * radius_alpha); +} diff --git a/glow/src/shader/compatibility/quad.vert b/glow/src/shader/compatibility/quad.vert new file mode 100644 index 00000000..abe70c0e --- /dev/null +++ b/glow/src/shader/compatibility/quad.vert @@ -0,0 +1,44 @@ +uniform mat4 u_Transform; +uniform float u_Scale; + +attribute vec2 i_Pos; +attribute vec2 i_Scale; +attribute vec4 i_Color; +attribute vec4 i_BorderColor; +attribute float i_BorderRadius; +attribute float i_BorderWidth; +attribute vec2 q_Pos; + +varying vec4 v_Color; +varying vec4 v_BorderColor; +varying vec2 v_Pos; +varying vec2 v_Scale; +varying float v_BorderRadius; +varying float v_BorderWidth; + + +void main() { +    vec2 p_Pos = i_Pos * u_Scale; +    vec2 p_Scale = i_Scale  * u_Scale; + +    float i_BorderRadius = min( +        i_BorderRadius, +        min(i_Scale.x, i_Scale.y) / 2.0 +    ); + +    mat4 i_Transform = mat4( +        vec4(p_Scale.x + 1.0, 0.0, 0.0, 0.0), +        vec4(0.0, p_Scale.y + 1.0, 0.0, 0.0), +        vec4(0.0, 0.0, 1.0, 0.0), +        vec4(p_Pos - vec2(0.5, 0.5), 0.0, 1.0) +    ); + +    v_Color = i_Color; +    v_BorderColor = i_BorderColor; +    v_Pos = p_Pos; +    v_Scale = p_Scale; +    v_BorderRadius = i_BorderRadius * u_Scale; +    v_BorderWidth = i_BorderWidth * u_Scale; + +    gl_Position = u_Transform * i_Transform * vec4(q_Pos, 0.0, 1.0); +} diff --git a/glow/src/shader/quad.frag b/glow/src/shader/core/quad.frag index cea36bdc..57e2e8e7 100644 --- a/glow/src/shader/quad.frag +++ b/glow/src/shader/core/quad.frag @@ -1,4 +1,15 @@ -#version 330 +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#endif + +#ifdef HIGHER_THAN_300 +out vec4 fragColor; +#define gl_FragColor fragColor +#endif  uniform float u_ScreenHeight; @@ -9,9 +20,7 @@ in vec2 v_Scale;  in float v_BorderRadius;  in float v_BorderWidth; -out vec4 o_Color; - -float distance(in vec2 frag_coord, in vec2 position, in vec2 size, float radius) +float fDistance(vec2 frag_coord, vec2 position, vec2 size, float radius)  {      // TODO: Try SDF approach: https://www.shadertoy.com/view/wd3XRN      vec2 inner_size = size - vec2(radius, radius) * 2.0; @@ -35,10 +44,10 @@ void main() {      vec2 fragCoord = vec2(gl_FragCoord.x, u_ScreenHeight - gl_FragCoord.y);      // TODO: Remove branching (?) -    if(v_BorderWidth > 0) { +    if(v_BorderWidth > 0.0) {          float internal_border = max(v_BorderRadius - v_BorderWidth, 0.0); -        float internal_distance = distance( +        float internal_distance = fDistance(              fragCoord,              v_Pos + vec2(v_BorderWidth),              v_Scale - vec2(v_BorderWidth * 2.0), @@ -56,7 +65,7 @@ void main() {          mixed_color = v_Color;      } -    float d = distance( +    float d = fDistance(          fragCoord,          v_Pos,          v_Scale, @@ -66,5 +75,5 @@ void main() {      float radius_alpha =          1.0 - smoothstep(max(v_BorderRadius - 0.5, 0.0), v_BorderRadius + 0.5, d); -    o_Color = vec4(mixed_color.xyz, mixed_color.w * radius_alpha); +    gl_FragColor = vec4(mixed_color.xyz, mixed_color.w * radius_alpha);  } diff --git a/glow/src/shader/quad.vert b/glow/src/shader/core/quad.vert index 82417856..b1fb2365 100644 --- a/glow/src/shader/quad.vert +++ b/glow/src/shader/core/quad.vert @@ -1,14 +1,12 @@ -#version 330 -  uniform mat4 u_Transform;  uniform float u_Scale; -layout(location = 0) in vec2 i_Pos; -layout(location = 1) in vec2 i_Scale; -layout(location = 2) in vec4 i_Color; -layout(location = 3) in vec4 i_BorderColor; -layout(location = 4) in float i_BorderRadius; -layout(location = 5) in float i_BorderWidth; +in vec2 i_Pos; +in vec2 i_Scale; +in vec4 i_Color; +in vec4 i_BorderColor; +in float i_BorderRadius; +in float i_BorderWidth;  out vec4 v_Color;  out vec4 v_BorderColor; @@ -17,7 +15,7 @@ out vec2 v_Scale;  out float v_BorderRadius;  out float v_BorderWidth; -const vec2 positions[4] = vec2[]( +vec2 positions[4] = vec2[](      vec2(0.0, 0.0),      vec2(0.0, 1.0),      vec2(1.0, 0.0), diff --git a/glow/src/shader/triangle.frag b/glow/src/shader/triangle.frag deleted file mode 100644 index d186784a..00000000 --- a/glow/src/shader/triangle.frag +++ /dev/null @@ -1,9 +0,0 @@ -#version 330 - -in vec4 v_Color; - -out vec4 o_Color; - -void main() { -    o_Color = v_Color; -} | 
