news 2026/4/23 14:33:15

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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进阶】无偿获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 7:25:15

数据湖中的实时数据处理:Flink集成方案详解

数据湖中的实时数据处理:Flink集成方案详解 关键词:数据湖、实时数据处理、Apache Flink、流批一体、Hudi/Delta Lake 摘要:本文将带您深入理解数据湖与实时处理技术的融合场景,重点解析Apache Flink如何与数据湖(如Hu…

作者头像 李华
网站建设 2026/4/19 23:33:23

2026 年企业数字化转型必备!智慧人力系统核心功能与应用场景解析

在企业数字化转型的进程中,人力资源管理的数字化升级成为关键环节,智慧人力系统则是实现这一升级的核心载体。不少企业在转型中面临人事流程割裂、数据利用低效、管理决策缺乏依据的问题,而智慧人力系统通过整合技术与人力管理业务&#xff0…

作者头像 李华
网站建设 2026/4/23 11:35:18

Java毕设项目推荐-基于springboot的慢性病健康管理系统的设计与实现基于大数据的慢性病健康管理系统【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/23 9:56:21

【日记】这炒河粉好辣!怎么还能放山海椒的啊…… 不过好好吃(1703 字)

正文 终于凑到了同事跟朋友在一块儿健身了。本来想让他们俩相互认识认识,特喵的俩人还是叫我推微信。我真绷不住了。 有那么社恐吗,这话都不聊两句的…… 明明他马上就要到总行去打黑工了。不过该说不说,这运气也是没谁了。全国就那么几个人&…

作者头像 李华
网站建设 2026/4/23 9:56:29

基于Springboot智能停车计费管理系统【附源码+文档】

💕💕作者: 米罗学长 💕💕个人简介:混迹java圈十余年,精通Java、小程序、数据库等。 💕💕各类成品Java毕设 。javaweb,ssm,springboot等项目&#…

作者头像 李华
网站建设 2026/4/23 10:00:06

屏幕录制器-Android studio软件源代码-java语言

屏幕录制器:简介与使用说明 一、软件简介 🎥 软件名称:屏幕录制器核心功能:一款专为移动端设计的屏幕录制工具,支持高清录屏、截图、视频预览与保存,操作简单,功能实用。 主要特点 一键录屏&…

作者头像 李华