PolylineShadowVolumeFS.js 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //This file is automatically rebuilt by the Cesium build process.
  2. export default "in vec4 v_startPlaneNormalEcAndHalfWidth;\n\
  3. in vec4 v_endPlaneNormalEcAndBatchId;\n\
  4. in vec4 v_rightPlaneEC; // Technically can compute distance for this here\n\
  5. in vec4 v_endEcAndStartEcX;\n\
  6. in vec4 v_texcoordNormalizationAndStartEcYZ;\n\
  7. \n\
  8. #ifdef PER_INSTANCE_COLOR\n\
  9. in vec4 v_color;\n\
  10. #endif\n\
  11. \n\
  12. void main(void)\n\
  13. {\n\
  14. float logDepthOrDepth = czm_branchFreeTernary(czm_sceneMode == czm_sceneMode2D, gl_FragCoord.z, czm_unpackDepth(texture(czm_globeDepthTexture, gl_FragCoord.xy / czm_viewport.zw)));\n\
  15. vec3 ecStart = vec3(v_endEcAndStartEcX.w, v_texcoordNormalizationAndStartEcYZ.zw);\n\
  16. \n\
  17. // Discard for sky\n\
  18. if (logDepthOrDepth == 0.0) {\n\
  19. #ifdef DEBUG_SHOW_VOLUME\n\
  20. out_FragColor = vec4(1.0, 0.0, 0.0, 0.5);\n\
  21. return;\n\
  22. #else // DEBUG_SHOW_VOLUME\n\
  23. discard;\n\
  24. #endif // DEBUG_SHOW_VOLUME\n\
  25. }\n\
  26. \n\
  27. vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, logDepthOrDepth);\n\
  28. eyeCoordinate /= eyeCoordinate.w;\n\
  29. \n\
  30. float halfMaxWidth = v_startPlaneNormalEcAndHalfWidth.w * czm_metersPerPixel(eyeCoordinate);\n\
  31. // Check distance of the eye coordinate against the right-facing plane\n\
  32. float widthwiseDistance = czm_planeDistance(v_rightPlaneEC, eyeCoordinate.xyz);\n\
  33. \n\
  34. // Check eye coordinate against the mitering planes\n\
  35. float distanceFromStart = czm_planeDistance(v_startPlaneNormalEcAndHalfWidth.xyz, -dot(ecStart, v_startPlaneNormalEcAndHalfWidth.xyz), eyeCoordinate.xyz);\n\
  36. float distanceFromEnd = czm_planeDistance(v_endPlaneNormalEcAndBatchId.xyz, -dot(v_endEcAndStartEcX.xyz, v_endPlaneNormalEcAndBatchId.xyz), eyeCoordinate.xyz);\n\
  37. \n\
  38. if (abs(widthwiseDistance) > halfMaxWidth || distanceFromStart < 0.0 || distanceFromEnd < 0.0) {\n\
  39. #ifdef DEBUG_SHOW_VOLUME\n\
  40. out_FragColor = vec4(1.0, 0.0, 0.0, 0.5);\n\
  41. return;\n\
  42. #else // DEBUG_SHOW_VOLUME\n\
  43. discard;\n\
  44. #endif // DEBUG_SHOW_VOLUME\n\
  45. }\n\
  46. \n\
  47. // Check distance of the eye coordinate against start and end planes with normals in the right plane.\n\
  48. // For computing unskewed lengthwise texture coordinate.\n\
  49. // Can also be used for clipping extremely pointy miters, but in practice unnecessary because of miter breaking.\n\
  50. \n\
  51. // aligned plane: cross the right plane normal with miter plane normal, then cross the result with right again to point it more \"forward\"\n\
  52. vec3 alignedPlaneNormal;\n\
  53. \n\
  54. // start aligned plane\n\
  55. alignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_startPlaneNormalEcAndHalfWidth.xyz);\n\
  56. alignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz));\n\
  57. distanceFromStart = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, ecStart), eyeCoordinate.xyz);\n\
  58. \n\
  59. // end aligned plane\n\
  60. alignedPlaneNormal = cross(v_rightPlaneEC.xyz, v_endPlaneNormalEcAndBatchId.xyz);\n\
  61. alignedPlaneNormal = normalize(cross(alignedPlaneNormal, v_rightPlaneEC.xyz));\n\
  62. distanceFromEnd = czm_planeDistance(alignedPlaneNormal, -dot(alignedPlaneNormal, v_endEcAndStartEcX.xyz), eyeCoordinate.xyz);\n\
  63. \n\
  64. #ifdef PER_INSTANCE_COLOR\n\
  65. out_FragColor = czm_gammaCorrect(v_color);\n\
  66. #else // PER_INSTANCE_COLOR\n\
  67. // Clamp - distance to aligned planes may be negative due to mitering,\n\
  68. // so fragment texture coordinate might be out-of-bounds.\n\
  69. float s = clamp(distanceFromStart / (distanceFromStart + distanceFromEnd), 0.0, 1.0);\n\
  70. s = (s * v_texcoordNormalizationAndStartEcYZ.x) + v_texcoordNormalizationAndStartEcYZ.y;\n\
  71. float t = (widthwiseDistance + halfMaxWidth) / (2.0 * halfMaxWidth);\n\
  72. \n\
  73. czm_materialInput materialInput;\n\
  74. \n\
  75. materialInput.s = s;\n\
  76. materialInput.st = vec2(s, t);\n\
  77. materialInput.str = vec3(s, t, 0.0);\n\
  78. \n\
  79. czm_material material = czm_getMaterial(materialInput);\n\
  80. out_FragColor = vec4(material.diffuse + material.emission, material.alpha);\n\
  81. #endif // PER_INSTANCE_COLOR\n\
  82. \n\
  83. // Premultiply alpha. Required for classification primitives on translucent globe.\n\
  84. out_FragColor.rgb *= out_FragColor.a;\n\
  85. \n\
  86. czm_writeDepthClamp();\n\
  87. }\n\
  88. ";