spheres.frag.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /**
  2. * Copyright (c) 2019-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. export const spheres_frag = `
  7. precision highp float;
  8. precision highp int;
  9. #include common
  10. #include common_frag_params
  11. #include color_frag_params
  12. #include light_frag_params
  13. #include common_clip
  14. uniform mat4 uInvView;
  15. varying float vRadius;
  16. varying float vRadiusSq;
  17. varying vec3 vPoint;
  18. varying vec3 vPointViewPosition;
  19. vec3 cameraPos;
  20. vec3 cameraNormal;
  21. bool Impostor(out vec3 cameraPos, out vec3 cameraNormal){
  22. vec3 cameraSpherePos = -vPointViewPosition;
  23. cameraSpherePos.z += vRadius;
  24. vec3 rayOrigin = mix(vec3(0.0, 0.0, 0.0), vPoint, uIsOrtho);
  25. vec3 rayDirection = mix(normalize(vPoint), vec3(0.0, 0.0, 1.0), uIsOrtho);
  26. vec3 cameraSphereDir = mix(cameraSpherePos, rayOrigin - cameraSpherePos, uIsOrtho);
  27. float B = dot(rayDirection, cameraSphereDir);
  28. float det = B * B + vRadiusSq - dot(cameraSphereDir, cameraSphereDir);
  29. if (det < 0.0){
  30. discard;
  31. return false;
  32. }
  33. float sqrtDet = sqrt(det);
  34. float posT = mix(B + sqrtDet, B + sqrtDet, uIsOrtho);
  35. float negT = mix(B - sqrtDet, sqrtDet - B, uIsOrtho);
  36. cameraPos = rayDirection * negT + rayOrigin;
  37. if (calcDepth(cameraPos) <= 0.0) {
  38. cameraPos = rayDirection * posT + rayOrigin;
  39. interior = true;
  40. } else {
  41. interior = false;
  42. }
  43. cameraNormal = normalize(cameraPos - cameraSpherePos);
  44. cameraNormal *= float(!interior) * 2.0 - 1.0;
  45. return !interior;
  46. }
  47. void main(void){
  48. #include clip_pixel
  49. bool flag = Impostor(cameraPos, cameraNormal);
  50. #ifndef dDoubleSided
  51. if (interior)
  52. discard;
  53. #endif
  54. vec3 vViewPosition = cameraPos;
  55. gl_FragDepthEXT = calcDepth(vViewPosition);
  56. if (!flag && gl_FragDepthEXT >= 0.0) {
  57. gl_FragDepthEXT = 0.0 + (0.0000001 / vRadius);
  58. }
  59. vec3 vModelPosition = (uInvView * vec4(vViewPosition, 1.0)).xyz;
  60. if (gl_FragDepthEXT < 0.0) discard;
  61. if (gl_FragDepthEXT > 1.0) discard;
  62. float fragmentDepth = gl_FragDepthEXT;
  63. #include assign_material_color
  64. #if defined(dRenderVariant_pick)
  65. #include check_picking_alpha
  66. gl_FragColor = material;
  67. #elif defined(dRenderVariant_depth)
  68. gl_FragColor = material;
  69. #elif defined(dRenderVariant_marking)
  70. gl_FragColor = material;
  71. #elif defined(dRenderVariant_color)
  72. #ifdef dIgnoreLight
  73. gl_FragColor = material;
  74. #else
  75. vec3 normal = -cameraNormal;
  76. #include apply_light_color
  77. #endif
  78. #include apply_interior_color
  79. #include apply_marker_color
  80. #include apply_fog
  81. #include wboit_write
  82. #endif
  83. }
  84. `;