
El z-fighting , también llamado stitching o planefighting , es un fenómeno en la renderización 3D que ocurre cuando dos o más primitivas tienen una distancia muy similar a la cámara. Esto hace que tengan valores casi similares o idénticos en el búfer z , que registra la profundidad. Esto significa que cuando se renderiza un píxel específico, es ambiguo cuál de las dos primitivas se dibuja en ese píxel porque el búfer z no puede distinguir con precisión cuál está más lejos de la otra. [ 1 ] Si un píxel estuviera claramente más cerca, el menos cercano podría descartarse. Es particularmente frecuente con polígonos coplanares , donde dos caras ocupan esencialmente el mismo espacio, sin que ninguna esté delante. Como resultado, los píxeles afectados se renderizan con fragmentos de un polígono u otro arbitrariamente, de una manera determinada por la precisión del búfer z. También puede variar al cambiar la escena o la cámara, haciendo que un polígono "gane" la prueba z, luego otro, y así sucesivamente. El efecto general es una rasterización parpadeante y ruidosa de dos polígonos que "luchan" por colorear los píxeles de la pantalla. Este problema suele deberse a una precisión subpíxel limitada y a errores de redondeo de punto flotante y punto fijo .
Cuanto mayor sea la precisión del búfer Z, menor será la probabilidad de que se produzca el problema de superposición de polígonos (z-fighting). Sin embargo, en el caso de polígonos coplanares, este problema es inevitable a menos que se tomen medidas correctivas.
A medida que aumenta la distancia entre los planos de recorte cercano y lejano , y en particular cuando el plano cercano se selecciona cerca del ojo, mayor es la probabilidad de que se produzca un conflicto de superposición de polígonos (z-fighting) entre las primitivas. En entornos virtuales grandes, inevitablemente existe un conflicto inherente entre la necesidad de resolver la visibilidad en la distancia y en 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 suficiente para resolver la visibilidad de la geometría de la cabina en primer plano (aunque incluso una representación numérica presentaría problemas antes del renderizado con búfer de polígonos). Para mitigar estos problemas, la precisión del búfer de polígonos se pondera hacia el plano de recorte cercano, pero esto no ocurre con todos los esquemas de visibilidad y es insuficiente para eliminar todos los problemas de superposición de polígonos.
Mitigación

El z-fighting se puede reducir mediante el uso de un búfer de profundidad de mayor resolución , mediante el z-buffering en algunos escenarios, o simplemente moviendo los polígonos más separados. [ 2 ] El z-fighting 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 de z-buffer en el espacio de la 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 z-buffer para eliminar la superposición durante la interpolación y comparación de píxeles. Cuando el z-fighting es causado 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.
El problema de superposición de polígonos (z-fighting) causado por una precisión insuficiente en el búfer de profundidad se puede resolver simplemente reduciendo la distancia visible en el mundo. Esto reduce la distancia entre los planos cercano y lejano y soluciona el problema de precisión. Sin embargo, en ciertos entornos virtuales donde la visibilidad a larga distancia es esencial o donde una visibilidad reducida sería inverosímil, como un simulador espacial o un simulador de vuelo, esto no es posible. En estos casos, existen técnicas alternativas. Una de ellas consiste en "simular" la distancia de los objetos alejados del usuario sin cambiar su posición. Por ejemplo, si la distancia máxima de visualización segura (más allá de la cual se produce la superposición de polígonos) es de 10 000 unidades, y un objeto a renderizar se encuentra a 15 000 unidades de distancia, dicho objeto podría renderizarse a 10 000 unidades, pero escalándose proporcionalmente a la distancia que se movió. Así, un objeto que se ha escalado a la mitad parecerá estar al doble de distancia 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 renderizan normalmente, esta técnica no debería ser perceptible. Otra técnica que se utiliza para reducir o eliminar por completo el Z-fighting es cambiar a un búfer Z logarítmico, invirtiendo Z. Esta técnica se observa en el juego Grand Theft Auto V. Debido a la forma en que se codifican, 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, reduciendo así en gran medida el Z-fighting. [ 3 ]
Referencias
- ↑ "LearnOpenGL - Pruebas en profundidad" . learnopengl.com . Consultado el 1 de julio de 2021 .
- ↑ "Precisión del búfer de profundidad - Wiki de OpenGL" . www.khronos.org . Consultado el 30 de junio de 2021 .
- ↑ Courrèges, Adrian (2 de noviembre de 2015). "GTA V - Estudio gráfico" . AdrianCourreges.com . Consultado el 20 de junio de 2018 .
- Artefactos gráficos 3D
- Renderizado 3D