当前位置:   article > 正文

Unity实现三维地球简介(早期版本)_unity实现每个行星的运行简介

unity实现每个行星的运行简介

视频链接


前言

        原本开头介绍了几种实现方式,结论就是各有优缺点。。。也就是全是废话。。。既然是废话,就全删了吧  (ʃƪ ˘ ³˘)

        其他不多说,原因有一大堆,结论就是想自己写个球 (ノ´▽`)ノ♪

        一开始写起来特别顺,就是那种遇到bug感觉可能是这里的问题,然后随便改改想先定位问题,结果运行下发现修复了ヽ●*´∀`*●ノ

        直到加载真实的DEM数据,无论怎么修复永远都有缝隙,泪流满面啊 (╥╯﹏╰╥)ง

        一步步排查:卷积核没问题,卷积没问题,加载没问题,坐标变换没有问题,shader没有问题~~最后没办法直接从显存数据中看,当然使用了取巧的办法:运行,选取两张相邻瓦片,提取显存数据到本地,丢到PS里比对,修正采用参数,重复以上步骤~~终于在第3152*3152/(197*197)-11=245次修正后消除了缝隙,再以此特解反推出通解,搞定第一步。第二步叠加残差时又对不上,懒得搞了直接加了个遮罩反正底图已经无缝o(´^`)o。。。于是乎,uv偏了10/197≈0.05。。。。后面再说吧,改DEM就已经改了一个月了 (`ȏ´)

已知问题及优化方向

  • 海拔

    修完DEM后发现海拔与视频号发布的不一样,比如视频号里台湾山的高度都快超过台湾最宽处了。。。研究了半天发现都没问题,搜了下发现台湾东西宽度最宽有144公里,最高点是海拔高度3952米的玉山主峰,也就是说山的高度放大36.437倍才能有视频的效果。。。所以,被坑了啊 ~~o(>_<)o ~~

    缺点:由于偷懒,没修正残差,导致uv偏了大约0.05,等换管线时再一起改了。还有个比较严重的问题,内陆许多地方海拔低于海平面,导致地面被海洋覆盖,需要地形编辑功能调整下。

  • 植被

    目前在 geometry shader 里加了9个点,简单搞了个面片树。。。是不是太敷衍了 φ(>ω<*) 。其实在这基础上移除低于海平面的树,位置加点随机偏移好像还凑合。

    优点:写起来太快了;

    缺点: geometry shader会降低地形性能,特别是复杂3D树;

    路线:从地形中抽离,专门添加植被层,尽可能兼容 Speed Tree。

  • 月球

    目前是使用天空盒实现的。

    优点:是不用在渲染一个球,节约性能;

    缺点:就是无法遮挡地球,且远距离看位置不对 (尝试修正过,但因为获取不到天空盒半径算不出准确向量);

    路线:方向1. 尝试修正位置,成功的话再加个小球就能实现遮挡地球;

               方向2. 月球改成地球这样。

  • 图形API

            目前是同时适配 DX、OpenGL和Vulkan的,不过正因为如此,坐标系搞的有点乱。。。乱到什么程度呢:当前版本我觉得是错的但运行后没问题,尝试修正后反而无法运行了,以后暴雷了再说吧,反正要重构 ⊙﹏⊙|||

    OpenGL:除了Z轴与Unity相反其他没什么问题;

    Vulkan:性能比其他两个低10帧左右,兼容性可能有问题比如天空盒的cubemap采样在这里就报错 (因为地球是没问题的所以没花太多时间去处理);

    DX:和Vulkan类似,拿过来没怎么改就能用,没有OpenGL和Vulkan的问题,可惜跨平台是硬伤;

    路线:之后不打算适配多个图形API了。按道理用Vulkan最好,不过vulkan性能和兼容性问题需要先处理,后面再说吧。

  • Unity问题

    Scene窗口:由于scene窗口的相机智能设置简单参数,所以只能运行后在Game窗口看到球

    float精度问题:引擎的精度已经提升到了double,但是shader的精度依然是float,不知道能不能扩展,或许Vulkan可以吧。隔壁虚幻新版本已经将shader扩展成了double类型,要是Unity也扩展了就没这么多弯弯绕绕了。。。当然也就没我什么事了 ヾ(o´∀`o)ノ 

    ECS插件:本来想直接用这个的,不过好像还不稳定,暂缓。

  • 其他问题

    DOM需要校验:主要是校验经纬度,图源的问题导致经纬度可能有偏移。

    图源清晰度不够:目前图源来自网络分享,好像是7级DOM和12级的DEM,等图像预处理工具写完自己去处理卫星图。

未来规划

  • 大气(高优先级)

    大气层缺失,目前只是颜色叠加,未创建大气层。

  • (高优先级)

    方案1:直接贴上云图,不管他模糊不模糊了,应该会很丑

    方案2:以四叉树加载云。。。好麻烦,不知道效果怎么样

  • 内置渲染管线升级为通用渲染管线(高优先级)

    当前是内置管线实现,本来无所谓管线,但想到现在不改以后加上水、路等移植起来更麻烦,所以列为最高优先级。

  • 水、路网(中优先级)

    需要地形编辑功能,所以先不管吧。

  • 坐标变形工具(中优先级)

    正常模型需要变形为球面模型来贴合地表,小模型或许不需要,但大模型需要,所以后面可以写个变形工具。

  • 后处理(中优先级)

    后处理还是要的,比如现在的太阳还是个圆粑粑,怎么的也得搞个光晕吧 (* ̄︶ ̄)

  • 多线程(中/低优先级)

    渲染球时多线程优先级高;

    加载图像多线程优先级偏低:因为现在已经实现GPU加载纹理,只是当前数据是压缩的,只能CPU解码。看情况,如果以后还是CPU加载就需要多线程,如果提前解压数据就直接GPU加载了。

  • 天空盒的大气(中优先级)

    地表看天空需要渐变:白天是蓝天,夜晚是星空。。。有点麻烦,切换太生硬的话效果可能不好。

  • 渲染线条和点(中优先级)

    数字孪生里常用。

  • 物理碰撞(中优先级)

    这个比较坑了,远景取视点就行,近景不好处理。坐标是GPU算的,GPU射线检测不知道能不能实现。。。或者将坐标计算提取到 Computer Shader 中,一份传给CPU,一份继续渲染,这样可能出问题吧。。。或者渲染个深度图查询?。。。后面再找找论文看看有没有更好的解决方案。

  • 夜景(低优先级)

    夜晚灯光纹理,需要先完成原始素材预处理工具。

  • 模型/资源导入器(低优先级)

    fbx、obj:需要查手册来解析;

    点云、倾斜摄影:需要查手册来解析;

    shp:运行时加载shp文件 (以前项目写过编译器版本,源代码没保存。。。)

  • 网络分发图像(低优先级)

    将图像放云端,使用时在线获取。

  • 实现虚幻Natite材质(低优先级)

    网上已经有很多该技术解析文章了,有时间研究下看看能不能集成进来

    (个人习惯叫他纳米材质,因为翻译成纳米材质十分贴切,没必要非说这个单词是虚幻造的不存在;或许我错了,但是我就是不改(。ì _ í。))

  • 地形编辑(无/低优先级)

    由于地形高低起伏,模型不一定能与地形贴合,所以需要笔刷编辑功能,不过个人觉得用起来不方便,可以直接读取模型信息对地形自适应。(模型加个地基,地形围绕地基自动修正?)

    本不打算加这功能,但是路网、水流可能需要。

  • 安卓版(低优先级)

    看Vulkan怎么样吧,如果可以那就搞,不可以就算了,懒得再看OpenGLCE了。

    出于性能考虑,可能再将double换回float,做个简单版?或者先缩放个1000倍看看效果。

  • 多星球(低优先级)

    把所有行星都做一遍然后集成进来。

    优点:好玩;

    缺点:工作量有点大;需要增加个原点转换;可能超出double范围;

    路线:需要先写卫星图片处理程序来预处理图像数据

  • WebGL/WebGPU(不考虑)

    暂不考虑web,因为该平台源代码明文不加密

结语

        写了快半年了,每天晚上下班后梳理思路写功能测试Demo,周六周日整合代码。。。黑眼圈都出来了,不行了,先歇一歇,反正能用了。。。后面慢慢迭代版本吧。。。

        本来是打算录个视频在网上展示一下的,还没录呢就想着先写个简介 ~~~ 然后又想着顺便梳理下思路,简单列个功能列表防止遗忘 ~~~ 之后觉得写都写了,再补充个首尾吧~~~简介就成这样了。。。太长了,干脆发布成文章吧 ヾ(o・ω・)ノ 

附录

Google地球截图

Google地球 青藏高原

Google地球 台湾

个人作品截图 (海拔放大了5倍)

远景 青藏高原  海拔x5倍

几何着色器 树 (确实丑)  海拔x5倍

近景 青藏高原 海拔x5倍

青藏高原 海拔x25倍
叠加Unity物体
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号