gaussian-density.frag 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. * @author Michael Krone <michael.krone@uni-tuebingen.de>
  6. */
  7. precision highp float;
  8. varying vec3 vPosition;
  9. varying float vRadius;
  10. #if defined(dCalcType_groupId)
  11. #if defined(dGridTexType_2d)
  12. precision mediump sampler2D;
  13. uniform sampler2D tMinDistanceTex;
  14. uniform vec3 uGridTexDim;
  15. #elif defined(dGridTexType_3d)
  16. precision highp sampler3D;
  17. uniform sampler3D tMinDistanceTex;
  18. #endif
  19. varying float vGroup;
  20. #endif
  21. #pragma glslify: import('./chunks/common.glsl')
  22. #pragma glslify: encodeFloatLog = require(./utils/encode-float-log.glsl)
  23. #pragma glslify: decodeFloatLog = require(./utils/decode-float-log.glsl)
  24. #pragma glslify: encodeFloatRGB = require(./utils/encode-float-rgb.glsl)
  25. #pragma glslify: texture3dFrom2dNearest = require(./utils/texture3d-from-2d-nearest.glsl, intMod=intMod, intDiv=intDiv, foo=foo) // foo=foo is a workaround for a bug in glslify
  26. uniform vec3 uBboxSize;
  27. uniform vec3 uBboxMin;
  28. uniform vec3 uBboxMax;
  29. uniform vec3 uGridDim;
  30. uniform float uCurrentSlice;
  31. uniform float uCurrentX;
  32. uniform float uCurrentY;
  33. uniform float uAlpha;
  34. #if defined(dCalcType_groupId)
  35. #if defined(dGridTexType_2d)
  36. vec4 textureMinDist(vec3 pos) {
  37. return texture3dFrom2dNearest(tMinDistanceTex, pos, uGridDim, uGridTexDim.xy);
  38. }
  39. #elif defined(dGridTexType_3d)
  40. vec4 textureMinDist(vec3 pos) {
  41. return texture(tMinDistanceTex, pos);
  42. }
  43. #endif
  44. #endif
  45. void main() {
  46. vec2 v = gl_FragCoord.xy - vec2(uCurrentX, uCurrentY) - 0.5;
  47. vec3 fragPos = vec3(v.x, v.y, uCurrentSlice) / uGridDim;
  48. float dist = distance(fragPos * uBboxSize, vPosition * uBboxSize);
  49. #if defined(dCalcType_density)
  50. float radiusSq = vRadius * vRadius;
  51. float density = exp(-uAlpha * ((dist * dist) / radiusSq));
  52. gl_FragColor = vec4(density);
  53. #elif defined(dCalcType_minDistance)
  54. gl_FragColor.a = 1.0 - encodeFloatLog(dist);
  55. #elif defined(dCalcType_groupId)
  56. float minDistance = decodeFloatLog(1.0 - textureMinDist(fragPos).a);
  57. // TODO verify `length(uBboxSize / uGridDim) * 2.0`
  58. // on some machines `* 2.0` is needed while on others `* 0.5` works
  59. if (dist > minDistance + length(uBboxSize / uGridDim) * 0.5)
  60. discard;
  61. gl_FragColor.rgb = encodeFloatRGB(vGroup);
  62. #endif
  63. }