diff options
author | Timm Bäder <mail@baedert.org> | 2019-12-17 12:20:18 +0100 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2020-01-07 17:27:16 +0100 |
commit | cef7f7f87d0e3a60925c7d4a7f461932481c302a (patch) | |
tree | b064cf52655bd0b115444ba9ef07a7734bd3830c /gsk | |
parent | fdce30d3f8b00c69d8160278afaf2e82e933fcdc (diff) | |
download | gtk+-cef7f7f87d0e3a60925c7d4a7f461932481c302a.tar.gz |
gl renderer: Move work to the gradient vertex shader
No need to do this stuff once per fragment.
Diffstat (limited to 'gsk')
-rw-r--r-- | gsk/resources/glsl/linear_gradient.glsl | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/gsk/resources/glsl/linear_gradient.glsl b/gsk/resources/glsl/linear_gradient.glsl index f0ba46517f..0b5fefce83 100644 --- a/gsk/resources/glsl/linear_gradient.glsl +++ b/gsk/resources/glsl/linear_gradient.glsl @@ -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; |