spheres.frag.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /**
  2. * Copyright (c) 2019-2022 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. #define bumpEnabled
  10. #include common
  11. #include common_frag_params
  12. #include color_frag_params
  13. #include light_frag_params
  14. #include common_clip
  15. uniform mat4 uInvView;
  16. varying float vRadius;
  17. varying float vRadiusSq;
  18. varying vec3 vPoint;
  19. varying vec3 vPointViewPosition;
  20. vec3 cameraPos;
  21. vec3 cameraNormal;
  22. bool Impostor(out vec3 cameraPos, out vec3 cameraNormal){
  23. vec3 cameraSpherePos = -vPointViewPosition;
  24. cameraSpherePos.z += vRadius;
  25. vec3 rayOrigin = mix(vec3(0.0, 0.0, 0.0), vPoint, uIsOrtho);
  26. vec3 rayDirection = mix(normalize(vPoint), vec3(0.0, 0.0, 1.0), uIsOrtho);
  27. vec3 cameraSphereDir = mix(cameraSpherePos, rayOrigin - cameraSpherePos, uIsOrtho);
  28. float B = dot(rayDirection, cameraSphereDir);
  29. float det = B * B + vRadiusSq - dot(cameraSphereDir, cameraSphereDir);
  30. if (det < 0.0){
  31. discard;
  32. return false;
  33. }
  34. float sqrtDet = sqrt(det);
  35. float posT = mix(B + sqrtDet, B + sqrtDet, uIsOrtho);
  36. float negT = mix(B - sqrtDet, sqrtDet - B, uIsOrtho);
  37. cameraPos = rayDirection * negT + rayOrigin;
  38. if (calcDepth(cameraPos) <= 0.0) {
  39. cameraPos = rayDirection * posT + rayOrigin;
  40. interior = true;
  41. } else {
  42. interior = false;
  43. }
  44. cameraNormal = normalize(cameraPos - cameraSpherePos);
  45. cameraNormal *= float(!interior) * 2.0 - 1.0;
  46. return !interior;
  47. }
  48. void main(void){
  49. #include clip_pixel
  50. bool flag = Impostor(cameraPos, cameraNormal);
  51. if (!uDoubleSided) {
  52. if (interior) discard;
  53. }
  54. vec3 vViewPosition = cameraPos;
  55. float fragmentDepth = calcDepth(vViewPosition);
  56. if (!flag && fragmentDepth >= 0.0) {
  57. fragmentDepth = 0.0 + (0.0000001 / vRadius);
  58. }
  59. if (fragmentDepth < 0.0) discard;
  60. if (fragmentDepth > 1.0) discard;
  61. gl_FragDepthEXT = fragmentDepth;
  62. vec3 vModelPosition = (uInvView * vec4(vViewPosition, 1.0)).xyz;
  63. #include assign_material_color
  64. #if defined(dRenderVariant_pick)
  65. #include check_picking_alpha
  66. #ifdef requiredDrawBuffers
  67. gl_FragColor = vObject;
  68. gl_FragData[1] = vInstance;
  69. gl_FragData[2] = vGroup;
  70. gl_FragData[3] = packDepthToRGBA(fragmentDepth);
  71. #else
  72. gl_FragColor = vColor;
  73. #endif
  74. #elif defined(dRenderVariant_depth)
  75. gl_FragColor = material;
  76. #elif defined(dRenderVariant_marking)
  77. gl_FragColor = material;
  78. #elif defined(dRenderVariant_color)
  79. vec3 normal = -cameraNormal;
  80. #include apply_light_color
  81. #include apply_interior_color
  82. #include apply_marker_color
  83. #include apply_fog
  84. #include wboit_write
  85. #include dpoit_write
  86. #endif
  87. }
  88. `;