Введение

Проблема рендеринга в 3D-моделировании

Z-борьба, также называемая перекрытием или конфликтом плоскостей, — это явление в 3D-рендеринге, возникающее, когда два или более примитива находятся на очень близком расстоянии от камеры. Это приводит к тому, что они имеют почти одинаковые или идентичные значения в Z-буфере, который отслеживает глубину. В результате, при рендеринге конкретного пикселя становится неоднозначно, какой из двух примитивов должен быть отрисован, поскольку Z-буфер не может точно определить, какой из них находится дальше. Если бы один пиксель был однозначно ближе, менее близкий пиксель можно было бы отбросить. Особенно часто это происходит с копланарными полигонами, когда две грани занимают практически одно и то же пространство, и ни одна из них не находится перед другой. Пораженные пиксели отрисовываются фрагментами из одного или другого полигона случайным образом, в зависимости от точности Z-буфера. Это также может меняться при изменении сцены или камеры, когда один полигон "выигрывает" Z-тест, затем другой, и так далее. Общий эффект — мерцающая, зашумленная растризация двух полигонов, которые "борются" за цвет пикселей экрана. Эта проблема обычно вызвана ограниченной точностью субпикселей и ошибками округления чисел с плавающей и фиксированной точкой. Чем выше точность Z-буфера, тем меньше вероятность возникновения Z-борьбы. Однако для копланарных полигонов проблема неизбежна, если не предпринять корректирующие меры. По мере увеличения расстояния между ближней и дальней плоскостями отсечения, и особенно если ближняя плоскость расположена близко к глазу, возрастает вероятность Z-борьбы между примитивами. В больших виртуальных средах неизбежно возникает внутренний конфликт между необходимостью обеспечить видимость как на дальних, так и на ближних планах. Например, в симуляторе космических полетов, если удаленная галактика отрисована в масштабе, у зрителя не будет достаточной точности для определения видимости геометрии кабины на переднем плане (хотя даже численное представление может вызвать проблемы до рендеринга с использованием Z-буфера). Для смягчения этих проблем точность Z-буфера смещается в сторону ближней плоскости отсечения, но это не относится ко всем схемам видимости и недостаточно для устранения всех проблем, связанных с Z-борьбой.

Смягчение

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