二维项目制作、发布、私有化部署全流程免费,无任何限制 点击下载
咨询客服
  • 产品
    • 山海鲸可视化
      • 网络公开版
      • 私有化部署版
    • 可视化套件
      • 鲸孪生
      • 数据管家
      • 鲸地图(敬请期待)
      • 山海鲸报表
      • 山海鲸查看器
      • 大屏演示app
    • 插件
      • Blender山海鲸导出插件
      • Revit山海鲸导出插件
  • 定制服务
  • 解决方案
    • 建筑与城市
      • 智慧社区解决方案
      • 智慧医院解决方案
      • 智慧工厂解决方案
      • 智慧医保解决方案
      • 科技风园区解决方案
      • 智慧办公园区
      • 智慧街区
    • 水利水务
      • 智慧大坝
      • 小流域智慧黄河
      • 水灾应急管理平台
      • 应急管理平台
      • 河流污水治理
      • 环境卫生数字平台
      • 智慧水闸
    • 工业与农业
      • 智慧工厂解决方案
      • 智慧农业解决方案
      • 智慧矿山解决方案
      • 工厂生产线
      • 银行数据中心
      • 智慧工业化养殖系统
      • 智慧港口可视化平台
      • 物流园区可视化平台
    • 智慧党建
      • 智慧党建解决方案
      • 智慧党建可视化大屏
      • 智慧党建展厅
      • 数字化应急指挥中心
    • 车辆与交通
      • 智慧交通解决方案
      • 汽车需求调研互动系统
      • 杭州市交通运输系统
      • 煤矿运输
      • 船舶能源管理系统
      • 掘进机装备智慧项目
      • 机场智慧管理系统
    • 设备运维
      • 智慧机房解决方案
      • 机房信息数据可视化
      • 核引擎数字孪生系统
      • 芯调度数据可视化
      • 工厂运营驾驶舱
      • 智慧风电可视化
      • 网络信息链路拓扑监控
    • Cesium&GIS方案
      • Cesium&GIS解决方案
      • 倾斜摄影-老姆庙
      • GIS3D城市
  • 下载
  • 资源中心
  • 教程与帮助
    • 视频教程
    • 图文教程
    • 常见问题
  • 开发者
  • 报表工具
大屏管理 组件介绍 数据源管理

GIS融合之路(二)CesiumJS和ThreeJS深度缓冲区整合

2023-03-06 16:09:52
浏览 3419 次
您正在查看的是山海鲸旧版本教程,与山海鲸软件最新版本有很多不一致,请移步查看最新的教程 →_→ 山海鲸使用教程

摘要: 上一篇文章里简单介绍了山海鲸中城市大师为了整合GIS系统所做的技术选型的探索,最终我们决定采用先后绘制的形式在单个Canvas上整合山海鲸的3D引擎和CesiumJS。那有同学要问了,如果一个先画,一个后画,后画的不就把先画的覆盖了吗?这里我们就要学到深度缓冲区的概念了。 本文内容基于山海鲸可视化软件操作,您可先免费下载山海鲸可视化后再阅读本文。 下载山海鲸可视化软件

在这篇文章开始前再次重申一下,山海鲸并没有使用ThreeJS引擎。但由于ThreeJS引擎使用广泛,下文中直接用ThreeJS同CesiumJS的整合方案代替山海鲸中3D引擎和CesiumJS整合。

系列传送门:

山海鲸可视化:GIS融合之路(一)技术选型CesiumJS/loaders.gl/iTowns?

文章开始之前大家可以看下这个视频当中山海鲸中CesiumJS与山海鲸深度整个的结果,图片中展示了Cesium的地形和山海鲸中的水面的整合,这个过程中就有一个完整的深度缓冲区的整合:

具体内容可以移步完整的教程查看:  GIS地形编辑-山海鲸可视化视频教程

上一篇文章里简单介绍了山海鲸中城市大师为了整合GIS系统所做的技术选型的探索,最终我们决定采用先后绘制的形式在单个Canvas上整合山海鲸的3D引擎和CesiumJS。那有同学要问了,如果一个先画,一个后画,后画的不就把先画的覆盖了吗?这里我们就要学到深度缓冲区的概念了。

深度缓冲度也称之为DepthBuffer,是GPU为了对光栅化渲染时物体的遮挡关系进行排序用到的概念。概念本身很简单,就是每绘制一个物体的同时,把这个物体在每一个像素点上的深度信息与这个像素点之前的深度信息进行对比,如果这个像素点的深度较小(注意这要看具体深度缓冲的DepthFunction,一般在WebGL上默认是最大的是Depth是1,因此越小越近)则继续渲染像素颜色,否则直接丢弃。

有了深度缓冲区,问题就变得简单了,让CesiumJS先画,山海鲸引擎后画。只要保证深度写入和深度测试都是默认打开的,那不就万事大吉了。Done,下班!

等等,好像有问题;等等,好像有不少问题!等等,好像完全不行….

问题可是真不少,咱还得一关一关的过啊:

1.CesiumJS默认用的LogarithmicDepth,而普通的3D引擎默认用的是LinearDepth

按说这也不是什么大问题,CesiumJS支持修改Scene上的logarithmicDepthBuffer改成linearDepth,Threejs这类也基本都实现了LogarithmicDepth,因此不是大问题。不过由于CesiumJS一般都是大场景和超大场景,改成Linear的话一定会有严重的Z-Fighting,而ThreeJS这类主要是小场景,改成LogarithmicDepth,又会导致在近景部分depth精度不足。当然希望近景和远景同时完美,本身在技术上也是鱼和熊掌的问题,我们暂时不去深入解决这个问题。

2.CesiumJS默认的渲染方式是距离切段后逐段渲染

这条就非常坑了,CesiumJS默认会将整个相机裁切空间(近平面到远平面之间的空间)分成多段,然后逐段渲染。这样做的好处显而易见,可以进一步拓展Depth的利用率,非常适合CesiumJS这种知道所有模型的位置且不会有体积超出范围的大模型的情况。然后每次分段绘制结束之后,depth的信息就会被清除,导致最初规划的深度缓冲度整合的方案完全无法使用(除非关闭这个分段绘制机制),只能采用新的方案。

3.CesiumJS绘制过程无法嵌入

CesiumJS绘制过程机制及其复杂,想要找到一个合适的时机将ThreeJS这类引擎的绘制过程嵌入进去非常困难,而且也没有对应的接口,写起来对CesiumJS代码侵入性极强,后续CesiumJS升级时很难跟随升级,为将来的可维护性留下很深的隐患。

综合这三个问题,最终决定不再让CesiumJS直接绘制到Canvas上,而且采用CesiumJS提供的PostProcessStage接口将整个绘制的ColorBuffer和DepthBuffer都存入FrameBuffer当中,在ThreeJS中再将这两个FrameBuffer转换为WebGLRenderTarget。通过这两种方式就可以拿到CesiumJS的绘制结果。

将CesiumJS的绘制结果转换为两个Texture之后,就要在ThreeJS端绘制进去。这个过程类似PostProcess的过程,但是要先做。这里参考CesiumJS中的ViewportQuad接口,在ThreeJS中创建一个PlaneGeometry,设置一个ShaderMaterial,在VetexShader中,将四个点对齐到整个视口的四个角上,实现代码非常简单。

void main() {
  gl_Position = vec4( position.x, position.y, 1., 1. );
}

在FragmentShader当中读入ColorBuffer和DepthBuffer

uniform sampler2d czmColorSampler;
uniform sampler2d czmDepthSampler;

ColorBuffer直接写入,非常简单,depth如何写入呢。

首先我们要明确我们从CesiumJS拿到的是什么Depth,查看Cesium源码可以发现,我们拿到的depth是LogarithmicDepth被映射到0~1之间之后被pack在rgba四个通道上之后的结果。因此我们首先要对CesiumJS的depth进行unpack,并且根据相机的near和far将depth恢复到相机空间的z距离。拿到这个距离之后为了方便存储,山海鲸目前的做法是将这个z距离再在自己引擎的相机中的near和far做一次映射,算出线性的0~1的depth,这样就可以和自己引擎中拿到的depth一致了,当然为了方便存储,也pack到rgba中区。最终得到的结果存入czmDepthSampler,具体结果如下图所示:

czmColorSampler
czmDepthSampler
.
.
最终合成图

这个结果理论上就可以直接和ThreeJS里的相机空间的depth进行对比了,但是注意我们这里并不打算认为对比,而是希望用GPU自己的深度缓冲区测试,这个怎么做呢。这里就要用到Shader的深度写入功能。一般来说GPU在拿到vetexShader中的gl_Position之后会自己把得到的坐标转换到NDC空间中,并进一步将depth映射到0~1之间,再存入depth buffer。

WebGL中转换前和转换后坐标

我们需要在FragmentShader中接管这个功能,WebGL也提供的接口:gl_FragDepth。(但是要特别注意的是,一旦开启Shader的缓冲区写入,GPU的early-Z优化就会自动关闭,所有的像素点着色都会进行,因此不是我们这种迫不得已的情况,还是尽量不要用的。)有的这些只是,我们只需要最后将线性空间的depth模拟GPU的计算过程,转换为ndc空间的depth写入就可以了。

我们通过以上方式正式将Cesium的渲染过程并入了山海鲸引擎的渲染过程当中,当然这中间还要处理很多gl state状态的问题,不过不管怎样,最难的一步已经越过去了,剩下的就是对目前的机制进行完善,防止状态冲突问题即可。但是深度整合成功是不是Cesium就整合完成了呢,正式成为了山海鲸可视化的一部分?答案显然是否定的,现在的Cesium除了遮挡正常了以外,相机还没有同步,一旦移动,就会发现完全对不上位置。另外除了相机起码还有3个比较大问题:1.阴影的整合 2.光照的整合 3.G-buffer管线数据的同步。别急,我们一步一步来,后面的文章逐个给大家展开这些问题的处理。

党建工作框架图 cesium加载3dtiles 数据资产大屏 医院3D可视化 大数据大屏展示系统 cesium js api 什么是可视化 数据地图可视化 数据可视化大屏展示系统 楼宇大屏可视化

做数字孪生大屏,就用山海鲸

顶级视效 | 自由编辑 | 二次开发

免费下载

聚圣源宝宝生辰八字起名打分免费测试宝宝起名全攻略金刚狼4湖南卫视直播chua米哎呀酋长起名康熙字典在线查字起名字,芮字wcdma手机是什么意思五行水字旁起名霖男孩起名无限英灵战姬萝卜易居起名打分测试末班车后在胶囊旅馆钟南山南抗击疫情的故事魔兽争霸地图下载黄玉灵猫医疗管理软件按摩店起名大全集艺名起什么好网上婴儿起名字1988年8月8日外来妹固始县人民政府未出生婴儿起名之字起名武昌火车站电话桥门式起重机司机证怎么报名起名的 海2013宝宝起名大全淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化