|                                                                                                                          | 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | <!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <title>dc-example</title>
  <script src='/libs/dc-sdk/dc.min.js'></script>
  <script src="../dat.gui.min.js"></script>
  <link href='/libs/dc-sdk/dc.min.css' type='text/css' rel='stylesheet'>
  <link href='../index.css' type='text/css' rel='stylesheet'>
</head>
<body>
<div id="viewer-container" class="viewer-container" style=""></div>
<script>
  let viewer = undefined
  let effect = undefined
  function initViewer() {
    viewer = new DC.Viewer('viewer-container',{
      orderIndependentTranslucency:false,
      contextOptions:{
        webgl:{
          alpha:true
        }
       }
    }).setOptions({
      showMoon: false,
      showSun: false,
      skyBox: {
        show:false
      },
      showAtmosphere:false,
      globe: {
        showGroundAtmosphere:false,
        depthTestAgainstTerrain: true // 当前示例中的Shader渲染需要开启深度检测,并在无地形时效果好些。
      }
    })
    let baseLayer = DC.ImageryLayerFactory.createImageryLayer(DC.ImageryType.AMAP,{
      style:'img',
      crs:'WGS84'
    })
    viewer.addBaseLayer(baseLayer)
    let Cesium = DC.getLib('Cesium')
    const fs =`
    uniform sampler2D colorTexture;
    uniform sampler2D depthTexture;
    uniform vec3 centerWC;
    uniform vec3 normalWC;
    uniform float radius;
    in vec2 v_textureCoordinates;
    float getDepth(){
      float z_window = czm_unpackDepth(texture(depthTexture, v_textureCoordinates));
      z_window = czm_reverseLogDepth(z_window);
      float n_range = czm_depthRange.near;
      float f_range = czm_depthRange.far;
      return  (2.0 * z_window - n_range - f_range) / (f_range - n_range);
    }
   vec4 toEye(in vec2 uv, in float depth){
      vec2 xy = vec2((uv.x * 2.0 - 1.0),(uv.y * 2.0 - 1.0));
      vec4 posInCamera =czm_inverseProjection * vec4(xy, depth, 1.0);
      posInCamera = posInCamera / posInCamera.w;
      return posInCamera;
   }
  vec3 pointProjectOnPlane(in vec3 planeNormal, in vec3 planeOrigin, in vec3 point){
    vec3 v01 = point - planeOrigin;
    float d = dot(planeNormal, v01) ;
    return (point - planeNormal * d);
  }
    void main() {
      float depth = getDepth();
      vec4 color = texture(colorTexture, v_textureCoordinates);
      vec4 viewPos = toEye(v_textureCoordinates, depth);
      vec4 center = czm_view * vec4(centerWC,1);
      vec4 planeNormal = czm_view * vec4(normalWC,0);
      vec3 prjOnPlane = pointProjectOnPlane(planeNormal.xyz, center.xyz, viewPos.xyz);
      float dis = length(prjOnPlane.xyz - center.xyz);
      if(color.rgb !=vec3(0.0) && dis <= radius && depth < 1.0){
        out_FragColor = vec4(color.rgb, 1.0);
      }
    }`;
    let center = Cesium.Cartesian3.fromDegrees(120,31)
    let up = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(
      center,
      new Cesium.Cartesian3()
    )
    viewer.scene.postProcessStages.add(new Cesium.PostProcessStage({
      fragmentShader : fs,
      uniforms : {
        centerWC: function () {
          return center
        },
        normalWC:function () {
          return up
        },
        radius : function () {
          return 10000
        },
      }
    }));
    addGuiController() // add controller
  }
  function addGuiController(){
  }
  DC.ready({
    baseUrl:'../libs/dc-sdk/resources/'
  }).then(initViewer)
</script>
</body>
</html>
 |