diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-04-07 00:54:24 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-04-07 00:54:39 +0300 |
commit | 2d618974d14672e6ec38612e76aca70e619f7242 (patch) | |
tree | 4d670fd5d6e6b55c6fe75ac27c5bd030f9906667 /source/blender/gpu/shaders | |
parent | 3e998b886080d3cd11137327356d1c861ae7ddb4 (diff) |
UI: Perf: Port color widgets to batch.
This is more for completeness than perf.
Shader is tiny bit more complex but we get less overdraw and drawcalls.
Diffstat (limited to 'source/blender/gpu/shaders')
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_2D_widget_base_frag.glsl | 34 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl | 14 |
2 files changed, 47 insertions, 1 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_frag.glsl b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_frag.glsl new file mode 100644 index 00000000000..929674ab446 --- /dev/null +++ b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_frag.glsl @@ -0,0 +1,34 @@ +uniform vec3 checkerColorAndSize; + +noperspective in vec4 finalColor; +noperspective in float butCo; + +out vec4 fragColor; + +vec4 do_checkerboard() +{ + float size = checkerColorAndSize.z; + vec2 phase = mod(gl_FragCoord.xy, size * 2.0); + + if ((phase.x > size && phase.y < size) || + (phase.x < size && phase.y > size)) + { + return vec4(checkerColorAndSize.xxx, 1.0); + } + else { + return vec4(checkerColorAndSize.yyy, 1.0); + } +} + +void main() +{ + fragColor = finalColor; + + if (butCo > 0.5) { + fragColor = mix(do_checkerboard(), fragColor, fragColor.a); + } + + if (butCo > 0.0) { + fragColor.a = 1.0; + } +}
\ No newline at end of file diff --git a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl index f4dafd7de16..9f28d9bb3a3 100644 --- a/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl +++ b/source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl @@ -95,10 +95,12 @@ uniform vec4 parameters[11]; #define tria1Size parameters[gl_InstanceID * 11 + 10].x #define tria2Size parameters[gl_InstanceID * 11 + 10].y #define shadeDir parameters[gl_InstanceID * 11 + 10].z +#define doAlphaCheck parameters[gl_InstanceID * 11 + 10].w in uint vflag; noperspective out vec4 finalColor; +noperspective out float butCo; vec2 do_widget(void) { @@ -128,13 +130,22 @@ vec2 do_widget(void) if (color_id == COLOR_INNER) { vec2 uv = faci * (v - recti.xz); float fac = clamp((shadeDir > 0.0) ? uv.y : uv.x, 0.0, 1.0); - finalColor = mix(colorInner2, colorInner1, fac); + if (doAlphaCheck != 0.0) { + finalColor = colorInner1; + butCo = uv.x; + } + else { + finalColor = mix(colorInner2, colorInner1, fac); + butCo = -1.0; + } } else if (color_id == COLOR_EDGE) { finalColor = colorEdge; + butCo = -1.0; } else /* (color_id == COLOR_EMBOSS) */ { finalColor = colorEmboss; + butCo = -1.0; } bool is_emboss = (vflag & EMBOSS_FLAG) != 0u; @@ -150,6 +161,7 @@ vec2 do_tria() vec2 v = triavec[vofs]; finalColor = colorTria; + butCo = -1.0; bool is_tria_first = (vflag & TRIA_FIRST) != 0u; |