在 Cesium for Unreal 中通过抖动不透明遮罩/蒙版实现更平滑的LOD过渡

在 Cesium for Unreal 中通过抖动不透明遮罩/蒙版实现更平滑的LOD过渡

2022年10月20日

我们最近在Cesium为虚幻添加了一个选项,以实现抖动不透明度遮罩下的细节层次之间的平滑过渡。启用此选项将以最小的渲染开销为最终用户提供更无缝的查看体验。

20231121遮罩平滑过渡

3D Tiles 和 LOD 跳跃(LOD Popping)

3D Tiles是OGC社区的一个标准,可以实现大型数据集的无缝流送和渲染,同时以最小化的网络和系统成本。3D Tiles分层细节层次(HLOD)通过同时为场景的不同部分使用不同的细节层次来帮助实现这一点。远离相机的图像块可以被流式传输,并以较低的细节层次(LOD)进行渲染,而靠近相机的图像块则以更高的细节进行渲染。这些不同LODs的瓦片缝合在一起,覆盖了整个场景。

这种HLOD方法要求贴图经常在较高和较低的细节层次之间过渡,因为用户在场景中移动。在贴图之间切换可以让用户立即看到加载并准备渲染的目标细节级别,但由于LOD切换得如此突然,这可能会让人感到相当混乱和不和谐。这种效果被称为“LOD popping”

20231121_LOD Popping

在大多数情况下,LOD 跳跃 (LOD Popping)可以通过极致的最小化使瓦片过渡稍微更长和更渐进。

抖动的 LOD 转换(过渡)(Dithered LOD Transitions)

为了解决 Cesium forUnreal 中的 LOD popping 问题,我们在Cesium3DTileset actor 中新增了 Use LOD Transitions 选项。我们的方法在LOD popping、瓦片加载延迟和渲染成本之间进行了谨慎的权衡。其目标是确保抖动过渡长度不会造成明显的延迟,但仍然有足够的过渡重叠来隐藏LOD切换。另一个需要考虑的因素是避免过多的贴图同时淡入或淡出,因为这可能导致在摄像机移动期间的 draw calls 激增。

20231121_smoother

抖动虚化 vs 半透明(Dithered Fading vs Translucency)

为什么不用半透明呢?

使用基于半透明的效果来混合LODs可能很诱人,但它有几个性能缺陷。在虚幻引擎中,在延迟渲染管道绘制场景的不透明部分后,半透明对象在单独的前向渲染通道中渲染。半透明渲染通道禁用深度测试,并向后复合半透明三角形——这要求半透明三角形在每帧中按距离排序。缺乏深度测试会导致严重的过度绘制,三角形排序的计算量会非常大。半透明对象也不会写入深度缓冲区,这意味着在遮挡剔除期间,它们不能用于遮挡其他对象。

不透明遮罩/蒙版(Opacity Masking)

事实证明,透明渲染是复杂的,因为是部分透明的。如果材质的不透明度值总是0或1(分别是完全透明或完全不透明),渲染材质会变得容易得多。在虚幻引擎中,这个概念被称为“不透明蒙版”。在不透明蒙版材质中,不透明度值在片段着色器中确定,通常从不透明蒙版纹理中采样。除了基本的不透明渲染之外,这个着色器代码也会在depth渲染时运行。这意味着,除了在两次传递过程中潜在的额外纹理样本外,不透明遮罩对象的渲染方式与不透明对象完全相同。它们甚至可以充当遮挡器,因为它们会被写入深度缓冲区。

不透明遮罩是一种灵活和高性能的技术,已经在Cesium for Unreal 的另一部分中使用——我们使用不透明掩模/遮罩/蒙版从瓦片集中裁剪2.5D区域。

在这里插入图片描述

抖动的不透明遮罩(Dithered Opacity Masking)

抖动是从数字信号处理中借来的概念,指的是在数字信号中添加噪声以使其看起来像模拟信号的过程。在虚幻引擎中,抖动指的是屏幕空间的白噪声采样,该采样以每个片段提供的灰度值为阈值。随着时间的推移,阈值可以增大或减小,以使抖动效果溶解在屏幕中或消失在屏幕外。

在这里插入图片描述

抖动值可以用作不透明掩模/遮罩/蒙版,大致模拟部分半透明,成本只占很小一部分。当与反走样相结合时,抖动不透明掩膜/遮罩/蒙版就成为半透明的一个粗略的蒙特卡罗近似(monte-carlo)。在Cesium for Unreal中,抖动的不透明掩模/遮罩/蒙版阈值在LOD过渡过程中逐渐上升,从旧的瓦片褪色到/渐变至/过渡到新的瓦片。

顾名思义,“Dither Temporal AA”材质节点在 temporal anti-aliasing(TAA,帧间抗锯齿)中效果最好。如果启用TAA,采样的噪声会改变每一帧,因此时间累积最终会将前景和背景混合在几帧中,非常接近于模拟半透明。

互补抖动 Complementary Dithering

正如已经简单提到的,LOD衰减(LOD fading)是通过随时间改变抖动阈值来实现的。两个贴片使用相同的阈值,因此屏幕空间的抖动值相同。然而,渐变平铺在插入不透明度遮罩之前反转了抖动值。这使得两个褪色的瓦片在过渡期间缝合在一起不漏水(water-tight,无懈可击、完美)。

在这里插入图片描述

图2.3:在抖动LOD过渡期间,虚幻引擎的渲染文档捕获的一帧的渲染画面,注意当前帧仅渲染了部分。在前景中,应用抖动不透明度掩蔽后可以看到几个过渡瓦片。请注意黑色的缺失像素,需要用互补的抖动瓦片来填充。

在这里插入图片描述

图2.4:这是与图2.3相同的帧,在更多的绘制调用之后。请注意,互补的过渡瓦片现在已经被涂上了。

在这里插入图片描述

图2.5:其中一块互补的抖动瓦片的深度测试结果。注意这些瓦片是如何继续形成水密(water-tight)渲染的,同时避免在渐入渐出瓦片之间过度绘制。

效果与性能

抖动不透明度掩模/遮罩/蒙版的性能明显优于半透明掩模。与半透明相比,抖动不透明度掩膜基本上没有过度绘制,没有深度排序成本,没有额外的照明成本,也没有对遮挡剔除的负面影响。然而,LOD混合的隐含成本仍然存在——两个LOD必须在过渡期间同时绘制。过渡动画也必须在每一帧都有统一的更新。这意味着同时发生太多瓦片LOD转换将导致绘制调用和统一更新的临时高峰。我们选择0.5秒作为默认过渡长度,以平衡过渡的平滑性、明显的延迟和GPU峰值。更长的过渡长度会导致更大的峰值和更大的延迟。

结论

这些改进和其他改进在Cesium for Unreal v1.17.0版本中可用,现在在Unreal MarketplaceGitHub上已有可用的版本。如果你已经有Cesium for Unreal,请从Epic Games启动器更新插件版本。

通过在任何Cesium3DTileset actor上启用LOD过渡(Use LOD Transitions),尝试抖动LOD过渡。如果你的tileset使用自定义材质,你将不得不添加ML_DitherFade材质层到你的材质中。

在这里插入图片描述

如果你是 Cesium for Unreal 的新手,这是一个很好的时机来尝试它-请从我们的快速入门教程开始!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值