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

primitive 的 Appearance编写着色器材质

在这里插入图片描述

import { nextTick, onMounted, ref } from 'vue'
import * as Cesium from 'cesium'
import gsap from 'gsap'

onMounted(() => { ... })

// 1、创建矩形几何体,`Cesium.RectangleGeometry`:几何体,`Rectangle`:矩形
let rectGeometry = new Cesium.RectangleGeometry({
	rectangle: Cesium.Rectangle.fromDegrees(
		115, // 西边的经度
		20, // 南边维度
		135, // 东边经度
		30 // 北边维度
	),
	height: 0, // 矩形的高度:0,意味着,它紧贴地球表面
	
	`vertexFormat:顶点格式,这里使用`PerInstanceColorAppearance`的顶点格式,允许每个实例有独立的颜色`
	// vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT
	
	`如果使用【Cesium.Material.fromType】这里的【vertexFormat】就必须用这个EllipsoidSurfaceAppearance`
	vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT
})

// 2、创建几何体实例,`Cesium.GeometryInstance`:几何体实例
let instance = new Cesium.GeometryInstance({
	id: 'redRect',
	geometry: rectGeometry, // 将,矩形几何体`rectGeometry`,赋给实例
	// 定义实例的属性
	attributes: {
		// 设置颜色为红色,透明度为0.5
		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 // 矩形的高度: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
})


// 3、设置外观
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:GLSL源代码
			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'
})




// ---------------------------- start 着色器 编写 appearance ----------------------------
`
	`EllipsoidSurfaceAppearance`:设置,几何体都是与地球的椭球体平行,
		假定,几何体 与 地球的椭球体 平行,
		就可以,在计算大量顶点属性的时候节省内存。`
let appearance = new Cesium.EllipsoidSurfaceAppearance({
	// material: material_1,
	// aboveGround: true, // true:几何体将渲染在地面之上;false:几何体可能部分或全部嵌入地面以下
	// translucent: true
	
	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)

// ---------------------------- end 着色器 编写 appearance ----------------------------



// 4、创建图元:`Cesium.Primitive`:创建一个图元,它是Cesium中用于渲染的最基本单位 `
let primitive = new Cesium.Primitive({
	geometryInstances: [instance, instance_1], // 将之前创建的几何体实例赋给图元
	appearance: appearance, // 将之前创建的外观赋给图元
	show: true
})




nextTick(() => {
	setView()
		
	// 5、添加到Viewer
	viewer.value.scene.primitives.add(primitive)
})




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

相关文章:

  • 快速排序介绍
  • 51单片机 和 STM32 的烧录方式和通信协议的区别
  • Pandas常用数据类型
  • 分布式ID—雪花算法
  • 快速、可靠且高性价比的定制IP模式提升芯片设计公司竞争力
  • js前序遍历等
  • IMX6U Qt 开发环境
  • C++实现设计模式---原型模式 (Prototype)
  • C# XPTable 日期字段处理(XPTable控件使用说明十三)
  • 日常工作之 Elasticsearch 常用查询语句汇总
  • 想法分享,利用html通过求输入框中用户输入数组的最大值
  • linux自动分区后devmappercentos-home删除后合并到其它分区上
  • 【微服务】面试 4、限流
  • 目标检测跟踪中的Siamese孪生网络与普通卷积网络(VGG、ResNet)有什么区别?
  • 如何将原来使用cmakelist编译的qt工程转换为可使用Visual Studio编译的项目
  • LCUS型 USB继电器模块 电脑串口控制开关 PC智能控制器在pc端使用Qt程序进行串口控制
  • vector的模拟实现(C++)
  • 软考信安18~网络安全测评技术与标准
  • Axure9笔记
  • 【CTFHub】REC-命令注入
  • 代码随想录Day34 | 62.不同路径,63.不同路径II,343.整数拆分,96.不同的二叉搜索树
  • 算法-查找数组对角线上最大的质数
  • 【IDEA 2024】学习笔记--文件选项卡
  • 我的年度总结
  • 高级运维:shell练习2
  • 【后端面试总结】tls中.crt和.key的关系