您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

04_texture.lolfx 2.0 KiB

12 年前
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. [vert.glsl]
  2. #version 120
  3. attribute vec2 in_Position;
  4. varying vec4 pass_Position;
  5. void main(void)
  6. {
  7. pass_Position = vec4(0.5 * in_Position + 0.5, 0.0, 1.0);
  8. gl_Position = vec4(in_Position, 0.5, 1.0);
  9. }
  10. [frag.glsl]
  11. #version 120
  12. uniform sampler2D u_Texture;
  13. varying vec4 pass_Position;
  14. float segdist(vec2 p1, vec2 p2, vec2 a)
  15. {
  16. float d = max(1e-10, dot(p2 - p1, p2 - p1));
  17. float t = clamp(dot(a - p1, p2 - p1) / d, 0.0, 1.0);
  18. return distance(a, mix(p1, p2, t));
  19. }
  20. void main(void)
  21. {
  22. float width = 800.0;
  23. float height = 600.0;
  24. float texture_width = 256.0;
  25. float line_width = 1.2;
  26. float dot_size = 1.0;
  27. vec4 delta = vec4(1.0 / texture_width, 0.0,
  28. 2.0 / texture_width, 0.0);
  29. vec2 p = pass_Position.xy;
  30. vec2 tc = vec2(floor(p.x * texture_width) / texture_width, p.y);
  31. float t = p.x * texture_width - floor(p.x * texture_width);
  32. vec4 c;
  33. c[0] = texture2D(u_Texture, tc - delta.xy).x;
  34. c[1] = texture2D(u_Texture, tc).x;
  35. c[2] = texture2D(u_Texture, tc + delta.xy).x;
  36. c[3] = texture2D(u_Texture, tc + delta.zw).x;
  37. /* Find the 4 closest points in screen space */
  38. vec2 p0 = vec2((tc.x - delta.x) * width, c[0] * height);
  39. vec2 p1 = vec2((tc.x ) * width, c[1] * height);
  40. vec2 p2 = vec2((tc.x + delta.x) * width, c[2] * height);
  41. vec2 p3 = vec2((tc.x + delta.z) * width, c[3] * height);
  42. vec2 a = vec2(p.x * width, p.y * height);
  43. /* Compute distance to segments */
  44. float d = segdist(p0, p1, a);
  45. d = min(d, segdist(p1, p2, a));
  46. d = min(d, segdist(p2, p3, a));
  47. /* Compute distance to dots */
  48. d = min(d, length(a - p0) - dot_size);
  49. d = min(d, length(a - p1) - dot_size);
  50. d = min(d, length(a - p2) - dot_size);
  51. d = min(d, length(a - p3) - dot_size);
  52. /* Add line width */
  53. float lum = clamp(line_width - d, 0.0, 1.0);
  54. /* Compensate for sRGB */
  55. lum = pow(1.0 - lum, 1.0 / 2.4);
  56. /* Choose some funny colours */
  57. gl_FragColor = vec4(mix(p.x, 1.0, lum), lum, lum, 1.0);
  58. }