spheres.frag.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. bool SphereImpostor(out vec3 modelPos, out vec3 cameraPos, out vec3 cameraNormal, out bool interior, out float fragmentDepth, out bool clipped){
  21. vec3 cameraSpherePos = -vPointViewPosition;
  22. vec3 rayOrigin = mix(vec3(0.0, 0.0, 0.0), vPoint, uIsOrtho);
  23. vec3 rayDirection = mix(normalize(vPoint), vec3(0.0, 0.0, 1.0), uIsOrtho);
  24. vec3 cameraSphereDir = mix(cameraSpherePos, rayOrigin - cameraSpherePos, uIsOrtho);
  25. float B = dot(rayDirection, cameraSphereDir);
  26. float det = B * B + vRadiusSq - dot(cameraSphereDir, cameraSphereDir);
  27. if (det < 0.0) return false;
  28. float sqrtDet = sqrt(det);
  29. float posT = mix(B + sqrtDet, B - sqrtDet, uIsOrtho);
  30. float negT = mix(B - sqrtDet, B + sqrtDet, uIsOrtho);
  31. cameraPos = rayDirection * negT + rayOrigin;
  32. modelPos = (uInvView * vec4(cameraPos, 1.0)).xyz;
  33. fragmentDepth = calcDepth(cameraPos);
  34. #if defined(dClipVariant_pixel) && dClipObjectCount != 0
  35. if (clipTest(vec4(modelPos, 0.0))) {
  36. clipped = true;
  37. fragmentDepth = -1.0;
  38. }
  39. #endif
  40. if (fragmentDepth > 0.0) {
  41. cameraNormal = normalize(cameraPos - cameraSpherePos);
  42. interior = false;
  43. return true;
  44. } else if (uDoubleSided) {
  45. cameraPos = rayDirection * posT + rayOrigin;
  46. modelPos = (uInvView * vec4(cameraPos, 1.0)).xyz;
  47. fragmentDepth = calcDepth(cameraPos);
  48. cameraNormal = -normalize(cameraPos - cameraSpherePos);
  49. interior = true;
  50. return true;
  51. }
  52. return false;
  53. }
  54. void main(void){
  55. vec3 modelPos;
  56. vec3 cameraPos;
  57. vec3 cameraNormal;
  58. float fragmentDepth;
  59. bool clipped = false;
  60. bool hit = SphereImpostor(modelPos, cameraPos, cameraNormal, interior, fragmentDepth, clipped);
  61. if (!hit) discard;
  62. if (fragmentDepth < 0.0) discard;
  63. if (fragmentDepth > 1.0) discard;
  64. vec3 vViewPosition = cameraPos;
  65. vec3 vModelPosition = modelPos;
  66. if (interior && !clipped) {
  67. fragmentDepth = 0.0 + (0.0000001 / vRadius);
  68. }
  69. gl_FragDepthEXT = fragmentDepth;
  70. #include clip_pixel
  71. #include assign_material_color
  72. #if defined(dRenderVariant_pick)
  73. #include check_picking_alpha
  74. #ifdef requiredDrawBuffers
  75. gl_FragColor = vObject;
  76. gl_FragData[1] = vInstance;
  77. gl_FragData[2] = vGroup;
  78. gl_FragData[3] = packDepthToRGBA(fragmentDepth);
  79. #else
  80. gl_FragColor = vColor;
  81. #endif
  82. #elif defined(dRenderVariant_depth)
  83. gl_FragColor = material;
  84. #elif defined(dRenderVariant_marking)
  85. gl_FragColor = material;
  86. #elif defined(dRenderVariant_color)
  87. vec3 normal = -cameraNormal;
  88. #include apply_light_color
  89. #include apply_interior_color
  90. #include apply_marker_color
  91. #include apply_fog
  92. #include wboit_write
  93. #include dpoit_write
  94. #endif
  95. }
  96. `;