导航菜单

解决半透明实时渲染挑战,Oculus用掩模渲染作替代方案

五月亭亭开心巨乳中文字幕

解决半透明的实时渲染挑战,Oculus使用掩模渲染作为替代

渲染半透明材料对于实时应用来说是一个巨大的挑战,特别是因为大多数现有方法对于虚拟现实来说是昂贵的。用于裂谷和裂谷S的Oculus Avatars是半透明的,而传统的半透明方法呈现出渲染挑战。 Oculus软件工程师Ricky Rajani最近分享了该问题的解决方案,并展示了如何使用掩模渲染作为替代方案。以下是盈威网的具体整理:

ba209fe631e04fcb997352a02833fcc1.jpeg

对于材质和几何体,Home 2.0使用群集前向渲染而不是延迟渲染,支持MSAA(多样本抗锯齿),并以较低的带宽成本实现更高的分辨率。使用双通道渲染,原始头像呈现透明。当家庭中的化身没有照明影响时,这可以实现高质量的解决方案。为了获得更高的视觉质量,Home具有照明效果,因此在使用半透明渲染时会出现性能和质量挑战。然后Oculus切换到渲染蒙版Avatars(Home),允许您以二进制模式控制对象的可见性。此方法适用于MSAA,但没有MSAA,掩码渲染中的工件可能非常明显。

a523e84ec8ea4a8cad08ac139e1b5abe.jpeg

从左到右:MSAA的4倍;没有MSAA的掩码渲染;没有MSAA的半透明;透明4次MSAA

1.透明VS半透明

01d752aec0b44b51ac14828cf9e5e128.jpeg

在本文中,“半透明”指定透明对象的呈现方法与虚幻引擎术语一致。虚幻引擎使用“半透明”来描述透明对象的材质。例如,当您为透明对象的材质选择“混合模式”和“照明模式”时,我们必须分别选择“半透明”和“表面半透明卷”选项。

8c3005879845431f85d164786983fb35.jpeg

因为这两个术语之间可能存在混淆,所以有必要定义“半透明”并详细说明为什么我们决定选择这个而不是另一个。透明材料和半透明材料之间的主要区别在于它影响通过的光量的物理性质。透明材料允许光完全通过,而透明物体另一侧的物体清晰可见而没有变形。半透明材料允许光进入然后根据材料的物理性质散射。它允许一定量的光通过,同时扭曲和漫射光路以及它们后面的物体。

2.半透明渲染

在为Avatars(Home)实现半透明渲染时,Oculus会优先考虑性能并最大限度地减少视觉伪像。与深度,照明和MSAA相关的挑战如下所述。

2.1深度问题

ac21a7322c3442eeb20528d5885db2eb.jpeg

具有半透明渲染的头像(Home)通过Alpha Blending实现。上图是此实现的深度问题的示例:左侧未按正确的深度排序;右侧是正确的深度排序。为了获得正确的结果,物体必须从后向前混合而不能互换。因此,必须对三角形进行分类,这对于特定的边缘情况来说是昂贵且不足的。表面混合的顺序会影响每个表面的整体可见度。我们可以使用与顺序无关的透明度,允许按像素进行几何排序,但这是一种相当昂贵的技术,不适合VR。

Oculus通过虚幻引擎的自定义深度解决了排序问题。此功能提供与Z-Buffer类似的遮挡,同时实现正确的半透明排序顺序。自定义深度主要使用第二个深度缓冲区,可用于半透明效果,如自定义剔除。对于Avatars,Oculus使用自定义深度进行深度逐像素遮挡。

将网格渲染到此深度缓冲区时,可以剔除网格外壳后面的像素。按如下方式运行两个通道:

使用DepthTest渲染自定义深度以获得最接近的深度。在半透明通道中读取自定义深度。渲染基于像素深度和自定义深度之间的深度比较来执行掩模的半透明度。

您可以通过将半透明材质中的复选框设置为“写入自定义深度”并启用静态网格和骨架网格物体的“渲染自定义深度”复选框,在虚幻引擎中设置此双通道。方法。然后像素着色器读入自定义深度缓冲区,所有这些都不会增加像素着色器的成本。

b8eee6708bfa4aa09f13984a8e41a022.jpeg

图像的左侧描绘了渲染到自定义深度缓冲区的渲染效果,右侧是半透明通道完成后生成的场景。 “头像”是左侧唯一的对象,因为它是场景渲染到“自定义深度”中的唯一网格。 Avatar(Home)使用与自定义深度缓冲区相同的分辨率和MSAA采样以及生成的纹理。

除了比较场景深度和自定义深度之外,为了防止过多的像素被移除,我们还应该添加一定的深度偏差,包括壳体材质。下图显示了添加深度偏差的效果。

f28c704521754c799e753ce010084e34.jpeg

2.2照明

当前的Avatars(Home)允许光线影响其外观,因此解决阴影接收问题(即环境屏蔽材料)非常重要。出于质量原因,Oculus希望Avatars(Home)拥有此房产。但是,虚幻引擎中的前向渲染不支持半透明材质的阴影接收。出于性能原因,虚幻引擎将近似半透明材质的阴影,这不适用于Oculus的延迟阴影函数。

对于虚幻引擎的半透明照明音量功能,它不支持透明材质来接收来自固定源的动态阴影。此外,此功能还会因额外的通道而增加GPU性能成本。另一种接收阴影的方法是使用体积光照贴图。当与固定光源一起使用时,它们为动态物体提供更高质量的烘烤阴影。 Oculus设法使用此功能为每个对象添加阴影。因此,烘焙信息将随着时间逐渐消失,但它仅适用于静态几何形状并且需要固定的光源。

要为半透明材质添加动态阴影,我们可以使用以下方法之一(但增加额外的性能成本):

将单个光线投影到源以估计单个阴影值。对于柔和阴影,可以使用多个光线投射来进一步改进。添加更多CPU光线投射以创建详细的阴影纹理蒙版。这仍然只会产生低分辨率阴影。启用半透明照明音量以匹配前向渲染,以提供更高质量的阴影。

2.3 MSAA神器

由于Oculus Home使用群集前向渲染,我们可以使用MSAA来改善边缘的视觉质量。但是,使用半透明渲染时,某些对象边缘会出现问题。这可能导致附近和背景内容的工件溢出到场景中。由于深度误差,半透明材料的陡峭角度周围的不透明场景通常在边缘周围溢出。

Oculus的解决方案减少了“溢出”伪影,包括增加多个深度偏差以确保最小化深度误差,尤其是对于MSAA。这在深度拒绝期间在确定像素的不透明度时完成,而不添加深度偏差,许多段被拒绝。

下图显示了深度抑制期间添加的不同深度偏差水平。第一个图描绘了较小的恒定偏差的深度比较,而没有考虑边缘周围的变化陡度水平。第二个图描绘了与较大的恒定深度偏差的深度比较。第三幅图描绘了具有恒定深度偏差和梯度深度偏差的深度比较。

edc15fb335514c5bb61333fa2a4fd0aa.jpeg

以下总结了场景深度和自定义深度的比较。

使用场景的深度(图像中的像素深度),我们通过计算ddx和ddy并选择两者的最大值来计算最接近的深度。将该值乘以预定的“DepthBias_Gradient”值,该值考虑了边缘周围角度的陡度。乘法值被钳位并与预定的“DepthBias_Constant”值进行比较。两者的最大值将添加到场景深度。将新场景深度与“自定义深度”缓冲区中的最小值进行比较。如果没有MSAA,则最小值是存储在缓冲区中的值。但如果有MSAA,我们会比较所有MSAA样本的自定义深度并采用最小值。如果新场景更深,则不透明度设置为0.

d54d41d950d64847a831648f92665421.jpeg

不幸的是,这种方法不能修复由每个对象的排序引起的“溢出”工件,并且存在一些使工件更加可见的不良情况。一个例子是半透明的阿凡达在高动态范围(HDR)源前。 HDR源具有高饱和度值,在运行半透明通道之前未被钳位,因此可能发生“溢出”伪像。因此,在重新映射颜色之前,高颜色值“溢出”到半透明材料,导致伪像变得更加明显。

a0d710ed56594281b0bfaf672ecf5ffd.jpeg

修复“溢出”伪像的一种方法是增加上述两个深度偏差。但是,这可能会导致其他与深度相关的问题。深度偏差类似于其行为中的阴影偏差。阴影偏差可以修复阴影“痤疮”(类似于“溢出”瑕疵),但是太大的阴影偏差也会破坏阴影。类似地,太大的深度偏差会在半透明材料中引起与交叉相关的伪影。

下图描绘了与交叉口相关的伪影,其深度偏差增加,从而导致更多伪影。

9e17b6b735f84bfca8d366fdef7b8a06.jpeg

注意:左上角图像是一个掩模渲染,没有与交叉相关的工件。右上角图像是半透明渲染,深度偏差恒定为-0.2。左下图像是半透明渲染,深度偏差恒定为-0.5;右下图像是半透明渲染,深度偏差恒定为-1.0。随着恒定深度偏差的增加,与交叉点相关的深度问题更加突出。

为了获得最佳结果,有必要在最小化“溢出”伪像和互相关伪像之间找到合理的平衡,并且我们发现添加深度偏差是一种很好的方法。

3.蒙版渲染

Home目前为头像使用蒙版渲染。掩模材料的视觉质量取决于MSAA级别和抖动模式的组合。 Oculus使用蓝色早期抖动模式来避免有序的抖动外观。

d0182b5a73f2451e8bfcdfc418790a07.jpeg

尽管Home对材质和几何体使用了簇前向渲染,但后期阴影仍然用于不透明渲染和蒙版渲染。通过运行Early Z通道计算延迟阴影,稍后将使用深度创建Base通道中使用的阴影掩模。换句话说,延迟阴影在屏幕空间中计算,并由基本通道中的所有非半透明对象读取。

下图描绘了在Eatly Z通道中渲染的内容,包括Avarars渲染以及稍后在Base通道中渲染的内容。

211a1df6e645427bbfecb4fc0908df3c.jpeg

最终,阴影接收确保了掩模渲染,因为掩模材料的不透明部分尊重照明。对象的排序也是正确的,因此我们不需要使用第二个深度缓冲区。

掩模渲染不会显示与半透明渲染相同的MSAA伪像,半透明渲染使用alpha-to-coverage,即“将像素着色器输出的alpha值映射到MSAA的覆盖蒙版”。结合MSAA和alpha-to-coverage,将需要对大量的子采样进行平均,从而提高视觉质量。在掩模渲染的深度比较期间也不需要深度偏差。下图比较了蒙版渲染和半透明渲染。左侧是遮罩渲染,右侧是半透明渲染。如您所见,MSAA的“溢出”工件显示在右侧。

cbfaaa0980334c24846c97fc2a415e23.jpeg

掩模渲染解决了与半透明材质相关的许多问题,包括允许在虚幻引擎中确定性遮挡和延迟阴影的能力。

4.表现

下面的表现数据来自Avatar查看Avatar Editor Mirror。手动设置场景,这会增加一些人为错误。例如,在设置期间不计算阿凡达和镜子之间的距离。因此,每个场景可能有更多或更少的半透明/掩模像素。这是使用Medium Graphics设置进行分析的,该设置对应于虚幻引擎的高可伸缩性设置,该设置使用4次MSAA。

644f86c792784941a26cb85ef76a20f4.jpeg

两个渲染通道的CPU性能类似,因为半透明渲染每帧需要大约750个绘制调用,而掩模渲染每帧需要720个绘制调用。通过测量渲染遮罩阿凡达和半透明阿凡达的相关通道,我们可以评估GPU性能。数据显示,与掩模渲染相比,半透明渲染将每帧的GPU时间增加了近80%。

c7f5637cc22d4044b02fc79a495737a9.jpeg

掩码渲染运行Early Z通道,然后在Base通道中渲染它。半透明渲染会跳过Early Z通道并在Base通道之后运行Custom Depth通道。然后在半透明通道中渲染。半透明渲染需要Resolve Scene Depth通道,在提交给OVR时将自定义深度解析为最终Z.

5.总结

上表是半透明渲染和蒙版渲染之间的关键区别。由于MSAA的视觉效果,性能成本增加以及半透明渲染缺少阴影接收,Home on Rift仅对Oculus Avatars使用蒙版渲染。

,看到更多