Поделиться через


Устранение Z-конфликтов

При перекрытии двух треугольных поверхностей не ясно, какой из них должен быть отрисован на вершине другого. Результат может быть разным для каждого пикселя, что приводит к артефактам, зависящим от точки зрения камеры. Когда камера или сетка перемещаются, эти шаблоны заметно мерцают. Этот артефакт называется Z-конфликтом. Для дополненной реальности и приложений виртуальной реальности проблема усиливается, так как устройства, подключенные к голове, естественно, всегда перемещаются. Чтобы предотвратить дискомфорт средства просмотра, Azure Удаленная отрисовка предлагает функции по устранению рисков z-fighting.

Примечание.

Параметры устранения рисков z-fighting не влияют на отрисовку облака точек.

Режимы устранения 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,01 и далеком самолете на расстоянии 1000 создается эта проблема гораздо раньше, чем наличие близкого самолета в 0,1 и далекой плоскости на расстоянии 20.

Вторая проблема — это признак плохо созданных содержимого. В реальной жизни два объекта не могут находиться в одном месте одновременно. В зависимости от приложения пользователям может потребоваться определить, существуют ли перекрывающиеся поверхности и где они находятся. Например, сцена САПР здания, которая является основой для реального сооружения, не должна содержать физически невозможных пересечений поверхностей. Чтобы обеспечить визуальную проверку, доступен режим выделения, который выделяет потенциальные Z-конфликты с помощью анимированного узора мелкой клетки.

Ограничения

Предлагаемые способы устранения Z-конфликтов не являются гарантированными. Нет никакой гарантии, что она удаляет все z-бои. Кроме того, устранение рисков предпочитает одну поверхность по сравнению с другой. Когда у вас есть поверхности, которые слишком близки друг к другу, "неправильный" поверхность заканчивается сверху. Нередко проблемы возникают при наложении на поверхность текста и других деколей. С включенной функцией устранения рисков z-боевых действий эти сведения могут просто исчезнуть.

Замечания, связанные с быстродействием

  • Включение устранения Z-конфликтов практически не отражается на производительности.
  • Кроме того, включение наложения Z-конфликтов приводит к нетривиальным затратам на производительность, которые зависят от конкретной сцены.

Документация по API

Следующие шаги