Lucha Z

Z-fighting, también llamado costura o planefighting, es un fenómeno en la renderización 3D que ocurre cuando dos o más primitivos tienen distancias muy similares a la cámara. Esto les haría tener valores casi iguales o idénticos en el t-buffer, que mantiene un seguimiento de profundidad. Esto significa entonces que cuando se hace un pixel específico, es ambiguo que uno de los dos primitivos se dibujan en ese pixel porque el t-buffer no puede distinguir precisamente cuál está más lejos del otro. Si un píxel estaba inequívocamente más cerca, el más cercano podría ser descartado. Es particularmente frecuente con polígonos coplanares, donde dos caras ocupan esencialmente el mismo espacio, con ninguno frente. Los píxeles afectados se producen con fragmentos de un polígono o del otro arbitrariamente, de manera determinada por la precisión del tampón. También puede variar a medida que la escena o la cámara se cambia, causando que un polígono "gane" la prueba de z, luego otro, y así sucesivamente. El efecto general es la rasterización ruidosa, ruidosa de dos polígonos que "lucha" para colorear los píxeles de la pantalla. Este problema suele ser causado por la precisión subpixel limitada y los errores de punto flotante y punto redondeado fijo.
Cuanto más precisión se utilice en el búfer z, menos probable será que se encuentre una lucha contra z. Pero para los polígonos coplanares, el problema es inevitable a menos que se tomen medidas correctivas.
A medida que aumenta la distancia entre planos cercanos y lejanos, y en particular el plano cercano se selecciona cerca del ojo, mayor es la probabilidad de que se produzcan peleas z entre primitivos. Con grandes entornos virtuales inevitablemente hay un conflicto inherente entre la necesidad de resolver la visibilidad en la distancia y en el primer plano, por ejemplo en un simulador de vuelo espacial, si una galaxia distante se dibuja a escala, el espectador no tendrá la precisión de resolver la visibilidad en cualquier geometría de la cabina en primer plano (aunque incluso una representación numérica presentaría problemas antes de la reproducción con Z). Para mitigar estos problemas, la precisión del tampón de z es ponderada hacia el plano de clip cercano, pero este no es el caso con todos los esquemas de visibilidad y es insuficiente para eliminar todos los problemas de z-fighting.
Mitigación

La lucha Z se puede reducir mediante el uso de un búfer de profundidad de mayor resolución, mediante el almacenamiento en búfer Z en algunos escenarios o simplemente separando más los polígonos. La lucha Z que no se puede eliminar por completo de esta manera a menudo se resuelve mediante el uso de un búfer de plantilla o aplicando un desplazamiento del búfer Z del espacio de pantalla posterior a la transformación a un polígono que no afecta la forma proyectada en la pantalla pero sí afecta el valor del búfer z para eliminar la superposición durante la interpolación y comparación de píxeles. Cuando la lucha z es causada por diferentes rutas de transformación en el hardware para la misma geometría (por ejemplo, en un esquema de renderizado de múltiples pasadas), a veces se puede resolver solicitando que el hardware use una transformación de vértice invariante.
La lucha Z causada por una precisión insuficiente en el buffer de profundidad se puede resolver simplemente reduciendo la distancia visible en el mundo. Esto reduce la distancia entre los planos cercano y lejano y resuelve el problema de precisión. Sin embargo, en determinados entornos virtuales donde la visibilidad a larga distancia es esencial o donde una visibilidad reducida sería increíble, como un simulador espacial o un simulador de vuelo, esto no es posible. En estos casos existen técnicas alternativas. Una de estas técnicas es "simular" la distancia de los objetos alejados del usuario sin cambiar realmente su posición. Por ejemplo, si la distancia de visión máxima segura (más allá de la cual ocurre la lucha z) es de 10 000 unidades, y un objeto a renderizar está a 15 000 unidades de distancia, ese objeto podría renderizarse a 10 000 unidades, pero podría reducirse en proporción a la distancia que se movió. Por lo tanto, un objeto reducido a la mitad parecerá que está dos veces más grande de lo que realmente está. Si esto se hace solo para objetos que ya están cerca o en la distancia máxima de visualización, y los objetos cercanos al usuario se representan normalmente, esta técnica no debería notarse. Otra técnica que se utiliza para reducir o eliminar por completo la lucha Z es cambiar a un búfer Z logarítmico, invirtiendo Z. Esta técnica se ve en el juego Grand Theft Auto V. Debido a la forma en que están codificados, los números de punto flotante tienen mucha más precisión cuando están más cerca de 0. Aquí, invertir Z conduce a una mayor precisión al almacenar la profundidad de objetos muy distantes, lo que reduce en gran medida la lucha contra Z.