import { nextTick, onMounted, ref } from 'vue'
import * as Cesium from 'cesium'
import gsap from 'gsap'
onMounted ( ( ) => { ... } )
let rectGeometry = new Cesium. RectangleGeometry ( {
rectangle : Cesium. Rectangle. fromDegrees (
115 ,
20 ,
135 ,
30
) ,
height : 0 ,
` vertexFormat:顶点格式,这里使用 ` PerInstanceColorAppearance` 的顶点格式,允许每个实例有独立的颜色 `
` 如果使用【Cesium.Material.fromType】这里的【vertexFormat】就必须用这个EllipsoidSurfaceAppearance `
vertexFormat : Cesium. EllipsoidSurfaceAppearance. VERTEX_FORMAT
} )
let instance = new Cesium. GeometryInstance ( {
id : 'redRect' ,
geometry : rectGeometry,
attributes : {
color : Cesium. ColorGeometryInstanceAttribute. fromColor ( Cesium. Color. RED . withAlpha ( 0.5 ) )
}
} )
let rectGeometry_1 = new Cesium. RectangleGeometry ( {
rectangle : Cesium. Rectangle. fromDegrees (
140 ,
20 ,
160 ,
30
) ,
height : 0
} )
let instance_1 = new Cesium. GeometryInstance ( {
id : 'blueRect' ,
geometry : rectGeometry_1,
attributes : {
color : Cesium. ColorGeometryInstanceAttribute. fromColor ( Cesium. Color. BLUE . withAlpha ( 0.5 ) )
} ,
vertexFormat : Cesium. EllipsoidSurfaceAppearance. VERTEX_FORMAT
} )
let material_1 = new Cesium. Material ( {
fabric : {
type : 'Color' ,
uniforms : {
color : new Cesium. Color ( 1.0 , 0.0 , 0.0 , 0.5 )
}
}
} )
let material_1 = new Cesium. Material ( {
fabric : {
type : 'Image' ,
uniforms : {
image : '../public/texture/logo.png'
}
}
} )
console. log ( 'material_1=' , material_1)
console. log ( 'material_1=' , material_1. shaderSource)
` 【编写着色器材质】 `
let material_1 = new Cesium. Material ( {
` 【 ` fabric` 属性,是Cesium材质的核心,它允许你使用GLSL(OpenGL Shading Language)代码来自定义材质的行为】 `
fabric : {
uniforms : {
uTime : 0
} ,
source : `
// czm_getMaterial(), 是GLSL函数的开始, 是Cesium材质系统的核心
czm_material czm_getMaterial(czm_materialInput materialInput){
// 调用 czm_getDefaultMaterial 函数, 初始化为Cesium的默认材质, 这允许你在默认材质的基础上进行修改
czm_material material = czm_getDefaultMaterial(materialInput); // 官方默认
// ----------- 自定义内容-start -----------
// 效果一
// 将材质的, 漫反射颜色, 设置为红色(RGB: 1.0, 0.0, 0.0), 这意味着对象将显示为红色
// material.diffuse = vec3(1.0, 0.0, 0.0);
// 效果二: materialInput.st ,是一个包含纹理坐标的二维向量
// material.diffuse = vec3(materialInput.st, 0.0);
// 效果三
material.diffuse = vec3(materialInput.st+uTime, 0.0);
// 效果四:条纹效果
// float strength = mod((materialInput.st.s+uTime) * 10.0, 1.0); // 加减的作用:调整方向
// float strength = mod((materialInput.st.s-uTime)*10.0, 1.0);
// float strength = mod((materialInput.st.t-uTime)*10.0, 1.0);
// material.diffuse = vec3(strength, 0.0, 0.0);
// 效果五
float strength = mod((materialInput.st.x-uTime) * 10.0, 1.0);
material.diffuse = vec3(strength, 0.0, 0.0);
// ----------- 自定义内容-end -----------
return material; // 官方默认
}
`
}
} )
gsap. to ( material_1. uniforms, {
uTime : 1 ,
duration : 2 ,
repeat : - 1 ,
ease : 'linear'
} )
`
` EllipsoidSurfaceAppearance` :设置,几何体都是与地球的椭球体平行,
假定,几何体 与 地球的椭球体 平行,
就可以,在计算大量顶点属性的时候节省内存。 `
let appearance = new Cesium. EllipsoidSurfaceAppearance ( {
fragmentShaderSource : `
varying vec3 v_positionMC; // 模型坐标下的位置
varying vec3 v_positionEC; // 眼坐标(或地球中心坐标)下的位置
varying vec2 v_st; // 纹理坐标
uniform float uTime;
void main(){
czm_materialInput materialInput;
gl_FragColor = vec4(v_st, uTime, 1.0);
}
`
} )
appearance. uniforms = {
uTime : 0
}
gsap. to ( appearance. uniforms, {
uTime : 1 ,
duration : 2 ,
repeat : - 1 ,
yoyo : true ,
ease : 'linear'
} )
console. log ( 'appearance=' , appearance)
console. log ( 'appearance.vertexShaderSource=' , appearance. vertexShaderSource)
console. log ( 'appearance.fragmentShaderSource=' , appearance. fragmentShaderSource)
let primitive = new Cesium. Primitive ( {
geometryInstances : [ instance, instance_1] ,
appearance : appearance,
show : true
} )
nextTick ( ( ) => {
setView ( )
viewer. value. scene. primitives. add ( primitive)
} )