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

Cesium大气散射效果

由于做全球体积云效果的需要,再来研究下大气散射效果

和体积云类似,关于大气散射颜色计算的过程也仅发生在这两个球体之间。如图所示。

 

 

计算从相机出发的视线与球壳的交点,如果不相交,则该视线方向上不会发生大气散射,直接返回透明色。

// 检查与大气外层球体的相交vec2 atmo_intersect = raySphereIntersect(start, dir, dynamic_atmo_radius);vec2 planet_intersect = raySphereIntersect(start, dir, planet_radius);// 如果不相交大气层,直接返回
if (atmo_intersect.x < 0.0) return scene_color;

 这段代码是大气散射物理模型的核心部分,用于模拟光线在大气中的散射行为。

学术解释:真实物理现象的数学建模,不是简单的视觉效果,而是基于光学理论的准确模拟。

简单来说:

  • 瑞利散射:让天空变蓝
  • 米氏散射:让太阳周围发光
  • mu:决定你看向太阳的角度对散射强度的影响
// 散射计算float mu = dot(dir, light_dir);// 瑞利散射相函数float phase_ray = 0.75 * (1.0 + mu * mu);// 米氏散射相函数 (简化)float phase_mie = 1.5 * ((1.0 - 0.9 * 0.9) / (2.0 + 0.9 * 0.9)) * (1.0 + mu * mu) / pow(1.0 + 0.9 * 0.9 - 2.0 * 0.9 * mu, 1.5);

 最重要的一步 就是光线步进

   for (int i = 0; i < MARCH_STEPS; i++) {// 当前采样点位置float t = ray_start + (float(i) + 0.5) * step_size;vec3 sample_pos = start + dir * t;// 计算当前高度和大气密度float height = length(sample_pos) - planet_radius;float density_ray = exp(-height / 8000.0);  // 瑞利散射标度高度:8kmfloat density_mie = exp(-height / 1200.0);  // 米氏散射标度高度:1.2km// 计算光学深度(光线衰减)float optical_depth_step = (density_ray + density_mie) * step_size;total_optical_depth += optical_depth_step;// 计算透射率(光线在大气中的衰减)float transmittance = exp(-total_optical_depth * 0.00001); // 衰减系数// 🌟 太阳光到当前点的衰减(次级光线步进 - 简化版)float sun_optical_depth = 0.0;vec2 sun_intersect = raySphereIntersect(sample_pos, light_dir, dynamic_atmo_radius);if (sun_intersect.y > 0.0) {float sun_ray_length = sun_intersect.y;// 简化的太阳光衰减计算float avg_height = height + sun_ray_length * 0.5 * light_dir.y;sun_optical_depth = exp(-avg_height / 8000.0) * sun_ray_length;}float sun_transmittance = exp(-sun_optical_depth * 0.00001);// 计算当前步的散射贡献vec3 step_ray_scattering = beta_ray * density_ray * phase_ray * transmittance * sun_transmittance * step_size;vec3 step_mie_scattering = beta_mie * density_mie * phase_mie * transmittance * sun_transmittance * step_size;// 累积散射total_ray_scattering += step_ray_scattering;total_mie_scattering += step_mie_scattering;}

 最终效果如图所示 左侧为没有处理的,ceisum自带的大气效果,右侧为添加散射的效果

其实只看图片的话,可能大部分人会觉得太阳都看不清楚有什么必要加,但这个散射在体积云中效果就很明显了,场景也明细更加贴近显示大气效果。

todo:将大气和全球体积云效果融合

http://www.dtcms.com/a/303260.html

相关文章:

  • Datawhale AI夏令营:大模型理解列车排期表
  • Vue组件通信的终极指南
  • Spark SQL 聚合函数:collect_list 与 collect_set 用法详解
  • ADAS测试:如何用自动化手段提升VV效率
  • 04动手学深度学习(下)
  • AOP实现接口幂等
  • B树、B+树、红黑树区别
  • Solidity基础(教程④-ERC-4626收益金库)
  • 被困扰的elementplus样式修改问题:select选择器修改和el-input修改
  • PHP企业级应用架构:微服务通信、分布式事务与性能优化
  • 短剧系统开发上线全流程攻略:从架构设计到性能优化
  • 页面性能优化
  • SpringBoot轻松集成豆包AI
  • Cacti RCE漏洞复现
  • Android Studio关于Connection refused: connect报错
  • “车位到车位”自动驾驶真相
  • pcm,msd调制解调仿真
  • WCF服务通信框架
  • 用友NC漏洞批量检测工具,支持POC显示、单一检测、批量检测、结果导出、AI交互等
  • Parasoft Virtualize用服务虚拟化加速银行系统的软件测试
  • Red Hat OpenShift AI 产品简介
  • XCF32PVOG48C Xilinx Platform Flash PROM
  • 神经网络CNN、RNN、Transform
  • 【实时Linux实战系列】在实时应用中进行负载均衡
  • Docker 部署 Supabase并连接
  • 【Linux】重生之从零开始学习运维之Mysql
  • 深度学习篇---层与层之间搭配
  • 基于Qlearning强化学习的水下无人航行器路径规划与避障系统matlab性能仿真
  • 免费离线翻译软件LibreTranslate免安装一键启动整合包下载
  • JavaScript 回调函数讲解_callback