定义自定义材质
import * as Cesium from "cesium";
const DiffuseCircleShaderSource = `
uniform vec4 color;
uniform float speed;
uniform float count;
uniform float gradient;
czm_material czm_getMaterial(czm_materialInput materialInput)
{
czm_material material = czm_getDefaultMaterial(materialInput);
material.diffuse = 1.5 * color.rgb;
vec2 st = materialInput.st;
float dis = distance(st, vec2(0.5, 0.5));
float per = fract(czm_frameNumber * speed / 1000.0);
if(count == 1.0){
if(dis > per * 0.5){
discard;
} else {
material.alpha = color.a * dis / per / 2.0;
}
} else {
vec3 str = materialInput.str;
if(abs(str.z) > 0.001){
discard;
}
if(dis > 0.5){
discard;
} else {
float perDis = 0.5 / count;
float disNum;
float bl = 0.0;
for(int i = 0; i <= 999; i++){
if(float(i) <= count){
disNum = perDis * float(i) - dis + per / count;
if(disNum > 0.0){
if(disNum < perDis){
bl = 1.0 - disNum / perDis;
} else if(disNum - perDis < perDis){
bl = 1.0 - abs(1.0 - disNum / perDis);
}
material.alpha = pow(bl, (1.0 + 10.0 * (1.0 - gradient)));
}
}
}
}
}
return material;
}
`;
type DiffuseCircleOptions = {
color: Cesium.Color;
speed: number;
circleCount: number;
gradient: number;
};
export class DiffuseCircleMaterial extends Cesium.Material {
constructor(options: DiffuseCircleOptions) {
const { color, speed, circleCount, gradient } = options;
super({
translucent: false,
fabric: {
type: "DiffuseCircle",
uniforms: {
color,
speed,
count: circleCount,
gradient,
},
source: DiffuseCircleShaderSource,
},
});
}
}
调用自定义材质
const circleGeometry = new Cesium.CircleGeometry({
center: Cesium.Cartesian3.fromDegrees(125.310767, 43.820491, 1000000),
radius: 10000,
});
const circleInstance = new Cesium.GeometryInstance({
geometry: circleGeometry,
});
const appearance = new Cesium.EllipsoidSurfaceAppearance({
material: new DiffuseCircleMaterial({
color: new Cesium.Color(1.0, 0.0, 0.0, 1.0),
speed: 5.0,
circleCount: 5,
gradient: 0.4,
}),
});
const circlePrimitive = new Cesium.Primitive({
geometryInstances: circleInstance,
appearance: appearance,
});
viewer.scene.primitives.add(circlePrimitive);