Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-08-23 23:29:29 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-08-23 23:29:45 +0300
commit34b3d6e2f88c275032cfec5aacd036cb65d20dc3 (patch)
tree591bbf8f3008fe418ac0c185fafb614a579d670b /source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl
parentfb7fc3be194ba324b84eaa1c538bf3f8b74c726e (diff)
UI: Optimize the area border drawing
It is was not really a bottleneck but it was triggering my OCD when 1/3rd of the drawcalls in a normal scene were basically only caused by this.
Diffstat (limited to 'source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl')
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl42
1 files changed, 42 insertions, 0 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl
new file mode 100644
index 00000000000..5326076e269
--- /dev/null
+++ b/source/blender/gpu/shaders/gpu_shader_2D_area_borders_vert.glsl
@@ -0,0 +1,42 @@
+
+uniform mat4 ModelViewProjectionMatrix;
+
+uniform vec4 rect;
+uniform int cornerLen;
+uniform float scale;
+
+in vec2 pos;
+
+const vec2 jitter_ofs[8] = vec2[8](
+ vec2( 0.468813, -0.481430), vec2(-0.155755, -0.352820),
+ vec2( 0.219306, -0.238501), vec2(-0.393286, -0.110949),
+ vec2(-0.024699, 0.013908), vec2( 0.343805, 0.147431),
+ vec2(-0.272855, 0.269918), vec2( 0.095909, 0.388710)
+);
+
+void main()
+{
+ int corner_id = (gl_VertexID / cornerLen) % 4;
+ int jitter_id = gl_VertexID / (cornerLen * 4) % 8;
+
+ vec2 final_pos = pos * scale;
+
+ if (corner_id == 0)
+ final_pos += rect.yw; /* top right */
+ else if (corner_id == 1)
+ final_pos += rect.xw; /* top left */
+ else if (corner_id == 2)
+ final_pos += rect.xz; /* bottom left */
+ else
+ final_pos += rect.yz; /* bottom right */
+
+ /* Only jitter verts inside the corner (not the one shared with the edges). */
+ if ((gl_VertexID % cornerLen) % (cornerLen - 2) != 0) {
+ /* Only jitter intern verts not boundaries. */
+ if ((gl_VertexID % 2) == 0) {
+ final_pos += jitter_ofs[jitter_id];
+ }
+ }
+
+ gl_Position = (ModelViewProjectionMatrix * vec4(final_pos, 0.0, 1.0));
+}