当前位置: 首页 > article >正文

Three.js 闪电效果

请添加图片描述

闪电shader

const shader = new THREE.ShaderMaterial({
      uniforms: {
          iTime: this.iTime,
          color: { value: new THREE.Color("#D2F8FE") },
      },
      vertexShader: /* glsl */ `
          varying vec2 vUv;
          varying float normalizeY;

          void main() {

              // vUv = (uv * 2. - 2.) * vec2(0.3,2.);
              vUv = (uv * 2. - 1.) * vec2(1.,1.);
              normalizeY = uv.y;

              vec3 transformed = position ;

              gl_Position = projectionMatrix * modelViewMatrix * vec4(transformed, 1.0);
          }
      `,
      fragmentShader: /* glsl */ `
          varying vec2 vUv;
          uniform float iTime;
          uniform vec3 color;
          varying float normalizeY;

          // ${fbm}
          ${perlinFbm}
          
          void main() {

              vec3 finalColor = vec3( 0.0 );

              for( int i=1; i < 4; ++i ){
                  float t = abs( 1.0 / ( ( vUv.x + fbm2( vUv + iTime / float( i ) ,5) ) * 75. ) );
                  // float t = abs( 1.0 / ( ( vUv.x + fbm( vUv + iTime / float( i ) ) ) * 75. ) );

                  finalColor += t * vec3( float( i ) * 0.1 + 0.1, 0.5, 2.0 );
              }
              
              finalColor = pow( finalColor, vec3( 1.4 ) );

              vec3 color = vec3( finalColor ) * color;

              float fade = smoothstep( 0.0, 0.2, ( 1.0 - normalizeY ) * 1. );

              float timeLine = fract( iTime - 0.1 ) * 2. ;

              float process = 1.0 - min( timeLine * 3. , 1.);
              
              float a = step( process , normalizeY ) * fade;
              // float a = step( process , normalizeY ) ;
              
              if( timeLine > 1.3){
                  a = step( normalizeY , 1.0 - min( (timeLine / 2. - 0.65) * 4. , 1.) );
              }

              gl_FragColor = vec4( color, finalColor.r * a );
              // gl_FragColor = vec4(vec3(fade), 1.);
              // gl_FragColor = vec4(vec3(color), 1);
              // if(finalColor.r * a < 0.1){
              //     discard;
              // }
          }
      `,
      transparent: true,
  });


const perlinFbm = `
	float hash21(vec2 x) {
	    return fract(cos(mod(dot(x, vec2(13.9898, 8.141)), 3.14)) * 43758.5453);
	}
	
	vec2 hash22(vec2 uv) {
	    uv = vec2(dot(uv, vec2(127.1,311.7)),
	              dot(uv, vec2(269.5,183.3)));
	    return 2.0 * fract(sin(uv) * 43758.5453123) - 1.0;
	}
	
	float perlinNoise(vec2 uv)
	{
	    vec2 iuv = floor(uv);
	    vec2 fuv = fract(uv);
	    vec2 blur = smoothstep(.0, 1., fuv);
	    vec2 bl = vec2(.0, .0);
	    vec2 br = vec2(1., .0);
	    vec2 tl = vec2(.0, 1.);
	    vec2 tr = vec2(1., 1.);
	    vec2 bln = hash22(iuv + bl);
	    vec2 brn = hash22(iuv + br);
	    vec2 tln = hash22(iuv + tl);
	    vec2 trn = hash22(iuv + tr);
	    float b  = mix(dot(bln, fuv - bl), dot(brn, fuv - br), blur.x);
	    float t  = mix(dot(tln, fuv - tl), dot(trn, fuv - tr), blur.x);
	    float c = mix(b, t, blur.y);
	       
	    return (c);
	}
	
	float fbm2(vec2 uv, int octaves)
	{
	    float value = .0;
	    float ampitude  = .5;
	    float freq = 2. ;
	    
	    for(int i = 0; i < octaves; i++)
	    {  
	      value += perlinNoise(uv) * ampitude;
	        uv *= freq;
	        ampitude *= .5;
	    }
	    return value;
	}
`;

http://www.kler.cn/a/405237.html

相关文章:

  • STM32芯片EXIT外部中断的配置与原理以及模板代码(标准库)
  • 51c嵌入式~IO合集2
  • shell--第一次作业
  • 标准驱动开发(Linux2.6(cdev) 的开发)
  • (C语言)文件操作
  • java: spire.pdf.free 9.12.3 create pdf
  • 【2024最新】基于springboot+vue的疫情网课管理系统lw+ppt
  • js批量输入地址获取经纬度
  • 04 —— Webpack打包CSS代码
  • Vue项目开发 formatData 函数有哪些常用的场景?
  • 当你项目服务器磁盘报警
  • 如何利用Python爬虫精准获得1688店铺详情
  • Android 文件分段上传和下载方案
  • 兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
  • Java Servlet详解:Servlet的生命周期、请求处理与响应发送
  • css使用弹性盒,让每个子元素平均等分父元素的4/1大小
  • AI大模型系列之一:大模型原理科普(深度好文)
  • 「San」监听DOM变化的方法
  • 基于SpringBoot和uniapp开发的医护上门系统上门护理小程序
  • linux增量更新
  • 第2章-PostgreSQL 15安装及登录
  • 遗传算法与深度学习实战(22)——使用Numpy构建神经网络
  • 【人工智能】深入理解PyTorch:从0开始完整教程!全文注解
  • 获国家权威机构认可 亚信安全荣获CNVD技术组支撑单位认证
  • OceanBase Shell开放内核运维接口,运维更便捷
  • 光伏电站项目-视频监控、微气象及安全警卫系统