Z-бои
Эта статья нуждается в дополнительных цитатах для проверки . ( сентябрь 2017 г. ) |
Z-fighting , также называемый сшивкой или planefighting , — это явление в 3D-рендеринге , которое возникает, когда два или более примитивов находятся на очень одинаковом расстоянии от камеры. Это приведет к тому, что они будут иметь почти одинаковые или идентичные значения в z-буфере , который отслеживает глубину. Это означает, что при рендеринге определенного пикселя неясно, какой из двух примитивов отрисовывается в этом пикселе, поскольку z-буфер не может точно определить, какой из двух примитивов находится дальше от другого. [1] Если один пиксель был однозначно ближе, то менее близкий можно было отбросить. Это особенно распространено в копланарных многоугольниках, где две грани занимают практически одно и то же пространство, ни одна из которых не находится спереди. В результате затронутые пиксели визуализируются фрагментами одного или другого полигона произвольно, в порядке, определяемом точностью z-буфера. Оно также может меняться при изменении сцены или камеры, в результате чего один полигон «выигрывает» z-тест, затем другой и так далее. Общий эффект — мерцающая шумная растеризация двух полигонов, которые «борются» за цвет пикселей экрана. Эта проблема обычно вызвана ограниченной субпиксельной точностью, с плавающей запятой и фиксированной запятой ошибками округления .
Чем выше точность z-буфера, тем меньше вероятность возникновения z-борьбы. Но для копланарных многоугольников проблема неизбежна, если не принять корректирующие меры.
По мере увеличения расстояния между ближней и дальней плоскостями отсечения и, в частности, ближней плоскости выбирается рядом с глазом, тем больше вероятность того, что между примитивами произойдет z-борьба. В больших виртуальных средах неизбежно возникает конфликт между необходимостью обеспечить видимость на расстоянии и на переднем плане, поэтому, например, в симуляторе космического полета, если далекая галактика нарисована в масштабе, у зрителя не будет достаточной точности, чтобы разрешить видимость любой геометрии кабины на переднем плане (хотя даже числовое представление может вызвать проблемы до рендеринга с z-буферизацией). Чтобы смягчить эти проблемы, точность z-буфера смещена в сторону ближней плоскости отсечения, но это не относится ко всем схемам видимости, и этого недостаточно для устранения всех проблем z-борьбы.
смягчение последствий
[ редактировать ]Z-борьбу можно уменьшить за счет использования буфера глубины с более высоким разрешением , Z-буферизации в некоторых сценариях или простого перемещения полигонов дальше друг от друга. [2] Z-борьба, которую невозможно полностью устранить таким способом, часто разрешается с помощью трафаретного буфера или путем применения смещения z-буфера экранного пространства после преобразования к одному многоугольнику, которое не влияет на проецируемую форму на экране, но влияет значение z-буфера для устранения перекрытия во время интерполяции и сравнения пикселей. Если z-борьба вызвана разными путями преобразования в оборудовании для одной и той же геометрии (например, в схеме многопроходного рендеринга), иногда ее можно устранить, запросив у оборудования использование инвариантного преобразования вершин.
Z-борьбу, вызванную недостаточной точностью буфера глубины, можно решить, просто уменьшив видимое расстояние в мире. Это уменьшает расстояние между ближней и дальней плоскостями и решает проблему точности. Однако в некоторых виртуальных средах, где важна видимость на большом расстоянии или где снижение видимости было бы невероятным, например, в космическом симуляторе или симуляторе полета, это невозможно. В таких случаях существуют альтернативные методы. Один из таких методов — «имитировать» расстояние до объектов, находящихся далеко от пользователя, без фактического изменения их положения. Например, если максимальное безопасное расстояние обзора (за пределами которого происходит z-борьба) составляет 10 000 единиц, а объект, подлежащий рендерингу, находится на расстоянии 15 000 единиц, вместо этого этот объект можно визуализировать на расстоянии 10 000 единиц, но его можно уменьшить пропорционально расстояние, на которое он был перемещен. Таким образом, объект, уменьшенный вдвое, будет выглядеть так, как будто он в два раза дальше, чем есть на самом деле. Если это делается только для объектов, которые уже находятся близко или на максимальном расстоянии обзора, а объекты, находящиеся близко к пользователю, визуализируются нормально, этот метод не должен быть заметен. Другой метод, который используется для уменьшения или полного устранения Z-борьбы, - это переключение на логарифмический Z-буфер, обращающий Z. Этот метод можно увидеть в игре. Гранд Крафт Авто V. Из-за способа кодирования числа с плавающей запятой имеют гораздо большую точность, когда они ближе к 0. Здесь обращение Z приводит к большей точности при сохранении глубины очень удаленных объектов, что значительно уменьшает Z-борьбу. [3]
Ссылки
[ редактировать ]- ^ «LearnOpenGL — Глубинное тестирование» . Learnopengl.com . Проверено 1 июля 2021 г.
- ^ «Точность буфера глубины — OpenGL Wiki» . www.khronos.org . Проверено 30 июня 2021 г.
- ^ Курреж, Адриан (2 ноября 2015 г.). «GTA V — Исследование графики» . AdrianCourreges.com . Проверено 20 июня 2018 г.