Interferencia entre texturas

De Wikipedia, la enciclopedia libre
Demostración de interferencia entre texturas de distintos colores sobre un fondo gris.

La interferencia entre texturas, también llamada lucha Z (por su nombre en inglés, Z-fighting) o lucha de planos, es un fenómeno del renderizado 3D que se produce cuando dos o más primitivas tienen distancias muy similares a la cámara. En consecuencia, sus valores son similares o idénticos en el búfer z, que indica la profundad de los elementos. Esto significa que al renderizar un píxel específico, es prácticamente aleatorio cuál de las dos primitivas se mostrará en ese píxel, porque el búfer z no puede distinguir con precisión cuál está más cerca y cuál más lejos. Es particularmente frecuente en polígonos coplanares, 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 arbitrariamente, según determine la precisión del búfer z. También puede variar a medida que se mueve la escena o la cámara, lo que hace que un polígono «gane» la lucha Z, luego el 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 que se muestran en pantalla. Este problema suele ser causa de una precisión limitada de subpíxeles y errores de redondeo de comas flotantes y fijas .

Cuanta más precisión del búfer Z se use, menos probable es que se encuentren interferencias entre texturas en el eje Z. Pero en 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 interferencia entre primitivas. En grandes entornos virtuales, es inevitable que se produzca un conflicto inherente entre la necesidad de resolver la visibilidad a cierta distancia y en un primer plano. Por ejemplo, en un simulador de vuelo espacial, si dibujas una galaxia con distancias a escala, será imposible tener la precisión necesaria para resolver la visibilidad de todas las figuras geométricas del entorno (aunque incluso una representación numérica presentaría problemas antes de la renderización del búfer Z). Para mitigar estos problemas, la precisión del búfer Z se pondera hacia el plano de recorte más cercano, pero esto no sucede en todos los esquemas de visibilidad y es insuficiente para eliminar todos los problemas de interferencias entre texturas.

Mitigación[editar]

Interferencia entre dos polígonos coplanares.

La lucha Z se puede reducir mediante el uso de un búfer de profundidad con mayor resolución, mediante el almacenamiento en el búfer Z en algunos escenarios, o simplemente separando los polígonos. En ocasiones, dicha interferencia se debe a las distintas rutas de transformación que se producen para la misma forma geométrica, esto se puede solucionar solicitando que el hardware use una transformación de vértice invariante.

La interferencia causada por falta de precisión en el búfer de profundidad se puede resolver simplemente reduciendo la distancia visible del mundo. Esto reduce la distancia entre los planos cercanos y lejanos 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 para estos casos. Una de estas técnicas consiste en «simular» la distancia de los objetos que se encuentran alejados 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 se produce la interferencia) es de 10 000 unidades y un objeto a renderizar está a 15 000 unidades de distancia, ese objeto podría en su lugar renderizarse a 10 000 unidades, pero podría reducirse en proporción a la distancia que se ha movido. 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 con los objetos que ya están cerca o a 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 completamente la interferencia o lucha Z es cambiar a un búfer Z logarítmico, invirtiendo el eje Z. Esta técnica se emplea en Grand Theft Auto V. Debido a la forma en la 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 el eje Z brinda a una mayor precisión al almacenar la profundidad de objetos muy distantes, por lo que se reduce en gran medida la interferencia de lucha Z.[1]

Referencias[editar]

  1. Courrèges, Adrian (2 de noviembre de 2015). «GTA V - Graphics Study». AdrianCourreges.com. Consultado el 20 de junio de 2018.