mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 09:14:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			153 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/***
 | 
						||
 * @class DEUGlobe.Scene.sceneEffects.weatherEffects
 | 
						||
 * @category  场景
 | 
						||
 * @classdesc 场景特效-天气特效
 | 
						||
 * @param {Object} viewer -  Cesium.viewer。
 | 
						||
 * @param {Object} options - 参数。
 | 
						||
 * @param {String} options.name - 天气特效名称。
 | 
						||
 * @param {String} options.type - 天气特效类型. (snow:雪 , rain:雨,fog:雾)。
 | 
						||
*/
 | 
						||
 class weatherEffects{
 | 
						||
    constructor(viewer,options){
 | 
						||
      this.viewer = viewer;
 | 
						||
      var opt = options || {};
 | 
						||
      this.name = opt.name;
 | 
						||
      this.type = opt.type;
 | 
						||
      let stage = this.getStage(), 
 | 
						||
      fs = null;
 | 
						||
      if(stage == null){
 | 
						||
          switch(this.type){
 | 
						||
            case "snow":
 | 
						||
              fs = this.fs_snow();
 | 
						||
            break;
 | 
						||
            case "rain":
 | 
						||
              fs = this.fs_rain();
 | 
						||
            break;
 | 
						||
            case "fog":
 | 
						||
                fs = this.fs_fog();
 | 
						||
            break;
 | 
						||
          }
 | 
						||
      }
 | 
						||
      stage = new Cesium.PostProcessStage({
 | 
						||
            name : this.name,
 | 
						||
            fragmentShader:fs,
 | 
						||
            uniforms : {
 | 
						||
              color: Cesium.Color.fromAlpha(Cesium.Color.BLACK, parseFloat(1)),
 | 
						||
            }
 | 
						||
      });
 | 
						||
      viewer.scene.postProcessStages.add(stage);
 | 
						||
    }
 | 
						||
    removePostProcessStage(){
 | 
						||
     let stage =  this.getStage();
 | 
						||
      if(stage){
 | 
						||
        this.viewer.scene.postProcessStages.remove(stage);
 | 
						||
      }
 | 
						||
    }
 | 
						||
    getStage(){
 | 
						||
      let stage = null,
 | 
						||
          stages =  this.viewer.scene.postProcessStages;
 | 
						||
      for(let i = 0;i<stages._stages.length;i++){
 | 
						||
        let tmp = stages.get(i);
 | 
						||
        if(tmp != undefined && tmp.name == this.name){
 | 
						||
          stage = tmp;
 | 
						||
          break;
 | 
						||
        }
 | 
						||
      }
 | 
						||
      return stage;
 | 
						||
    }
 | 
						||
    fs_snow(){
 | 
						||
      return  `
 | 
						||
    #version 300 es
 | 
						||
    precision highp float;
 | 
						||
 | 
						||
    uniform sampler2D colorTexture;
 | 
						||
    in vec2 v_textureCoordinates;
 | 
						||
    out vec4 fragColor;
 | 
						||
 | 
						||
    float snow(vec2 uv, float scale) {
 | 
						||
      float time = float(czm_frameNumber) / 60.0;
 | 
						||
      float w = smoothstep(1.0, 0.0, -uv.y * (scale / 10.0));
 | 
						||
      if (w < 0.1) return 0.0;
 | 
						||
      uv += time / scale;
 | 
						||
      uv.y += time * 2.0 / scale;
 | 
						||
      uv.x += sin(uv.y + time * 0.5) / scale;
 | 
						||
      uv *= scale;
 | 
						||
      vec2 s = floor(uv), f = fract(uv), p;
 | 
						||
      float k = 3.0, d;
 | 
						||
      p = 0.5 + 0.35 * sin(11.0 * fract(sin((s + p + scale) * mat2(7, 3, 6, 5)) * 5.0)) - f;
 | 
						||
      d = length(p);
 | 
						||
      k = min(d, k);
 | 
						||
      k = smoothstep(0.0, k, sin(f.x + f.y) * 0.01);
 | 
						||
      return k * w;
 | 
						||
    }
 | 
						||
 | 
						||
    void main() {
 | 
						||
      vec2 resolution = czm_viewport.zw;
 | 
						||
      vec2 uv = (gl_FragCoord.xy * 2.0 - resolution.xy) / min(resolution.x, resolution.y);
 | 
						||
      vec3 finalColor = vec3(0.0);
 | 
						||
      float c = 0.0;
 | 
						||
      c += snow(uv, 30.0) * 0.0;
 | 
						||
      c += snow(uv, 20.0) * 0.0;
 | 
						||
      c += snow(uv, 15.0) * 0.0;
 | 
						||
      c += snow(uv, 10.0);
 | 
						||
      c += snow(uv, 8.0);
 | 
						||
      c += snow(uv, 6.0);
 | 
						||
      c += snow(uv, 5.0);
 | 
						||
      finalColor = vec3(c);
 | 
						||
 | 
						||
      // 调整亮度
 | 
						||
      finalColor = finalColor * 1.2; // 提升亮度,可以根据需要调整这个值
 | 
						||
 | 
						||
      fragColor = mix(texture(colorTexture, v_textureCoordinates), vec4(finalColor, 1.0), 0.2);
 | 
						||
    }
 | 
						||
  `;
 | 
						||
    }
 | 
						||
    fs_rain(){
 | 
						||
      return   `
 | 
						||
      #version 300 es
 | 
						||
  
 | 
						||
      precision highp float;
 | 
						||
  
 | 
						||
      uniform sampler2D colorTexture;
 | 
						||
      in vec2 v_textureCoordinates;
 | 
						||
      out vec4 fragColor;
 | 
						||
  
 | 
						||
      float hash(float x){
 | 
						||
          return fract(sin(x * 133.3) * 13.13);
 | 
						||
      }
 | 
						||
  
 | 
						||
      void main() {
 | 
						||
          float time = czm_frameNumber / 60.0;
 | 
						||
          vec2 resolution = czm_viewport.zw;
 | 
						||
          vec2 uv = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
 | 
						||
          vec3 c = vec3(0.6, 0.7, 0.8);
 | 
						||
          float a = -0.4;
 | 
						||
          float si = sin(a), co = cos(a);
 | 
						||
          uv *= mat2(co, -si, si, co);
 | 
						||
          uv *= length(uv + vec2(0.0, 4.9)) * 0.3 + 1.0;
 | 
						||
          float v = 1.0 - sin(hash(floor(uv.x * 100.0)) * 2.0);
 | 
						||
          float b = clamp(abs(sin(20.0 * time * v + uv.y * (5.0 / (2.0 + v)))) - 0.95, 0.0, 1.0) * 20.0;
 | 
						||
          c *= v * b;
 | 
						||
  
 | 
						||
          fragColor = mix(texture(colorTexture, v_textureCoordinates), vec4(c, 1.0), 0.5);
 | 
						||
      }
 | 
						||
  `
 | 
						||
    }
 | 
						||
    fs_fog(){
 | 
						||
      return 'uniform sampler2D colorTexture;\n'
 | 
						||
          +'  uniform sampler2D depthTexture;\n' 
 | 
						||
          +'  in vec2 v_textureCoordinates;\n'
 | 
						||
          +'  out vec4 fragColor;\n'
 | 
						||
          +'  void main(void)\n'
 | 
						||
          +'  {\n'
 | 
						||
          +'      vec4 origcolor=texture(colorTexture, v_textureCoordinates);\n'
 | 
						||
          +'      vec4 fogcolor=vec4(0.8,0.8,0.8,0.5);\n'
 | 
						||
          +'      float depth = czm_readDepth(depthTexture, v_textureCoordinates);\n'
 | 
						||
          +'      vec4 depthcolor=texture(depthTexture, v_textureCoordinates);\n'
 | 
						||
          +'      float f=(depthcolor.r-0.22)/0.2;\n'
 | 
						||
          +'      if(f<0.0) f=0.0;\n'
 | 
						||
          +'      else if(f>1.0) f=1.0;\n'
 | 
						||
          +'      fragColor = mix(origcolor,fogcolor,0.8);\n'
 | 
						||
          +'   }';
 | 
						||
    }
 | 
						||
} |