Cesium圆锥渐变色实现:融合顶点着色器、Canvas动态贴图与静态纹理的多方案整合

     在Cesium中渲染圆锥体时,无论采用顶点着色器Canvas动态贴图还是静态图片贴图,其渐变色均需满足以下条件:

  1. 圆形结构:渐变范围限定在圆锥底面的圆形区域内。
  2. 径向扩散:颜色从圆心向外逐步变化(如红→黄→蓝)。
  3. 一致性:三种方案均基于“圆形中心→边缘”的渐变逻辑。

方案一:顶点着色器动态计算(实时性最高)

特点:通过GLSL代码直接计算圆心到边缘的距离,实现纯圆形渐变

// 创建圆锥几何体(底面为圆形)
const coneGeometry = Cesium.CylinderGeometry.createGeometry(new Cesium.CylinderGeometry({length: 200000,topRadius: 0,bottomRadius: 100000, // 底面半径vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,})
);// 自定义着色器:基于UV距离计算圆形渐变
const material = new Cesium.Material({fabric: {type: 'RadialGradientCone',source: `czm_material czm_getMaterial(czm_materialInput materialInput) {czm_material material = czm_getDefaultMaterial(materialInput);// 计算当前像素到圆心的距离(UV坐标系中)vec2 st = materialInput.st;vec2 center = vec2(0.5, 0.5); // 圆心位置float distance = length(st - center); // 径向距离// 归一化到 [0,1],确保渐变从中心向外扩展float normalizedDistance = clamp(distance / 0.5, 0.0, 1.0);// 圆形渐变逻辑(红→黄→蓝)if (normalizedDistance < 0.33) {material.diffuse = vec3(1.0, 0.0, 0.0); // 红色} else if (normalizedDistance < 0.66) {material.diffuse = vec3(1.0, 1.0, 0.0); // 黄色} else {material.diffuse = vec3(0.0, 0.0, 1.0); // 蓝色}// 透明度随距离增加而降低material.alpha = 1.0 - normalizedDistance * 0.5;return material;}`,uniforms: {},},
});// 应用到Primitive
const geometryInstance = new Cesium.GeometryInstance({ geometry: coneGeometry });
const primitive = new Cesium.Primitive({geometryInstances: geometryInstance,appearance: new Cesium.MaterialAppearance({material: material,closed: true,}),
});
viewer.scene.primitives.add(primitive);

关键点

  • length(st - center):确保渐变方向从圆心向外。
  • clamp(distance / 0.5, 0.0, 1.0):限制渐变范围在圆形区域内。
  • 实时性:适合动态属性(如风速、温度)驱动的渐变。

方案二:Canvas动态生成径向渐变贴图(灵活性高)

特点:通过Canvas绘制径向渐变圆形纹理,贴合圆锥底面。

// 1. 创建Canvas并绘制圆形径向渐变
const canvas = document.createElement('canvas');
canvas.width = 256;
canvas.height = 256;
const ctx = canvas.getContext('2d');// 定义径向渐变(圆心→边缘)
const gradient = ctx.createRadialGradient(128, 128, 0, 128, 128, 128);
gradient.addColorStop(0, 'red');
gradient.addColorStop(0.5, 'yellow');
gradient.addColorStop(1, 'blue');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, 256, 256);// 2. 将Canvas转换为ImageResource
const imageResource = new Cesium.ImageResource({source: canvas,
});// 3. 创建贴图材质(圆形渐变)
const imageMaterial = new Cesium.Material({fabric: {type: 'ImageRadialGradient',source: `czm_material czm_getMaterial(czm_materialInput materialInput) {czm_material material = czm_getDefaultMaterial(materialInput);vec2 st = materialInput.st;vec4 color = texture(imageMap, st);material.diffuse = color.rgb;material.alpha = color.a;return material;}`,uniforms: {imageMap: imageResource,},},
});// 应用到Primitive
const geometryInstance = new Cesium.GeometryInstance({ geometry: coneGeometry });
const primitive = new Cesium.Primitive({geometryInstances: geometryInstance,appearance: new Cesium.MaterialAppearance({material: imageMaterial,closed: true,}),
});
viewer.scene.primitives.add(primitive);

关键点

  • createRadialGradient:Canvas API原生支持径向渐变。
  • 贴图适配:需确保圆锥底面UV映射为正方形区域(避免拉伸)。
  • 灵活性:可动态调整Canvas渐变参数(如颜色分段)。

方案三:静态图片贴图(性能最优)

特点:预加载圆形渐变图片,适合固定渐变逻辑。

// 1. 准备静态圆形渐变图片(如 gradient.png)
const imageMaterial = new Cesium.Material({fabric: {type: 'StaticRadialGradient',source: `czm_material czm_getMaterial(czm_materialInput materialInput) {czm_material material = czm_getDefaultMaterial(materialInput);vec2 st = materialInput.st;vec4 color = texture(staticMap, st);material.diffuse = color.rgb;material.alpha = color.a;return material;}`,uniforms: {staticMap: 'path/to/gradient.png', // 需预先绘制圆形渐变},},
});// 应用到Primitive
const geometryInstance = new Cesium.GeometryInstance({ geometry: coneGeometry });
const primitive = new Cesium.Primitive({geometryInstances: geometryInstance,appearance: new Cesium.MaterialAppearance({material: imageMaterial,closed: true,}),
});
viewer.scene.primitives.add(primitive);

关键点

  • 图片设计:需手动绘制或生成圆形径向渐变(如Photoshop或程序生成)。
  • 性能优势:无需运行时计算,适合大规模渲染。

三种方案对比与选择建议
方案渐变类型实时性灵活性性能适用场景
顶点着色器✅ 圆形径向✅ 高✅ 高✅ 高动态属性驱动、实时变化
Canvas动态贴图✅ 圆形径向⚠ 中✅ 高⚠ 中复杂渐变、交互式调整
静态图片贴图✅ 圆形径向❌ 低❌ 低✅ 高固定渐变、大规模渲染

总结

三种方案均通过圆形结构+径向扩散实现渐变色,区别在于:

  • 顶点着色器:实时计算,适合动态数据。
  • Canvas贴图:灵活定制,适合复杂渐变。
  • 静态贴图:性能最佳,适合固定逻辑。

最终选择建议

  • 需要实时响应属性变化 → 使用顶点着色器。
  • 需要复杂渐变设计 → 使用Canvas动态生成贴图。
  • 需要极致性能 → 使用静态图片贴图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

周末复习1

质量管理包括质量规划&#xff0c;质量保证&#xff0c;质量控制。质量管理体系要定期执行内部审核和管理评审。二者都属于质量保证过程。 实施质量保证的方法很多&#xff0c;过程分析属于实施质量保证的常用方法。 采购管理过程包括编制采购计划,实施采购,控制采购和结束采购…

英飞凌亮相SEMICON China 2025:以SiC、GaN技术引领低碳化与数字化未来

在刚刚落幕的SEMICON China 2025上&#xff0c;全球半导体行业再度汇聚上海&#xff0c;共同探讨产业未来。本届展会以“跨界全球•心芯相联”为主题&#xff0c;覆盖芯片设计、制造、封测、设备及材料等全产业链&#xff0c;充分展现了半导体技术的最新突破与创新趋势。 作为…

工业路由器赋能仓库消防预警,智慧消防物联网解决方案

在现代物流与仓储行业蓬勃发展的当下&#xff0c;仓库的规模与存储密度不断攀升&#xff0c;消防预警的重要性愈发凸显。传统消防系统在应对复杂仓库环境时&#xff0c;预警滞后、设备联动不畅、数据管理困难等弊端逐渐暴露。为了有效解决这些问题&#xff0c;工业路由器作为物…

【开发常用命令】:服务器与本地之间的数据传输

服务器与本地之间的数据传输 本地给服务器上传数据 scp /path/to/local_file usernameremotehost:/path/to/remote_directory例如 scp test.txt root192.168.1.xxx:/test # test.txt 需要上传到服务器的文件&#xff0c;如果非当前路径&#xff0c;使用文件的相对路径或绝对…

springboot + nacos + k8s 优雅停机

1 概念 优雅停机是什么&#xff1f;网上说的优雅下线、无损下线&#xff0c;都是一个意思。 优雅停机&#xff0c;通常是指在设备、系统或应用程序中止运作前&#xff0c;先执行一定的流程或动作&#xff0c;以确保数据的安全、预防错误并保证系统的整体稳定。 一般来说&…

Python 标准库之 math 模块

1. 前言 math 模块中包含了各种浮点运算函数&#xff0c;包括&#xff1a; 函数功能floor向下取整ceil向上取整pow指数运算fabs绝对值sqrt开平方modf拆分小数和整数fsum计算列表中所有元素的累加和copysign复制符号pi圆周率e自然对数 2. math.floor(n) 函数 math.floor(n) 的…

6.14星期六休息一天

Hey guys, Today’s Saturday, and I didn’t have to go to work, so I let myself sleep in a bit — didn’t get up until 8 a.m. My cousin invited me over to his place. He lives in a nearby city, about 80 kilometers away. But honestly, after a long week, I …

event.target 详解:理解事件目标对象

event.target 详解&#xff1a;理解事件目标对象 在 JavaScript 事件处理中&#xff0c;event.target 是一个关键属性&#xff0c;它表示最初触发事件的 DOM 元素。下面我将通过一个可视化示例详细解释其工作原理和使用场景。 <!DOCTYPE html> <html lang"zh-C…

Flutter 小技巧之:实现 iOS 26 的 “液态玻璃”

随着 iOS 26 发布&#xff0c;「液态玻璃」无疑是热度最高的标签&#xff0c;不仅仅是因为设计风格大变&#xff0c;更是因为 iOS 26 beta1 的各种 bug 带来的毛坯感让 iOS 26 冲上热搜&#xff0c;比如通知中心和控制中心看起来就像是一个半成品&#xff1a; 当然&#xff0c;…

Android工程中FTP加密传输与非加密传输的深度解析

详细的FTP传输实现方案&#xff0c;包括完整代码、安全实践、性能优化和实际应用场景分析。 一、FTP传输类型对比表&#xff08;增强版&#xff09; 特性非加密FTPFTPS (FTP over SSL/TLS)SFTP (SSH File Transfer Protocol)协议基础FTP (RFC 959)FTP SSL/TLS (RFC 4217)SSH…

C# 枚 举(枚举)

枚举 枚举是由程序员定义的类型&#xff0c;与类或结构一样。 与结构一样&#xff0c;枚举是值类型&#xff1a;因此直接存储它们的数据&#xff0c;而不是分开存储成引用和数据。枚举只有一种类型的成员&#xff1a;命名的整数值常量。 下面的代码展示了一个示例&#xff0c…

一文详解前缀和:从一维到二维的高效算法应用

文章目录 一、一维前缀和​1. 基本概念​2. C 代码实现​3. 应用场景​ 二、二维前缀和1. 基本概念​2. C 代码实现​3. 应用场景​ 三、总结​ 在算法竞赛和日常的数据处理工作中&#xff0c;前缀和是一种极其重要的预处理技术。它能够在常数时间内回答多次区间查询&#xff0…

windows 开发

文章目录 环境搭建数据库关键修改说明&#xff1a;在代码中使用该连接字符串&#xff1a;注意事项&#xff1a;实际使用 都说几天创造一个奇迹&#xff0c;现在是真的这样了&#xff0c;Just do it! 环境搭建 数据库 需要下载这个SQL Server数据库&#xff0c;然后每次Visua…

免费OCPP协议测试工具

免费OCPP 1.6J协议测试工具&#xff0c;简单实用。除加密功能外&#xff08;后续版本支持&#xff09;&#xff0c;支持所有消息调试。 后续将添加2.01和和2.1协议支持. 欢迎使用 Charge-Test

高等数学基础(行列式和矩阵的秩)

行列式主要用于判断矩阵是否可逆及计算特征方程 初见行列式 行列式起源于线性方程组求解 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1 a_{12}x_2 b_1 \\ a_{21}x_1 a_{22}x_2 b_2 \end{cases} {a11​x1​a12​x2​b1​a21​x1​a22​x2…

开心灿烂go开发面试题

1.给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1: 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] package main import “fmt” type ListNode struct { Val int Next *ListNode } func main() { l1 : &…

【Flutter】程序报错导致的灰屏总结

【Flutter】程序报错导致的灰屏总结 一、前言 在 Flutter 中&#xff0c;出现“灰屏”&#xff08;grey screen&#xff09;通常意味着 应用发生了未捕获的错误&#xff0c;导致框架无法正确构建 UI。 这也是在面试过程中常常问到的。 二、错误分类 常见的会导致灰屏的错误…

基于物联网设计的智慧家庭健康医疗系统

1. 项目开发背景 随着物联网&#xff08;IoT&#xff09;技术的发展&#xff0c;智能家居系统逐渐融入到我们的日常生活中&#xff0c;成为提高生活质量、增强家庭安全、提升健康管理的重要工具。特别是在健康医疗领域&#xff0c;借助物联网技术&#xff0c;智能家居不仅能够…

设计模式精讲 Day 1:单例模式(Singleton Pattern)

【设计模式精讲 Day 1】单例模式&#xff08;Singleton Pattern&#xff09; 文章内容 开篇 在软件开发中&#xff0c;设计模式是解决常见问题的通用解决方案。作为“设计模式精讲”系列的第一天&#xff0c;我们将深入讲解单例模式&#xff08;Singleton Pattern&#xff09…

【卫星通信】3GPP标准提案:面向NB-IoT(GEO)场景的IMS信令优化方案-降低卫星通信场景下的语音呼叫建立时延

一、引言 随着5G非地面网络&#xff08;NTN&#xff09;技术的演进&#xff0c;基于NB-IoT的卫星通信&#xff08;如GEO地球同步轨道卫星&#xff09;逐渐成为偏远地区语音服务的重要补充。然而&#xff0c;传统IP多媒体子系统&#xff08;IMS&#xff09;的信令流程在带宽受限…