你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Z 冲突缓解

当两个三角曲面重叠时,不好确定哪个曲面应当渲染在另一个曲面顶部。 结果甚至因像素而异,因此会产生与相机视图相关的伪影。 当相机或网格移动时,这些模式会明显闪烁。 这种现象称为 z 冲突。 对于增强现实和虚拟现实应用程序,此问题进一步加剧,因为头戴式设备总是自然而然地移动。 为了防止观看者出现不适,Azure 远程渲染提供了 z 冲突缓解功能。

注意

Z 冲突缓解设置不会对点云渲染产生任何影响。

z 冲突缓解模式

场景 结果
常规 z 冲突 Screenshot shows no deterministic precedence between red and green quads.
已启用 Z 冲突缓解 Screenshot displays the red quad precedence with a solid red rectangle.
已启用棋盘格突出显示 Screenshot shows red and green quad toggle preference with a checkerboard pattern rectangle.

以下代码启用 z 冲突缓解:

void EnableZFightingMitigation(RenderingSession session, bool highlight)
{
    ZFightingMitigationSettings settings = session.Connection.ZFightingMitigationSettings;

    // enabling z-fighting mitigation
    settings.Enabled = true;

    // enabling checkerboard highlighting of z-fighting potential
    settings.Highlighting = highlight;
}
void EnableZFightingMitigation(ApiHandle<RenderingSession> session, bool highlight)
{
    ApiHandle<ZFightingMitigationSettings> settings = session->Connection()->GetZFightingMitigationSettings();

    // enabling z-fighting mitigation
    settings->SetEnabled(true);

    // enabling checkerboard highlighting of z-fighting potential
    settings->SetHighlighting(highlight);
}

注意

Z 冲突缓解是一个全局设置,会影响渲染的所有网格。

Z 冲突的原因

有两个主要原因导致发生 Z 冲突:

  • 当曲面与相机之间的距离很远时,其深度值的精度会下降,并且值会变得不可辨别
  • 当网格中的曲面在物理上重叠时

第一个问题始终会发生,且难以消除。 如果你的应用程序中出现这种情况,请确保近端平面距离与远端平面距离的比率尽可能低。 例如,与近端平面位于距离 0.1 处且远端平面位于距离 20 处的情况相比,近端平面位于距离 0.01 处且远端平面位于距离 1000 处的情况会更早地造成此问题。

第二个问题表明创作的内容不好。 在现实世界中,两个对象不能同时位于同一位置。 根据具体的应用程序,用户可能想要知道是否存在重叠的曲面以及这些曲面的位置。 例如,用作实际建筑基础的建筑物 CAD 场景不应包含实际上不可能出现的曲面相交。 若要进行视觉检查,可以使用突出显示模式,该模式会将潜在的 z 冲突显示为动画棋盘格图案。

限制

提供的 z 冲突缓解措施采用“尽力而为”的原则。 无法保证消除所有 z 冲突。 此外,缓解措施会优先照顾两个曲面中的一个。 如果曲面相互过于靠近,“错误的”曲面最终会出现在顶部。 将文本和其他贴花图案应用于曲面时,经常发生此问题。 启用 z 冲突缓解后,这些细节很容易消失。

性能注意事项

  • 启用 z 冲突缓解几乎不会产生任何性能开销。
  • 此外,启用 z 冲突覆盖会产生相当高的性能开销,不过,具体的开销因场景而异。

API 文档

后续步骤