Oculus推出基于蒙版的注视点渲染技术MBFR,无需额外硬件支持
文章相关引用及参考:映维网
本文来自Oculus分享
(映维网 2018年06月23日)对于基于蒙版的注视点渲染(Mask-based foveated rendering,MBFR),这种渲染技术根据一种棋盘模式来删除一定的像素,从而降低眼睛缓冲区的外围区域着色率。这可以帮助你有效地减少世界渲染的像素着色成本,在降低50%的像素时提供优秀的视觉质量。另外,这项技术兼容所有D3D11级别硬件,独立于IHV扩展。
Oculus日前分享了一篇关于基于蒙版的注视点渲染的博文,介绍了一个演示了MBFR的蒙版场景,并且讨论了MBFR于何时最为有用。以下是映维网的具体整理:
1. 蒙版场景
这是一个演示了像素减少的蒙版场景。蒙版图像中有四个圆。中心圆保留所有的像素。其他三个圆分别丢弃25%,50%和75%的像素。
下面是一个重新构建的图像:
下面我们用作参考标准的原始全分辨率场景:
下面我们继续宁并排比较(已经放大)。上图是蒙版图像,中间是重建图像,下面则是参考标准图像:
下面是另一个比较:
2. 集成MBFR
MBFR目前已经托管至Oculus GitHub UE4 Repository。它支持Unreal Engine 4.19和4.20预览版。
要在你的项目中激活MBFR,请按照下列步骤操作:
- 在“UE4 Editor Project Settings”中的“Rendering”部分勾选“Forward Shading”。
- 无需重新启动UE4 Editor,请在“Project Settings”中的“Rendering/Experimental”部分勾选“[VR] Enable Mask-based Foveated Rendering”。
- 根据提示重新启动Editor。Editor需要一段时间才能重建着色器.
- 在预览或在VR模式下运行时,MBFR将在你的项目中激活。
3. 控制台命令
在测试MBFR和调整质量级别时,以下的控制台命令可能会有所帮助:
- vr.Foveated.Mask.Enable 1:激活MBFR
- vr.Foveated.Mask.Enable 0:关闭MBFR
- vr.Foveated.Mask.VisualizeMode 1:禁用像素重构以显示蒙版
- vr.Foveated.Mask.VisualizeMode 0:启用像素重构
- vr.Foveated.Mask.HighResFov:全分辨率区域的FOV(以度为单位)。默认值是46
- vr.Foveated.Mask.MediumResFov:像素丢弃25%的区域的FOV(以度为单位)。默认值是60
- vr.Foveated.Mask.LowResFov:像素丢弃50%的区域的FOV(以度为单位)。默认值是78
- LowResFov以外的区域将丢弃75%的像素
4. 实现
4.1 像素丢弃
要丢弃的像素通过蒙版缓冲区中的掩码位进行剔除。以下是每个密度区域的可见模式:
5. 重构
当读取场景纹理时,丢弃的像素在PostProcessing阶段重建。
5.1 中密度和高密度区域
我们用4个相邻像素来重建中密度和高密度区域中的每个丢弃像素,其中像素丢弃率小于或等于50%。
缺乏经验的公式是将丢弃的像素A设置为B,C,D和E的线性插值。
A = (C + B) * 0.667 * 0.5 + (D + E) * 0.333 * 0.5
但这样做的效果不好,并且会在高对比度/高频率区域造成大量混叠。我们在下面的屏幕截图中可以很容易地观察到伪影,并在VR中造成严重的闪烁。
通过应用根据邻域亮度计算的方向权重可以大大提高视觉质量。这增强了边缘,并且减少了混叠。
最后,我们在高/中密度区域实现了良好的整体重建质量。下面是高密度区域(丢弃25%的像素)的并排比较,中间是重建结果图像,右边是参考图像:
下面是中密度区域的两个比较(丢弃50%的像素),中间是重建结果图像,右边是参考标准图像:
5.2 低密度区域(像素丢弃率75%)
在最边缘部分,低密度区域的已知像素较少。我们用两个相邻像素的线性插值重构每个丢弃的像素。
- A = P * 0.667 + Q * 0.333
- B = P * 0.667 + T * 0.333
- C = P * 0.667 + S * 0.333
由于我们只有四分之一的有效像素,因此重建的保真度水平有限,质量损失和畸变明显。
下面是与预畸变图像的并排比较(左:蒙版,中间:重构,右:原始):
因为低密度区域位于有效像素密度较低的外围部分。这可以减少质量损失,但不会消除所有畸变伪影。下面大致是后畸变图像中的相同的部分,这一部分在畸变后变得更小了:
5.3 粗略质量重建
高保真蒙版重建需要大量的GPU性能,并不是每个后期处理阶段都需要这种精确度。因此,我们同时提供了一种粗略质量的蒙版重建例程。常规重建中的成本是2个或4个纹理拾取,而这种重建方案可以降低至单个纹理拾取。粗略质量重建目前用于Bloom,Depth of Field,Down-sampling,Velocity flattening和Screen-space reflection。
6. 性能
通过在世界渲染过程中丢弃一部分像素,MBFR可以降低GPU像素着色成本。但为了重建丢弃像素,这同时会在后期处理过程中引入额外的成本。
我们在《Robo Recall》的4.65ms场景中进行测试,它可以把整体GPU成本降低到4.25ms(-9%)。具体而言,它将世界渲染(BasePass)的成本从2.51ms降低到2.19ms(-13%);后处理成本从0.47ms增加到0.65ms(+0.18ms)。
由于游戏中的后处理成本相对固定,而且世界渲染是动态进行,对于渲染世界对象较多的场景,我们可以预期GPU性能可以节省10%以上。
当然,整体GPU性能在很大程度上也取决于密度圆的FOV。从MBFR再进一步优化GPU成本的有效方法是,根据每个映射上渲染的内容对其进行配置。我们可以在包含高频对象/纹理的映射中应用更大密度的圆,以此来保持视觉质量(例如在《Robo Recall》中测试的城市映射),并且减小其他映射中密度圆的大小,从而获得最大的性能效益。
6.1 提示
- 与将每像素重构整合至后期处理相比,添加单独重建通道的成本通常更高。
- 尽管可以在深度缓冲区或模板缓冲区中生成蒙版,但使用模板更为理想,因为它不会破坏Hi-Depth。另外,我们可以执行完整的深度通道,并且避免重建深度缓冲区。
- 像素重构的主要瓶颈是纹理拾取。在重构中获取更多的相邻像素(或历史纹理)将为我们带来更好的视觉质量和GPU性能成本。
7. 总结
MBFR不是免费的午餐。它可以减少世界渲染的像素着色成本,但在像素重构时增加了额外的后期处理成本。大多数VR项目都采用使用繁重的后期处理。但对于使用大量后期处理,但世界渲染量小的项目而言,MBFR可能无法带来任何性能方面的效益。
根据内容的风格,MBFR的感知视觉质量可能会有很大不同。在呈现低对比度,低频率内容时,感知质量可能相当不错;但如果内容存在大量高频细节,感知质量则不会太理想。对于对于平衡性能和感知视觉质量而言,根据正在渲染的内容来调整所述密度圆的半径非常有必要。
使用MBFR的预期效果:
- 有效降低世界渲染中的像素着色成本
- 兼容所有D3D11级别硬件。独立于IHV扩展
- 在时间/空间上相对稳定
- 在丢弃50%或更少的像素时,视觉质量良好
- 可以结合现有的AA技术,包括MSAA和TAA
需要注意的事项:
- 在重建丢弃像素时,可能会造成额外的性能成本
- 在当前的GPU架构下,在每个波前剔除一定的像素并不一定是最佳的做法。因此,丢弃50%的像素可能无法提供2倍的性能。
- 丢弃75%的像素时,存在潜在的质量损失
- 对于支持瓦片片上内存的移动GPU而言,这可能不是非常有效。