欢迎关注公众号【sky的数孪技术】
随着Cesium在Unreal Engine和Unity中的普及,原生应用开发者对地理空间应用的视觉表现提出了更高要求。游戏引擎特有的动态日光系统、光探针和全局光照等技术已开始应用于地理空间领域。CesiumJS团队一直在探索基于浏览器的地理空间三维应用的次世代光照方案。
良好的照明对于充分利用基于物理的渲染(PBR)至关重要,PBR 是模型和 3D Tiles 中常见的渲染技术。想象一下抛光的金属球:它看起来平坦而暗淡,没有任何东西可以反射。通过改进glTF材质模型,Cesium团队在最近几个版本中重点提升了光照系统,主要包括:
- 图像基照明(IBL)流程优化
- 动态生成环境贴图
- 尺度无关的环境光遮蔽
基于图像的照明技术演进
作为CesiumJS沿用多年的核心技术,基于图像的照明(IBL)通过半球形光照贴图模拟复杂光照环境。最新版本将方向光(如根据时空位置精确计算的太阳光)与IBL结合,实现了更真实的光照效果。典型案例如noe-3d.at提供的模型:纯方向光(左)、纯IBL(中)、混合模式(右),后者展现出更强的立体感和场景代入感。
IBL 是一种颇具吸引力的方法,因为它使用单个环境贴图模拟复杂的照明环境,例如来自天空的半球照明、来自地面的漫反射以及场景中的任何其他光源。此贴图将高动态范围的照明信息编码在全向纹理中,通常使用用户提供的 HDR 图像或在运行时生成的程序纹理。
动态环境贴图突破
传统方案需依赖外部工具预处理HDR贴图,流程繁琐。新版CesiumJS支持动态生成环境贴图,可实时响应时间变化、大气条件或模型位置变动。
GPU 上的运行时生成
动态环境贴图是在 GPU 上创建的,可以近乎实时地更新以反映当前的太阳位置和模型位置。当一天中的时间、大气设置或模型位置发生重大变化时,环境贴图可以在后台几帧内更新。
以 _Damaged Helmet glTF _为例,1.121版本(左)使用默认光照,1.125版本(右)通过动态环境贴图实现更真实的反射效果。开发者还可自定义光照强度和地面反射颜色参数。
基于GPU的大气散射
Cesium里是通过复用现有时间来驱动天空渲染着色器,通过视角适配实现从日出日落到高空飞行等不同光照条件的模拟。金属球体在晨(左)、正午(中)、黄昏(右)的反射效果展示,验证了动态环境贴图的实时适应性。
性能优化策略
针对低粗糙度材质(如镜面金属),需对环境贴图进行数千次采样计算。为平衡性能,Cesium采用以下优化方案:
- GPU预计算:模型加载时生成数据结构
- 环境贴图存储为立方体贴图:以便根据反射光线的方向快速查找
- mipmap分级存储:粗糙度对应不同LOD的镜面反射图
- 球谐系数:存储三阶RGB辐射度,快速计算漫反射
从八面体投影到立方体贴图
WebGL 2时代,Cesium摒弃了旧有的八面体投影方案,改用原生立方体贴图。简化了GPU工作流,修复了LOD选择等历史问题,显著提升渲染效率。
环境光遮蔽技术升级
环境光遮蔽( AO ) 是理解无纹理模型(如 OSM 建筑数据或建筑设计模型)形状和深度的关键。此技术使接收较少环境光或间接光的区域(如角落或折痕)变暗,从而产生柔和阴影的效果。
作为增强模型体积感的关键技术,新版采用屏幕空间后处理方案:
- 修复原有实现缺陷
- 引入基于视点距离的动态采样步长
- 高斯分布衰减算法:随距离增加阴影渐变宽度
以noe-3d.at的建筑模型为例,环境光遮蔽单独使用时即可清晰呈现结构细节。结合IBL和方向光后,达到接近全局光照的视觉效果,却无需烘焙等预处理步骤。
基于地平线的环境光遮蔽 (HBAO)
基于地平线的环境光遮蔽(HBAO) 使用采样来确定从某个位置看不到天空半球的最小角度。当在多个方向上重复此操作时,我们可以估算出场景中到达每个像素的光线百分比。此技术有助于在视觉上传达场景中物体之间的深度、形状和空间接近度,并且可以在屏幕空间中执行以获得更好的运行时性能,而无需预先计算照明。
技术前瞻
最后Cesium官方也提到了未来在以下方面会持续改进:
- HDR贴图易用性API
- 阴影渲染优化
- 屏幕空间遮蔽参数自适应