From e2c28b3130e5947ad8d3aa1618b177e798539dd8 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Fri, 7 Dec 2012 12:41:42 +0000 Subject: [PATCH] tutorial: optimise the line graph rendering shader. --- tutorial/04_texture.lolfx | 63 ++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 38 deletions(-) diff --git a/tutorial/04_texture.lolfx b/tutorial/04_texture.lolfx index 278faeca..24c47a11 100644 --- a/tutorial/04_texture.lolfx +++ b/tutorial/04_texture.lolfx @@ -20,59 +20,46 @@ uniform sampler2D u_Texture; varying vec4 pass_Position; -float rand(in vec2 p, in float v) +float segdist(vec2 p1, vec2 p2, vec2 a) { - return fract(v * sin(dot(p, vec2(1298.9837, 7823.33145)))); + float d = max(1e-10, dot(p2 - p1, p2 - p1)); + float t = clamp(dot(a - p1, p2 - p1) / d, 0.0, 1.0); + return distance(a, mix(p1, p2, t)); } -float point2segment(vec2 p1, vec2 p2, vec2 a) -{ - float l2 = dot(p2 - p1, p2 - p1); - if (l2 == 0.0) - return distance(a, p1); - float t = dot(a - p1, p2 - p1) / l2; - if (t < 0.0) - return distance(a, p1); - else if (t > 1.0) - return distance(a, p2); - vec2 proj = p1 + t * (p2 - p1); - return distance(a, proj); -} - - void main(void) { float width = 800.0; float height = 600.0; - float line_width = 2.0; - - vec2 t = pass_Position.xy; - vec2 tc1 = floor(t * 128.0) / 128.0; - vec2 tc2 = tc1 + vec2(1.0, 1.0) / 128.0; - vec2 tc0 = tc1 - vec2(1.0, 1.0) / 128.0; - vec2 tc3 = tc2 + vec2(1.0, 1.0) / 128.0; + float line_width = 1.8; + vec4 delta = vec4(1.0 / 128, 0.0, + 2.0 / 128, 0.0); + vec2 p = pass_Position.xy; + vec2 tc = vec2(floor(p.x * 128.0) / 128.0, p.y); + float t = p.x * 128.0 - floor(p.x * 128.0); vec4 c; - c[0] = texture2D(u_Texture, tc0).x; - c[1] = texture2D(u_Texture, tc1).x; - c[2] = texture2D(u_Texture, tc2).x; - c[3] = texture2D(u_Texture, tc3).x; + c[0] = texture2D(u_Texture, tc - delta.xy).x; + c[1] = texture2D(u_Texture, tc).x; + c[2] = texture2D(u_Texture, tc + delta.xy).x; + c[3] = texture2D(u_Texture, tc + delta.zw).x; - /* Artificially compress in Y */ + /* Quick hack: artificially compress display in Y */ c *= 0.3; - vec2 p0 = vec2(tc0.x * width, c[0] * height); - vec2 p1 = vec2(tc1.x * width, c[1] * height); - vec2 p2 = vec2(tc2.x * width, c[2] * height); - vec2 p3 = vec2(tc3.x * width, c[3] * height); - vec2 a = vec2(t.x * width, t.y * height); + vec2 p0 = vec2((tc.x - delta.x) * width, c[0] * height); + vec2 p1 = vec2((tc.x) * width, c[1] * height); + vec2 p2 = vec2((tc.x + delta.x) * width, c[2] * height); + vec2 p3 = vec2((tc.x + delta.z) * width, c[3] * height); + vec2 a = vec2(p.x * width, p.y * height); - float d0 = point2segment(p0, p1, a); - float d1 = point2segment(p1, p2, a); - float d2 = point2segment(p2, p3, a); + float d0 = segdist(p0, p1, a); + float d1 = segdist(p1, p2, a); + float d2 = segdist(p2, p3, a); float d = clamp(line_width - min(min(d0, d1), d2), 0.0, 1.0); - gl_FragColor = vec4(t.y, d, d * 0.3, 1.0); + /* Choose some funny colours */ + gl_FragColor = vec4(p.y, d, mix(p.x, 0.3, d), 1.0); }