Cesium智慧城市效果(3)道路流光

效果

请添加图片描述
请添加图片描述

代码

Shader的实现

注:因为找个类是继承自PolylineMaterialAppearance ,所以和PolylineMaterialAppearance 一样只能用在PolylineGeometry的外观.
在这里插入图片描述

index.ts

import * as Cesium from "cesium"
import frag from "./frag.glsl?raw"

export default class FlowLightPolylineMaterialAppearance extends Cesium.PolylineMaterialAppearance {
  constructor(option: { lightColor?: Cesium.Color } = {}) {
    const { lightColor = new Cesium.Color(.5, 1, 1) } = option

    super({
      material: new Cesium.Material({
        fabric: {
          uniforms: {
            u_time: 0,
            light_color: lightColor
          }
        }
      }),
      fragmentShaderSource: frag
    })

    const task = (t) => {
      this.material.uniforms.u_time = t * .001
      requestAnimationFrame(task)
    }
    requestAnimationFrame(task)
  }
}

frag.glsl

 #ifdef VECTOR_TILE
uniform vec4 u_highlightColor;
      #endif

in vec2 v_st;

void main() {
  czm_materialInput materialInput;

  vec2 st = v_st;
  st.t = czm_readNonPerspective(st.t, gl_FragCoord.w);

  materialInput.s = st.s;
  materialInput.st = st;
  materialInput.str = vec3(st, 0.0);
  czm_material material = czm_getMaterial(materialInput);
  vec3 color = light_color_1.rgb;
  float start = 0.;
  float end = .5;
  float t = fract(u_time_0 * .4) * (1. + end) - end;
  start += t;
  end += t;
  if(st.x > start && st.x < end) {
    float d = 1. - (st.x - start) / (end - start);
    color = mix(color, color * .6, d * d);
  } else {
    color = color * .6;
  }
  material.emission = color;
  out_FragColor = vec4(material.diffuse + material.emission, light_color_1.a);
      #ifdef VECTOR_TILE
  out_FragColor *= u_highlightColor;
      #endif

  czm_writeLogDepth();
}

使用到Primitive

  const primitive = new Cesium.Primitive({
    appearance: new FlowLightPolylineMaterialAppearance({ lightColor: new Cesium.Color(.5, 1, 1) }),
	// other code....
  })

开启场景的Bloom

viewer.scene.postProcessStages.bloom.enabled = true
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值