spheres.frag.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. varying float vRadius;
  15. varying float vRadiusSq;
  16. varying vec3 vPoint;
  17. varying vec3 vPointViewPosition;
  18. vec3 cameraPos;
  19. vec3 cameraNormal;
  20. bool Impostor(out vec3 cameraPos, out vec3 cameraNormal){
  21. vec3 cameraSpherePos = -vPointViewPosition;
  22. cameraSpherePos.z += vRadius;
  23. vec3 rayOrigin = mix(vec3(0.0, 0.0, 0.0), vPoint, uIsOrtho);
  24. vec3 rayDirection = mix(normalize(vPoint), vec3(0.0, 0.0, 1.0), uIsOrtho);
  25. vec3 cameraSphereDir = mix(cameraSpherePos, rayOrigin - cameraSpherePos, uIsOrtho);
  26. float B = dot(rayDirection, cameraSphereDir);
  27. float det = B * B + vRadiusSq - dot(cameraSphereDir, cameraSphereDir);
  28. if (det < 0.0){
  29. discard;
  30. return false;
  31. }
  32. float sqrtDet = sqrt(det);
  33. float posT = mix(B + sqrtDet, B + sqrtDet, uIsOrtho);
  34. float negT = mix(B - sqrtDet, sqrtDet - B, uIsOrtho);
  35. cameraPos = rayDirection * negT + rayOrigin;
  36. if (calcDepth(cameraPos) <= 0.0) {
  37. cameraPos = rayDirection * posT + rayOrigin;
  38. interior = true;
  39. } else {
  40. interior = false;
  41. }
  42. cameraNormal = normalize(cameraPos - cameraSpherePos);
  43. cameraNormal *= float(!interior) * 2.0 - 1.0;
  44. return !interior;
  45. }
  46. void main(void){
  47. #include clip_pixel
  48. bool flag = Impostor(cameraPos, cameraNormal);
  49. #ifndef dDoubleSided
  50. if (interior)
  51. discard;
  52. #endif
  53. vec3 vViewPosition = cameraPos;
  54. gl_FragDepthEXT = calcDepth(vViewPosition);
  55. if (!flag && gl_FragDepthEXT >= 0.0) {
  56. gl_FragDepthEXT = 0.0 + (0.0000001 / vRadius);
  57. }
  58. // bugfix (mac only?)
  59. if (gl_FragDepthEXT < 0.0) discard;
  60. if (gl_FragDepthEXT > 1.0) discard;
  61. float fragmentDepth = gl_FragDepthEXT;
  62. #include assign_material_color
  63. #if defined(dRenderVariant_pick)
  64. #include check_picking_alpha
  65. gl_FragColor = material;
  66. #elif defined(dRenderVariant_depth)
  67. gl_FragColor = material;
  68. #elif defined(dRenderVariant_marking)
  69. gl_FragColor = material;
  70. #elif defined(dRenderVariant_color)
  71. #ifdef dIgnoreLight
  72. gl_FragColor = material;
  73. #else
  74. vec3 normal = -cameraNormal;
  75. #include apply_light_color
  76. #endif
  77. #include apply_interior_color
  78. #include apply_marker_color
  79. #include apply_fog
  80. #include wboit_write
  81. #endif
  82. }
  83. `;