|
第一次写东西,分享一下自己在做超大场景遇到渲染相关的问题,如果有不对的地方欢迎指正。
一直以来虚拟仿真,在教育培训领域中应用广泛,但是在航天航空、交通、军事、铁路等往往需要模规模空前且无限的虚拟世界 。暂且不谈其他专门做虚拟仿真的引擎如UNIGINE。国内做虚拟仿真的厂家大多以Unity为主。
在Unity中理论上你可以做出无限大且高精度的地图,但是实际中,当距离过远时其物理甚至渲染的精度都会出现很多问题。除了unity在设计本身使用32位浮点精度以为(64位双精度浮点其最大坐标值实际上比32位浮点精度的536,870,912倍还要大),还有因为Unity本身内置渲染管线不够健壮。所以导致在物体和摄像机离世界原点坐标比较远的地方会出现渲染抖动闪烁的问题还会出现在使用的Unity默认的动画系统,物体会不停抖动的问题。并且在Bake的时候无法消除噪点(这个噪点通过调整参数也无法消除的)。关于动画问题的解决方法可以参考下面这篇文章:
那么为什么会出现这些问题呢?因为浮点数的绝对精度随着数字的增大而降低。这意味着GameObject坐标变得越来越不精确,而GameObject离场景的原点越远。距离较远的游戏对象的网格面相互接近,可能出现在同一个地方,所以导致出现z-fighting深度冲突(指的是场景中两个z-buffer相同的图元出现闪烁的现象)。为了解决这个问题Camera-relative rendering用摄像机的位置代替了世界的原点。抖动也是一样的道理在,在图形渲染中模型的顶点会从模型空间再到世界空间等一系列的空间转换,所以在远距离的模型的每一个点在经过无数的转化之后显示在屏幕空间上由于精度不够,所以会出现抖动的问题。
接下来说一下渲染管线,先来简单介绍一下Unity推出为了解决仅有一个默认渲染管线,造成的可配置型、可发现性、灵活性等局限性的问题,而推出了的可编程渲染管线(SRP),并且官方有针对性的推出了HDRP高清渲染管线和URP通用渲染管线,顾名思义URP比较通用适合各种平台,HDRP不支持OpenGL或OpenGL ES设备,所以他只针对高性能平台。大部分的虚拟仿真都是在pc端,使用HDRP再适合不过了。
那么接下来说一下为什么使用HDRP,HDRP除了渲染效果更好以为最重要的是他的新的特性Camera-relative rendering摄像机相对渲染,与内置渲染管道相比,摄像机相对渲染允许高清晰度渲染管道(HDRP)以更健壮和数值稳定的方式呈现远距离游戏对象(具有较大的世界空间坐标)。一定程度上弥补了上述存在的渲染问题。
浮点数的绝对精度随着数字的增大而降低。这意味着GameObject坐标变得越来越不精确,而GameObject离场景的原点越远。距离较远的游戏对象的网格面相互接近,可能出现在同一个地方,所以导致出现z-fighting深度冲突(指的是场景中两个z-buffer相同的图元出现闪烁的现象)。为了解决这个问题Camera-relative rendering用摄像机的位置代替了世界的原点。
关于Camera-relative rendering的原理实际上是在任何几何转换(GeometricTransformations此处的转换是从模型空间做换到世界空间)之前Camera-relative rendering会把GameObjects 和Lights经行转化并且取消世界空间摄像机位置,然后将世界空间摄像机的位置设置为0,并相应地修改所有相关矩阵。
下面是项目里(Unity5.6内置渲染管线下)摄像机在离远点20000m的位置和离远点几千米的画面效果对比:
非常明显可以看出在摄像机在离远点20000m的位置的画面里会有投影的抖动和墙体的闪烁现象。最近在使用unity2019.4HDRP在不完全的测试下离原点20000m的位置画面没有出现上述问题,不过还需要进一步的测试(太懒了这里没图= =)。关于这个问题的分享就先告一段落。
下面插播一些题外话,相比游戏行业虚拟仿真行业的投入和收益和游戏是没法比拟的,所以其实国内的虚拟仿真无论是美术还是程序的技术水平有远不如游戏行业,如果想要用HDRP势必会提高开发成本对于虚拟仿真行业。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|