Z-файтинг - Z-fighting

Демонстрация z-файтинга с несколькими цветами и текстурами на сером фоне

Z-файтинг, также называемый сшивание, это явление в 3D рендеринг что происходит, когда два или более примитивы иметь очень похожие расстояния до камеры. Это приведет к тому, что они будут иметь почти одинаковые или идентичные значения в z-буфер, который отслеживает глубину. Тогда это означает, что при визуализации определенного пикселя почти случайно, какой из двух примитивов будет отрисован в этом пикселе, потому что z-буфер не может точно отличить, какой из них находится дальше от другого. Традиционно более дальний пиксель отбрасывается. Это особенно распространено с копланарный многоугольники, где две грани занимают по существу одинаковое пространство, ни одна из которых не находится спереди. Затронутые пиксели отображаются с фрагменты из одного или другого многоугольника произвольно, способом, определяемым точностью z-буфера. Он также может меняться при изменении сцены или камеры, в результате чего один многоугольник «выигрывает» тест z, затем другой и так далее. Общий эффект представляет собой мерцающую шумную растеризацию двух полигонов, которые «борются» за окраску пикселей экрана. Эта проблема обычно вызвана ограниченной точностью субпикселей и плавающая точка и фиксированная точка ошибки округления.

Чем выше точность z-буфера, тем меньше вероятность столкновения с z-файтингом. Но для копланарных многоугольников проблема неизбежна, если не будут приняты корректирующие меры.

Как расстояние между ближние и дальние плоскости отсечения увеличивается и, в частности, выбирается ближняя плоскость около глаза, тем больше вероятность того, что между примитивами произойдет z-борьба. В больших виртуальных средах неизбежно возникает конфликт между необходимостью разрешения видимости на расстоянии и на переднем плане, поэтому, например, в симуляторе космического полета, если вы нарисуете далекую галактику в масштабе, у вас не будет точности для разрешения видимости на любой геометрии кабины на переднем плане (хотя даже числовое представление вызовет проблемы до рендеринга с z-буфером). Чтобы смягчить эти проблемы, точность z-буфера взвешивается по отношению к плоскости ближнего отсечения, но это не относится ко всем схемам видимости, и этого недостаточно для устранения всех проблем z-борьбы.

Смягчение

Эффект виден на двух копланарных многоугольниках.

Z-бои можно уменьшить за счет использования более высокого разрешения буфер глубины, к z-буферизация в некоторых сценариях или просто раздвинув полигоны дальше друг от друга. Z-бои, которые не могут быть полностью устранены таким образом, часто разрешаются использованием трафаретный буфер или путем применения смещения z-буфера пространства экрана после преобразования к одному многоугольнику, которое не влияет на проецируемую форму на экране, но влияет на значение z-буфера, чтобы исключить перекрытие во время интерполяции и сравнения пикселей. Если z-борьба вызвана разными путями преобразования в оборудовании для одной и той же геометрии (например, в схеме многопроходного рендеринга), его иногда можно решить, запросив, чтобы оборудование использовало инвариантное преобразование вершин.

Z-бои, вызванные недостаточной точностью в буфере глубины, можно решить, просто уменьшив видимое расстояние в мире. Это уменьшает расстояние между ближней и дальней плоскостями и решает проблему точности. Однако в некоторых виртуальных средах, таких как космический симулятор или симулятор полета, это невозможно. В этих случаях существуют альтернативные методы. Один из этих методов - «имитировать» расстояние до объектов, находящихся далеко от пользователя, без фактического изменения их положения. Например, если максимальное безопасное расстояние обзора (за которым происходит z-борьба) составляет 10 000 единиц, а объект для рендеринга находится на расстоянии 15 000 единиц, этот объект может вместо этого отображаться на 10 000 единиц, но его можно уменьшать пропорционально расстояние, на которое он был перемещен. Таким образом, объект, который был уменьшен вдвое, будет выглядеть так, как будто он вдвое больше, чем на самом деле. Если это делается только для объектов, которые уже находятся близко к максимальному расстоянию просмотра или находятся на нем, а объекты, расположенные близко к пользователю, отображаются нормально, этот метод не должен быть заметен. Другой метод, который используется для уменьшения или полного устранения Z-боя, - это переключение на логарифмический Z-буфер, обращающий Z. Этот метод показан в игре. Grand Theft Auto V. Благодаря способу кодирования, числа с плавающей запятой имеют гораздо большую точность, когда они ближе к 0. Здесь реверсирование Z приводит к большей точности при сохранении глубины очень удаленных объектов, что значительно снижает Z-борьбу.[1]

Рекомендации

  1. ^ Курреж, Адриан (2 ноября 2015 г.). «GTA V - Графика». AdrianCourreges.com. Получено 20 июн 2018.