summaryrefslogtreecommitdiff
path: root/vcl/opengl/combinedVertexShader.glsl
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2016-06-07 20:45:14 +0900
committerTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2016-06-08 17:12:28 +0900
commitce72e34b359c323ef7ff96a70500810a9cd8703a (patch)
tree7436ef509b6670c4331d2e2f0c552728e13ea1f8 /vcl/opengl/combinedVertexShader.glsl
parent4bdbfdd6426460c562746c67c29a3b5e2bef8563 (diff)
opengl: batch drawing of polylines
To get polylines to draw in a batch it was necessary to refactor the polyline code to work with GL_TRIANGLES instead of the previous used GL_TRIANGLE_STRIP. For this and to make the code easier to handle a new class was introduced: LineBuilder, which purpose is to assemble vertices for a polyline (line ends, line joints). In addition we need to know the line width, anti-aliasing (AA) per vertex basis (in addition to color, normal and extrusion) so we can draw many polylines with one draw call. This info is now stored in Vertex struct which is used when drawing lines or triangles (fills). Uploading of vertices has also been changed, previously we uploaded the vertices with the drawcall. a convention in Modern OpenGL is however to use VBO (Vertex Buffer Object) for this. With this we can upload the to the GPU vertices independently and not upload them if this is not needed (which is currently not used yet). A vector of Vertex structs is now uploaded to the GPU using a VBO which is handeled with a new VertexBufferObject class. In addition to reduce the ammount of duplicated vertices, we use a index vector (handled by IndexBufferObject class) where we only define the indices of the vertex buffer which should be drawn. Change-Id: I49dc9c6260b459f4f4ce3a5e4fa4c8ad05a7b878
Diffstat (limited to 'vcl/opengl/combinedVertexShader.glsl')
-rw-r--r--vcl/opengl/combinedVertexShader.glsl32
1 files changed, 25 insertions, 7 deletions
diff --git a/vcl/opengl/combinedVertexShader.glsl b/vcl/opengl/combinedVertexShader.glsl
index 8c6a856cd7d6..3337a085db6f 100644
--- a/vcl/opengl/combinedVertexShader.glsl
+++ b/vcl/opengl/combinedVertexShader.glsl
@@ -14,6 +14,8 @@ attribute vec4 vertex_color_in;
#endif
varying float fade_factor; // fade factor for anti-aliasing
+varying float multiply;
+
#ifdef USE_VERTEX_COLORS
varying vec4 vertex_color;
#endif
@@ -30,26 +32,42 @@ uniform int type;
void main()
{
- vec4 final_position = vec4(position, 0.0, 1.0);
+ vec2 extrusion_vector = extrusion_vectors.xy;
+
+ float render_thickness = 0.0;
if (type == TYPE_LINE)
{
- vec2 extrusion_vector = extrusion_vectors.xy;
// miter factor to additionaly lenghten the distance of vertex (needed for miter)
// if 1.0 - miter_factor has no effect
- float miter_factor = 1.0f / abs(extrusion_vectors.z);
+ float miter_factor = 1.0 / abs(extrusion_vectors.z);
// fade factor is always -1.0 or 1.0 -> we transport that info together with length
fade_factor = sign(extrusion_vectors.z);
+#ifdef USE_VERTEX_COLORS
+ float the_feather = (1.0 + sign(extrusion_vectors.w)) / 4.0;
+ float the_line_width = abs(extrusion_vectors.w);
+#else
+ float the_feather = feather;
+ float the_line_width = line_width;
+#endif
+ render_thickness = (the_line_width * miter_factor + the_feather * 2.0 * miter_factor);
- float rendered_thickness = (line_width + feather * 2.0) * miter_factor;
+ // Calculate the multiplier so we can transform the 0->1 fade factor
+ // to take feather and line width into account.
- // lengthen the vertex in directon of the extrusion vector by line width.
- final_position = vec4(position + (extrusion_vector * (rendered_thickness / 2.0) ), 0.0, 1.0);
+ float start = mix(0.0, (the_line_width / 2.0) - the_feather, the_feather * 2.0);
+ float end = mix(1.0, (the_line_width / 2.0) + the_feather, the_feather * 2.0);
+
+ multiply = 1.0 / (1.0 - (start / end));
}
+ // lengthen the vertex in directon of the extrusion vector by line width.
+ vec4 final_position = vec4(position + (extrusion_vector * (render_thickness / 2.0) ), 0.0, 1.0);
+
gl_Position = mvp * final_position;
+
#ifdef USE_VERTEX_COLORS
- vertex_color = vertex_color_in;
+ vertex_color = vertex_color_in / 255.0;
#endif
}