1 | [vert.glsl] |
---|

2 | |
---|

3 | #version 120 |
---|

4 | |
---|

5 | attribute vec2 in_Position; |
---|

6 | |
---|

7 | varying vec4 pass_Position; |
---|

8 | |
---|

9 | void main(void) |
---|

10 | { |
---|

11 | pass_Position = vec4(0.5 * in_Position + 0.5, 0.0, 1.0); |
---|

12 | gl_Position = vec4(in_Position, 0.5, 1.0); |
---|

13 | } |
---|

14 | |
---|

15 | [frag.glsl] |
---|

16 | |
---|

17 | #version 120 |
---|

18 | |
---|

19 | uniform sampler2D u_Texture; |
---|

20 | |
---|

21 | varying vec4 pass_Position; |
---|

22 | |
---|

23 | float rand(in vec2 p, in float v) |
---|

24 | { |
---|

25 | return fract(v * sin(dot(p, vec2(1298.9837, 7823.33145)))); |
---|

26 | } |
---|

27 | |
---|

28 | float point2segment(vec2 p1, vec2 p2, vec2 a) |
---|

29 | { |
---|

30 | float l2 = dot(p2 - p1, p2 - p1); |
---|

31 | if (l2 == 0.0) |
---|

32 | return distance(a, p1); |
---|

33 | float t = dot(a - p1, p2 - p1) / l2; |
---|

34 | if (t < 0.0) |
---|

35 | return distance(a, p1); |
---|

36 | else if (t > 1.0) |
---|

37 | return distance(a, p2); |
---|

38 | vec2 proj = p1 + t * (p2 - p1); |
---|

39 | return distance(a, proj); |
---|

40 | } |
---|

41 | |
---|

42 | |
---|

43 | void main(void) |
---|

44 | { |
---|

45 | float width = 800.0; |
---|

46 | float height = 600.0; |
---|

47 | float line_width = 2.0; |
---|

48 | |
---|

49 | vec2 t = pass_Position.xy; |
---|

50 | vec2 tc1 = floor(t * 128.0) / 128.0; |
---|

51 | vec2 tc2 = tc1 + vec2(1.0, 1.0) / 128.0; |
---|

52 | vec2 tc0 = tc1 - vec2(1.0, 1.0) / 128.0; |
---|

53 | vec2 tc3 = tc2 + vec2(1.0, 1.0) / 128.0; |
---|

54 | |
---|

55 | vec4 c; |
---|

56 | c[0] = texture2D(u_Texture, tc0).x; |
---|

57 | c[1] = texture2D(u_Texture, tc1).x; |
---|

58 | c[2] = texture2D(u_Texture, tc2).x; |
---|

59 | c[3] = texture2D(u_Texture, tc3).x; |
---|

60 | |
---|

61 | /* Artificially compress in Y */ |
---|

62 | c *= 0.3; |
---|

63 | |
---|

64 | vec2 p0 = vec2(tc0.x * width, c[0] * height); |
---|

65 | vec2 p1 = vec2(tc1.x * width, c[1] * height); |
---|

66 | vec2 p2 = vec2(tc2.x * width, c[2] * height); |
---|

67 | vec2 p3 = vec2(tc3.x * width, c[3] * height); |
---|

68 | vec2 a = vec2(t.x * width, t.y * height); |
---|

69 | |
---|

70 | float d0 = point2segment(p0, p1, a); |
---|

71 | float d1 = point2segment(p1, p2, a); |
---|

72 | float d2 = point2segment(p2, p3, a); |
---|

73 | |
---|

74 | float d = clamp(line_width - min(min(d0, d1), d2), 0.0, 1.0); |
---|

75 | |
---|

76 | gl_FragColor = vec4(t.y, d, d * 0.3, 1.0); |
---|

77 | } |
---|

78 | |
---|