Устранение Z-конфликтов
При перекрытии двух треугольных поверхностей не ясно, какой из них должен быть отрисован на вершине другого. Результат может быть разным для каждого пикселя, что приводит к артефактам, зависящим от точки зрения камеры. Когда камера или сетка перемещаются, эти шаблоны заметно мерцают. Этот артефакт называется Z-конфликтом. Для дополненной реальности и приложений виртуальной реальности проблема усиливается, так как устройства, подключенные к голове, естественно, всегда перемещаются. Чтобы предотвратить дискомфорт средства просмотра, Azure Удаленная отрисовка предлагает функции по устранению рисков z-fighting.
Примечание.
Параметры устранения рисков z-fighting не влияют на отрисовку облака точек.
Режимы устранения Z-конфликтов
Ситуация | Результат |
---|---|
Обычный Z-конфликт | |
Устранение Z-конфликтов включено | |
Выделение мелкой клеткой включено |
Приведенный ниже код включает устранение 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
- Свойство C# RenderingConnection.ZFightingMitigationSettings
- C++ RenderingConnection::ZFightingMitigationSettings()