mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 01:04: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'
							 | 
						|||
| 
								 | 
							
								          +'   }';
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |