La lucha Z , también llamada costura o lucha de aviones , es un fenómeno en el renderizado 3D que ocurre cuando dos o más primitivas tienen distancias muy similares a la cámara. Esto haría que tuvieran valores casi similares o idénticos en el búfer z , que realiza un seguimiento de la profundidad. Esto significa que cuando se está renderizando un píxel específico, es casi aleatorio 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 del otro. [1] Si un píxel estaba claramente más cerca, el menos cercano podría descartarse. Es particularmente frecuente con coplanarpolígonos, donde dos caras ocupan esencialmente el mismo espacio, sin ninguna al frente. Los píxeles afectados se representan con fragmentos de un polígono u otro de forma arbitraria, de una manera determinada por la precisión del z-buffer. También puede variar a medida que se cambia la escena o la cámara, lo que hace que un polígono "gane" la prueba z, luego otro, y así sucesivamente. El efecto general es una rasterización ruidosa y parpadeante de dos polígonos que "luchan" por colorear los píxeles de la pantalla. Este problema suele ser causado por una precisión de subpíxeles limitada y errores de redondeo de punto flotante y punto fijo .
Cuanta más precisión de búfer z se use, menos probable es que se encuentren combates 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 los planos de recorte cercanos y lejanos , y en particular el plano cercano se selecciona cerca del ojo, mayor es la probabilidad de que se produzca una lucha z entre primitivas. Con grandes entornos virtuales, inevitablemente existe un conflicto inherente entre la necesidad de resolver la visibilidad en la distancia y en primer plano, por lo que por ejemplo en un simulador de vuelo espacial, si dibujas una galaxia distante a escala, no tendrás la precisión para resolver visibilidad en cualquier geometría de la cabina en primer plano (aunque incluso una representación numérica presentaría problemas antes de la representación con búfer z). Para mitigar estos problemas, la precisión del búfer z se pondera hacia el plano de recorte cercano, pero este no es el caso con todos los esquemas de visibilidad y es insuficiente para eliminar todos los problemas de lucha z.
Mitigación
La lucha contra 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 los polígonos. [2] 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 de búfer z de espacio de pantalla posterior a la transformación a un polígono que no afecta la forma proyectada en la pantalla pero 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 contra Z causada 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 resuelve el problema de precisión. Sin embargo, en ciertos entornos virtuales, como un simulador espacial o un simulador de vuelo, esto no es posible. Existen técnicas alternativas en estos casos. Una de estas técnicas es "simular" la distancia de los objetos lejos del usuario sin cambiar realmente su posición. Por ejemplo, si la distancia máxima de visión 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 en su lugar ser renderizado a 10,000 unidades, pero podría reducirse en proporción a la distancia que se movió. Por lo tanto, un objeto que se ha reducido a la mitad se verá como si estuviera dos veces más lejos de lo que realmente está. Si esto se hace solo para objetos que ya están cerca o en la distancia máxima de visió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 Z-lucha completamente está cambiando a un Z-buffer logarítmica, 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. [3]
Referencias
- ^ "LearnOpenGL - pruebas de profundidad" . Learnopengl.com . Consultado el 1 de julio de 2021 .
- ^ "Precisión del búfer de profundidad - Wiki OpenGL" . www.khronos.org . Consultado el 30 de junio de 2021 .
- ^ Courrèges, Adrian (2 de noviembre de 2015). "GTA V - Estudio de gráficos" . AdrianCourreges.com . Consultado el 20 de junio de 2018 .