spheres.frag.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**
  2. * Copyright (c) 2019-2023 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. uniform float uAlphaThickness;
  17. varying float vRadius;
  18. varying vec3 vPoint;
  19. varying vec3 vPointViewPosition;
  20. #ifdef dSolidInterior
  21. const bool solidInterior = true;
  22. #else
  23. const bool solidInterior = false;
  24. #endif
  25. bool SphereImpostor(out vec3 modelPos, out vec3 cameraPos, out vec3 cameraNormal, out bool interior, out float fragmentDepth){
  26. vec3 cameraSpherePos = -vPointViewPosition;
  27. vec3 rayOrigin = mix(vec3(0.0, 0.0, 0.0), vPoint, uIsOrtho);
  28. vec3 rayDirection = mix(normalize(vPoint), vec3(0.0, 0.0, 1.0), uIsOrtho);
  29. vec3 cameraSphereDir = mix(cameraSpherePos, rayOrigin - cameraSpherePos, uIsOrtho);
  30. float B = dot(rayDirection, cameraSphereDir);
  31. float det = B * B + vRadius * vRadius - dot(cameraSphereDir, cameraSphereDir);
  32. if (det < 0.0) return false;
  33. float sqrtDet = sqrt(det);
  34. float posT = mix(B + sqrtDet, B - sqrtDet, uIsOrtho);
  35. float negT = mix(B - sqrtDet, B + sqrtDet, uIsOrtho);
  36. cameraPos = rayDirection * negT + rayOrigin;
  37. modelPos = (uInvView * vec4(cameraPos, 1.0)).xyz;
  38. fragmentDepth = calcDepth(cameraPos);
  39. bool objectClipped = false;
  40. #if !defined(dClipPrimitive) && defined(dClipVariant_pixel) && dClipObjectCount != 0
  41. if (clipTest(vec4(modelPos, 0.0))) {
  42. objectClipped = true;
  43. fragmentDepth = -1.0;
  44. }
  45. #endif
  46. if (fragmentDepth > 0.0) {
  47. cameraNormal = normalize(cameraPos - cameraSpherePos);
  48. interior = false;
  49. return true;
  50. } else if (uDoubleSided || solidInterior) {
  51. cameraPos = rayDirection * posT + rayOrigin;
  52. modelPos = (uInvView * vec4(cameraPos, 1.0)).xyz;
  53. fragmentDepth = calcDepth(cameraPos);
  54. cameraNormal = -normalize(cameraPos - cameraSpherePos);
  55. interior = true;
  56. if (fragmentDepth > 0.0) {
  57. #ifdef dSolidInterior
  58. if (!objectClipped) {
  59. fragmentDepth = 0.0 + (0.0000001 / vRadius);
  60. cameraNormal = -mix(normalize(vPoint), vec3(0.0, 0.0, 1.0), uIsOrtho);
  61. }
  62. #endif
  63. return true;
  64. }
  65. }
  66. return false;
  67. }
  68. void main(void){
  69. vec3 cameraNormal;
  70. float fragmentDepth;
  71. #ifdef dApproximate
  72. vec3 pointDir = -vPointViewPosition - vPoint;
  73. if (dot(pointDir, pointDir) > vRadius * vRadius) discard;
  74. vec3 vViewPosition = -vPointViewPosition;
  75. fragmentDepth = gl_FragCoord.z;
  76. #if !defined(dIgnoreLight) || defined(dXrayShaded)
  77. pointDir.z -= cos(length(pointDir) / vRadius);
  78. cameraNormal = -normalize(pointDir / vRadius);
  79. #endif
  80. interior = false;
  81. #else
  82. vec3 modelPos;
  83. vec3 cameraPos;
  84. bool hit = SphereImpostor(modelPos, cameraPos, cameraNormal, interior, fragmentDepth);
  85. if (!hit) discard;
  86. if (fragmentDepth < 0.0) discard;
  87. if (fragmentDepth > 1.0) discard;
  88. gl_FragDepthEXT = fragmentDepth;
  89. vec3 vModelPosition = modelPos;
  90. vec3 vViewPosition = cameraPos;
  91. #endif
  92. #if !defined(dClipPrimitive) && defined(dClipVariant_pixel) && dClipObjectCount != 0
  93. #include clip_pixel
  94. #endif
  95. #include assign_material_color
  96. #if defined(dRenderVariant_pick)
  97. #include check_picking_alpha
  98. #ifdef requiredDrawBuffers
  99. gl_FragColor = vObject;
  100. gl_FragData[1] = vInstance;
  101. gl_FragData[2] = vGroup;
  102. gl_FragData[3] = packDepthToRGBA(fragmentDepth);
  103. #else
  104. gl_FragColor = vColor;
  105. #endif
  106. #elif defined(dRenderVariant_depth)
  107. gl_FragColor = material;
  108. #elif defined(dRenderVariant_marking)
  109. gl_FragColor = material;
  110. #elif defined(dRenderVariant_color)
  111. vec3 normal = -cameraNormal;
  112. #include apply_light_color
  113. if (uRenderMask == MaskTransparent && uAlphaThickness > 0.0) {
  114. gl_FragColor.a *= min(1.0, vRadius / uAlphaThickness);
  115. }
  116. #include apply_interior_color
  117. #include apply_marker_color
  118. #include apply_fog
  119. #include wboit_write
  120. #include dpoit_write
  121. #endif
  122. }
  123. `;