EdgeDetection.glsl 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. uniform sampler2D depthTexture;
  2. uniform float length;
  3. uniform vec4 color;
  4. varying vec2 v_textureCoordinates;
  5. void main(void)
  6. {
  7. float directions[3];
  8. directions[0] = -1.0;
  9. directions[1] = 0.0;
  10. directions[2] = 1.0;
  11. float scalars[3];
  12. scalars[0] = 3.0;
  13. scalars[1] = 10.0;
  14. scalars[2] = 3.0;
  15. float padx = czm_pixelRatio / czm_viewport.z;
  16. float pady = czm_pixelRatio / czm_viewport.w;
  17. #ifdef CZM_SELECTED_FEATURE
  18. bool selected = false;
  19. for (int i = 0; i < 3; ++i)
  20. {
  21. float dir = directions[i];
  22. selected = selected || czm_selected(vec2(-padx, dir * pady));
  23. selected = selected || czm_selected(vec2(padx, dir * pady));
  24. selected = selected || czm_selected(vec2(dir * padx, -pady));
  25. selected = selected || czm_selected(vec2(dir * padx, pady));
  26. if (selected)
  27. {
  28. break;
  29. }
  30. }
  31. if (!selected)
  32. {
  33. gl_FragColor = vec4(color.rgb, 0.0);
  34. return;
  35. }
  36. #endif
  37. float horizEdge = 0.0;
  38. float vertEdge = 0.0;
  39. for (int i = 0; i < 3; ++i)
  40. {
  41. float dir = directions[i];
  42. float scale = scalars[i];
  43. horizEdge -= texture2D(depthTexture, v_textureCoordinates + vec2(-padx, dir * pady)).x * scale;
  44. horizEdge += texture2D(depthTexture, v_textureCoordinates + vec2(padx, dir * pady)).x * scale;
  45. vertEdge -= texture2D(depthTexture, v_textureCoordinates + vec2(dir * padx, -pady)).x * scale;
  46. vertEdge += texture2D(depthTexture, v_textureCoordinates + vec2(dir * padx, pady)).x * scale;
  47. }
  48. float len = sqrt(horizEdge * horizEdge + vertEdge * vertEdge);
  49. gl_FragColor = vec4(color.rgb, len > length ? color.a : 0.0);
  50. }