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

Cesium进阶教程(2)线性高度雾

本系列教程适合有前端基础以及一定三维GIS开发基础、想学习cesium高阶内容的同学,例如:WebGIS开发工程师、前端工程师、GIS专业学生和相关科研人员等。
视频版戳此处观看
文字版教程:
Cesium进阶教程(1)在cesium后处理中使用shadertoy的代码

高度雾:根据高度进行雾化的一种现象,可以增加场景的真实感与立体感,使渲染效果更加接近现实环境。

实现思路

  1. 获取像素点的世界坐标。
  2. 根据像素点的世界坐标计算高程。
  3. 根据高程计算雾化值。
  4. 根据雾化值混合场景原来的颜色和雾化颜色。

将前面的线性距离雾函数修改一下
这里我们得到像素点的世界坐标,并且减去当前位置的地球半径,得到当前像素点的高程。

float getDistance(sampler2D depthTexture, vec2 texCoords) { float depth = czm_unpackDepth(texture2D(depthTexture, texCoords)); vec4 eyeCoordinate = czm_windowToEyeCoordinates(gl_FragCoord.xy, depth); vec3 eyeCoordinate3 = eyeCoordinate.xyz / eyeCoordinate.w; vec4 worldCoordinate4 = czm_inverseView * vec4(eyeCoordinate3, 1.); vec3 worldCoordinate = worldCoordinate4.xyz / worldCoordinate4.w; return length(worldCoordinate.xyz) - earthRadius; //当前高度 }

同步的,我们在js中获取当前的地球半径

earthRadius=Cesium.Cartesian3.magnitude(viewer.camera.positionWC)-viewer.camera.positionCartographic.height;

接下来,我们根据高程计算雾化因子
这里传入参数fogByHeight:new Cesium.Cartesian4(0, 0.7, 1000, 0.0)
含义为,最低的雾高度为0,雾的强度为0.7,最高的雾高度为1000,强度为0,0-1000m高度的雾,会呈现渐变效果。

float interpolateByDistance(vec4 nearFarScalar, float distance) { float startDistance = nearFarScalar.x; float startValue = nearFarScalar.y; float endDistance = nearFarScalar.z; float endValue = nearFarScalar.w; float t = clamp((distance - startDistance) / (endDistance - startDistance), 0.0, 1.0); return mix(startValue, endValue, t); }

然后将雾的透明度混合到当前的场景中

// alpha混合 vec4 alphaBlend(vec4 sourceColor, vec4 destinationColor) { return sourceColor * vec4(sourceColor.aaa, 1.0) + destinationColor * (1.0 - sourceColor.a); } void main(void) { // 获取当前地面到相机的距离 float distanceFog = getDistance(depthTexture, v_textureCoordinates); // 获取场景本身的颜色 vec4 col = texture2D(colorTexture, v_textureCoordinates); // 计算雾化因子 float fogRate = interpolateByDistance(fogByHeight, distanceFog); vec4 finalFogColor = vec4(fogColor.rgb, fogColor.a * fogRate); gl_FragColor = alphaBlend(finalFogColor, col); }

最终效果



看不明白没关系,需要上述视频教程+源码的同学可以直接
+下方小助手↓备注【cesium进阶】无偿获取

http://www.jsqmd.com/news/367805/

相关文章:

  • JVM的内存结构
  • 《effective python》- python默认参数
  • 基于SpringBoot的海洋航运管理系统开题报告
  • 降AIGC率8款AI工具,赶due党速码!
  • 8款AI降AIGC率神器,赶due急救指南!
  • LeetCode 3719.最长平衡子数组 I:I先(几乎)暴力了
  • 农业遥感平台如何通过wangEditor实现GeoTIFF图像转存?
  • 2026 年招聘新趋势:AI 简历筛选工具成企业标配
  • 袁家界・天子山・金鞭溪:张家界一日精华叙事
  • 2026 年企业数字化转型必备!智慧人力系统核心功能与应用场景解析
  • 原始云杉林环绕的秘境,藏着丽江的干净与辽阔
  • 医院电子病历如何用TinyMCE处理PDF签名跨平台Word导入?
  • 有没有基于ASP.NET Core的大文件上传组件支持文件夹的断点续传?
  • 放化疗相关口腔黏膜炎治疗用药护理指南,改善春节进食体验!
  • 企业招聘提效:AI 简历筛选工具优化转化率的核心策略
  • 金融行业ASP.NET大文件上传解决方案中如何加入断点续传功能?
  • 从 0 到 1 教你用 AI 简历筛选工具,设置科学的多维度人才评估标准
  • ICM20948 设备树完整指南
  • Vibe Coding学习笔记(1):与AI结对编程,开发者的“翻译官”与“科技导演”必修课
  • 计算机毕业设计springboot基于WEB的云南省旅游网站 滇域行旅——基于SpringBoot的云南文旅服务一体化平台 云游滇境——基于微服务架构的云南智慧旅游信息门户
  • 【YOLOv8多模态涨点改进】独家创新首发 | TGRS 2025 | 引入UMIS-YOLO中的RFF残差特征融合模块,通过残差连接和多尺度特征融合,优化了目标边界的精确度,适合实例分割、小目标检测
  • 计算机毕业设计springboot基于Java的建筑物保护管理系统 基于SpringBoot的历史建筑数字化保护与运维平台 Java驱动的古建筑智能监测与修缮管理系统
  • 8款AI降AIGC率工具,赶due党速收藏!
  • 怎么把安卓手机数据导入苹果手机?这4个工具最靠谱
  • CloudFront全面优化:六大维度的蜕变
  • 降AIGC率神器实测,8款AI赶due救星!
  • PostgreSQL:万字详解逻辑备份的并行与压缩技巧
  • Java毕设项目推荐-基于springboot的慢性病健康管理系统的设计与实现基于大数据的慢性病健康管理系统【附源码+文档,调试定制服务】
  • 《构建之法》读后感(1)
  • 8款AI降AIGC神器,赶due救急超高效!