gl renderer: Move work to the gradient vertex shader
authorTimm Bäder <mail@baedert.org>
Tue, 17 Dec 2019 11:20:18 +0000 (12:20 +0100)
committerTimm Bäder <mail@baedert.org>
Tue, 7 Jan 2020 16:27:16 +0000 (17:27 +0100)
No need to do this stuff once per fragment.

gsk/resources/glsl/linear_gradient.glsl

index f0ba46517f048acefde0fa3b9eb22357afbee067..0b5fefce834e68cf7b7fb8b4691dce17751f2bbb 100644 (file)
@@ -1,16 +1,35 @@
-// VERTEX_SHADER:
+// VERTEX_SHADER
+uniform vec2 u_start_point;
+uniform vec2 u_end_point;
+
+_OUT_ vec2 startPoint;
+_OUT_ vec2 endPoint;
+_OUT_ float maxDist;
+_OUT_ vec2 gradient;
+_OUT_ float gradientLength;
+
 void main() {
   gl_Position = u_projection * u_modelview * vec4(aPosition, 0.0, 1.0);
 
-  vUv = vec2(aUv.x, aUv.y);
+  startPoint = (u_modelview * vec4(u_start_point, 0, 1)).xy;
+  endPoint   = (u_modelview * vec4(u_end_point,   0, 1)).xy;
+  maxDist    = length(endPoint - startPoint);
+
+  // Gradient direction
+  gradient = endPoint - startPoint;
+  gradientLength = length(gradient);
 }
 
 // FRAGMENT_SHADER:
 uniform vec4 u_color_stops[8];
 uniform float u_color_offsets[8];
 uniform int u_num_color_stops;
-uniform vec2 u_start_point;
-uniform vec2 u_end_point;
+
+_IN_ vec2 startPoint;
+_IN_ vec2 endPoint;
+_IN_ float maxDist;
+_IN_ vec2 gradient;
+_IN_ float gradientLength;
 
 vec4 fragCoord() {
   vec4 f = gl_FragCoord;
@@ -20,17 +39,9 @@ vec4 fragCoord() {
 }
 
 void main() {
-  vec2 startPoint = (u_modelview * vec4(u_start_point, 0, 1)).xy;
-  vec2 endPoint   = (u_modelview * vec4(u_end_point,   0, 1)).xy;
-  float maxDist   = length(endPoint - startPoint);
-
   // Position relative to startPoint
   vec2 pos = fragCoord().xy - startPoint;
 
-  // Gradient direction
-  vec2 gradient = endPoint - startPoint;
-  float gradientLength = length(gradient);
-
   // Current pixel, projected onto the line between the start point and the end point
   // The projection will be relative to the start point!
   vec2 proj = (dot(gradient, pos) / (gradientLength * gradientLength)) * gradient;