Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Введение
Проблема рендеринга в 3D-моделировании
Rendering issue in 3D modeling
Z-борьба, также называемая перекрытием или конфликтом плоскостей, — это явление в 3D-рендеринге, возникающее, когда два или более примитива находятся на очень близком расстоянии от камеры. Это приводит к тому, что они имеют почти одинаковые или идентичные значения в Z-буфере, который отслеживает глубину. В результате, при рендеринге конкретного пикселя становится неоднозначно, какой из двух примитивов должен быть отрисован, поскольку Z-буфер не может точно определить, какой из них находится дальше. Если бы один пиксель был однозначно ближе, менее близкий пиксель можно было бы отбросить. Особенно часто это происходит с копланарными полигонами, когда две грани занимают практически одно и то же пространство, и ни одна из них не находится перед другой. Пораженные пиксели отрисовываются фрагментами из одного или другого полигона случайным образом, в зависимости от точности Z-буфера. Это также может меняться при изменении сцены или камеры, когда один полигон "выигрывает" Z-тест, затем другой, и так далее. Общий эффект — мерцающая, зашумленная растризация двух полигонов, которые "борются" за цвет пикселей экрана. Эта проблема обычно вызвана ограниченной точностью субпикселей и ошибками округления чисел с плавающей и фиксированной точкой. Чем выше точность Z-буфера, тем меньше вероятность возникновения Z-борьбы. Однако для копланарных полигонов проблема неизбежна, если не предпринять корректирующие меры. По мере увеличения расстояния между ближней и дальней плоскостями отсечения, и особенно если ближняя плоскость расположена близко к глазу, возрастает вероятность Z-борьбы между примитивами. В больших виртуальных средах неизбежно возникает внутренний конфликт между необходимостью обеспечить видимость как на дальних, так и на ближних планах. Например, в симуляторе космических полетов, если удаленная галактика отрисована в масштабе, у зрителя не будет достаточной точности для определения видимости геометрии кабины на переднем плане (хотя даже численное представление может вызвать проблемы до рендеринга с использованием Z-буфера). Для смягчения этих проблем точность Z-буфера смещается в сторону ближней плоскости отсечения, но это не относится ко всем схемам видимости и недостаточно для устранения всех проблем, связанных с Z-борьбой.
Z fighting, also called stitching or planefighting, is a phenomenon in 3D rendering that occurs when two or more primitives have very similar distances to the camera. This would cause them to have near similar or identical values in the z buffer, which keeps track of depth. This then means that when a specific pixel is being rendered, it is ambiguous which one of the two primitives are drawn in that pixel because the z buffer cannot distinguish precisely which one is farther from the other. If one pixel was unambiguously closer, the less close one could be discarded. It is particularly prevalent with coplanar polygons, where two faces occupy essentially the same space, with neither in front. Affected pixels are rendered with fragments from one polygon or the other arbitrarily, in a manner determined by the precision of the z buffer. It can also vary as the scene or camera is changed, causing one polygon to "win" the z test, then another, and so on. The overall effect is flickering, noisy rasterization of two polygons which "fight" to color the screen pixels. This problem is usually caused by limited sub pixel precision and floating point and fixed point round off errors. The more z buffer precision one uses, the less likely it is that z fighting will be encountered. But for coplanar polygons, the problem is inevitable unless corrective action is taken. As the distance between near and far clip planes increases, and in particular the near plane is selected near the eye, the greater the likelihood exists that z fighting between primitives will occur. With large virtual environments inevitably there is an inherent conflict between the need to resolve visibility in the distance and in the foreground, so for example in a space flight simulator, if a distant galaxy is drawn to scale, the viewer will not have the precision to resolve visibility on any cockpit geometry in the foreground (although even a numerical representation would present problems prior to z buffered rendering). To mitigate these problems, z buffer precision is weighted towards the near clip plane, but this is not the case with all visibility schemes and it is insufficient to eliminate all z fighting issues.
Смягчение
Z-бои можно уменьшить, используя буфер глубины с более высоким разрешением, буферизацию z в некоторых сценариях или просто увеличивая расстояние между полигонами. Z-бои, которые невозможно полностью устранить таким образом, часто решаются с помощью буфера трафарета или путем применения сдвига буфера глубины в экранном пространстве после трансформации к одному из полигонов, что не влияет на проецируемую форму на экране, но изменяет значение буфера глубины, устраняя перекрытие при интерполяции и сравнении пикселей. Если Z-бои вызваны различными путями трансформации в аппаратном обеспечении для одной и той же геометрии (например, в схеме многопроходного рендеринга), их иногда можно решить, запросив у аппаратного обеспечения использование инвариантной трансформации вершин. Z-бои, вызванные недостаточной точностью буфера глубины, можно устранить, просто уменьшив видимое расстояние в мире. Это уменьшает расстояние между ближней и дальней плоскостями и решает проблему точности. Однако в некоторых виртуальных средах, где важна видимость на больших расстояниях или где уменьшение видимости было бы нереалистичным, например, в космическом или авиасимуляторе, это невозможно. В таких случаях существуют альтернативные методы. Один из них – "симуляция" расстояния до удаленных объектов без фактического изменения их положения. Например, если максимальное безопасное расстояние обзора (за пределами которого возникают Z-бои) составляет 10 000 единиц, а объект, который нужно отрисовать, находится на расстоянии 15 000 единиц, этот объект можно отрисовать на расстоянии 10 000 единиц, но уменьшить его масштаб пропорционально пройденному расстоянию. Таким образом, объект, уменьшенный вдвое, будет казаться вдвое дальше, чем он есть на самом деле. Если это делается только для объектов, которые уже находятся близко к максимальному расстоянию обзора, а объекты, находящиеся рядом с пользователем, отрисовываются нормально, эта техника не должна быть заметна. Другой метод, используемый для уменьшения или полного устранения Z-боев, – это переход на логарифмический буфер глубины с инверсией Z. Эта техника использована в игре Grand Theft Auto V. Числа с плавающей запятой, из-за способа их кодирования, обладают гораздо большей точностью при значениях, близких к 0. В данном случае инверсия Z обеспечивает большую точность при хранении глубины очень удаленных объектов, что значительно снижает Z-бои.
Z fighting can be reduced through the use of a higher resolution depth buffer, by z buffering in some scenarios, or by simply moving the polygons further apart. Z fighting which cannot be entirely eliminated in this manner is often resolved by the use of a stencil buffer, or by applying a post transformation screen space z buffer offset to one polygon which does not affect the projected shape on screen but does affect the z buffer value to eliminate the overlap during pixel interpolation and comparison. Where z fighting is caused by different transformation paths in hardware for the same geometry (for example in a multi pass rendering scheme) it can sometimes be resolved by requesting that the hardware use invariant vertex transformation. Z fighting that is caused by insufficient precision in the depth buffer can be resolved by simply reducing the visible distance in the world. This reduces the distance between the near and far planes and solves the precision issue. However, in certain virtual environments where long distance visibility is essential or where reduced visibility would be unbelievable, such as a space simulator or a flight simulator, this is not possible. Alternative techniques exist in these cases. One of these techniques is to "simulate" the distance of objects far from the user without actually changing their position. For example, if the maximum safe view distance (beyond which z fighting occurs) is 10,000 units, and an object to be rendered is 15,000 units away, that object could instead be rendered at 10,000 units but it could be scaled down in proportion to the distance that it was moved. So, an object that has been scaled down by half will look like it is twice as far as it actually is. If this is done only for objects that are already close to, or at, the maximum view distance, and objects close to the user are rendered normally, this technique should not be noticeable. Another technique that is utilized to reduce or completely eliminate Z fighting is switching to a logarithmic Z buffer, reversing Z. This technique is seen in the game Grand Theft Auto V. Due to the way they are encoded, floating point numbers have much more precision when closer to 0. Here, reversing Z leads to more precision when storing the depth of very distant objects, hence greatly reducing Z fighting.