Cesium3DTileset白膜打光

2024-04-06  本文已影响0人  zhuyx0304
var viewer = new Cesium.Viewer("cesiumContainer");

      var tileset = viewer.scene.primitives.add(
        new Cesium.Cesium3DTileset({
          url: "http://10.1.3.220:9003/model/tzoYurSE8/tileset.json",
        })
      );
      // 设置白膜的默认透明度
      tileset.readyPromise.then((tileset) => {
        tileset.style = new Cesium.Cesium3DTileStyle({
          color: {
            conditions: [["true", "rgba(0, 127.5, 255 ,0.2)"]],
          },
        });
      });
      tileset.tileVisible.addEventListener((cesium3DTile) => {
        // 以下设置白膜的打光效果
        var cesium3DTileCon = cesium3DTile.content;
        var featuresLength = cesium3DTileCon.featuresLength;
        for (let i = 0; i < featuresLength; i += 2) {
          var _model = cesium3DTileCon.getFeature(i).content._model;
          if (_model && _model._sourcePrograms && _model._rendererResources) {
            Object.getOwnPropertyNames(_model._sourcePrograms).forEach(
              function (i) {
                var msp = _model._sourcePrograms[i];
                _model._rendererResources.sourceShaders[msp.fragmentShader] = `
                varying vec3 v_positionEC;
                void main(void){
                  vec4 position = czm_inverseModelView * vec4(v_positionEC,1); // 位置
                  float glowRange = 100.0; // 光环的移动范围(高度)
                  gl_FragColor = vec4(0.2,  0.5, 1.0, 1.0); // 颜色
                  gl_FragColor *= vec4(vec3(position.z / 100.0), 1.0); // 渐变
                  // 动态光环
                  float time = fract(czm_frameNumber / 360.0);
                  time = abs(time - 0.5) * 2.0;
                  float diff = step(0.005, abs( clamp(position.z / glowRange, 0.0, 1.0) - time));
                  gl_FragColor.rgb += gl_FragColor.rgb * (1.0 - diff);
                }
                `;
              }
            );
            _model._shouldRegenerateShaders = true;
          }
        }
      });
      viewer.flyTo(tileset);
上一篇 下一篇

猜你喜欢

热点阅读