El mapeo de texturas [1] [2] [3] es un método para mapear una textura en un gráfico generado por computadora . "Textura" en este contexto puede ser detalle de alta frecuencia , textura de superficie o color .
La técnica original fue desarrollada por Edwin Catmull en 1974 como parte de su tesis doctoral. [4]
El mapeo de texturas originalmente se refería al mapeo difuso , un método que simplemente mapeaba píxeles de una textura a una superficie 3D ("envolviendo" la imagen alrededor del objeto). En las últimas décadas, la llegada del renderizado multi-pass, multitexturizado , mipmaps y mapeos más complejos como el mapeo de altura , mapeo de relieve , mapeo normal , mapeo de desplazamiento , mapeo de reflexión , mapeo especular , mapeo de oclusión y muchas otras variaciones de la técnica (controladas por un sistema de materiales ) han hecho posible simular un fotorrealismo cercano en tiempo real al reducir enormemente la cantidad de polígonos y cálculos de iluminación necesarios para construir una escena 3D realista y funcional.
AUn mapa de textura [5][6]es una imagen aplicada (mapeada) a la superficie de una forma opolígono.[7]Puede ser unaimagen de mapa de bitso unatextura procedimental. Pueden almacenarse enformatos de archivo de imagen, referenciarse medianteformatos de modelos 3Dodefiniciones de materialesy ensamblarse enpaquetes de recursos.
Pueden tener de una a tres dimensiones, aunque las dos dimensiones son las más comunes para las superficies visibles. Para su uso con hardware moderno, los datos de mapas de textura se pueden almacenar en ordenamientos swizzled o tiled para mejorar la coherencia de la memoria caché . Las API de renderizado normalmente gestionan los recursos de mapas de textura (que pueden estar ubicados en la memoria del dispositivo ) como buffers o superficies, y pueden permitir " renderizar a textura " para efectos adicionales como posprocesamiento o mapeo del entorno .
Por lo general, contienen datos de color RGB (ya sea almacenados como color directo , formatos comprimidos o color indexado ) y, a veces, un canal adicional para la combinación alfa ( RGBA ), especialmente para vallas publicitarias y texturas de superposición de calcomanías . Es posible utilizar el canal alfa (que puede ser conveniente para almacenar en formatos analizados por hardware) para otros usos, como la especularidad .
Se pueden combinar múltiples mapas de textura (o canales ) para controlar la especularidad , las normales , el desplazamiento o la dispersión del subsuelo , por ejemplo, para la representación de la piel.
Se pueden combinar múltiples imágenes de texturas en atlas de texturas o texturas de matriz para reducir los cambios de estado en el hardware moderno. (Pueden considerarse una evolución moderna de los gráficos de mapas de mosaicos ). El hardware moderno suele admitir texturas de mapas cúbicos con múltiples caras para el mapeo del entorno.
Los mapas de textura se pueden adquirir mediante escaneo / fotografía digital , diseñar en software de manipulación de imágenes como GIMP , Photoshop o pintar sobre superficies 3D directamente en una herramienta de pintura 3D como Mudbox o ZBrush .
Este proceso es similar a aplicar papel estampado a una caja blanca simple. A cada vértice de un polígono se le asigna una coordenada de textura (que en el caso 2D también se conoce como coordenadas UV ). [8] Esto se puede hacer a través de la asignación explícita de atributos de vértice , editados manualmente en un paquete de modelado 3D a través de herramientas de desenrollado UV . También es posible asociar una transformación procedimental del espacio 3D al espacio de textura con el material. Esto se puede lograr a través de proyección plana o, alternativamente, mapeo cilíndrico o esférico . Los mapeos más complejos pueden considerar la distancia a lo largo de una superficie para minimizar la distorsión. Estas coordenadas se interpolan a través de las caras de los polígonos para muestrear el mapa de textura durante la renderización. Las texturas se pueden repetir o reflejar para extender un mapa de bits rectangular finito sobre un área más grande, o pueden tener un mapeo " inyectivo " único uno a uno de cada pieza de una superficie (lo cual es importante para el mapeo de renderizado y el mapeo de luz , también conocido como horneado ).
El mapeo de texturas mapea la superficie del modelo (o el espacio de la pantalla durante la rasterización) en el espacio de texturas ; en este espacio, el mapa de texturas es visible en su forma no distorsionada. Las herramientas de desenrollado de UV generalmente brindan una vista en el espacio de texturas para la edición manual de las coordenadas de texturas. Algunas técnicas de renderizado, como la dispersión de subsuperficie, se pueden realizar de manera aproximada mediante operaciones en el espacio de texturas.
La multitextura es el uso de más de una textura a la vez en un polígono. [9] Por ejemplo, una textura de mapa de luz se puede utilizar para iluminar una superficie como una alternativa a recalcular esa iluminación cada vez que se renderiza la superficie. Las microtexturas o texturas de detalle se utilizan para agregar detalles de mayor frecuencia, y los mapas de tierra pueden agregar erosión y variación; esto puede reducir en gran medida la periodicidad aparente de las texturas repetidas. Los gráficos modernos pueden usar más de 10 capas, que se combinan mediante sombreadores , para una mayor fidelidad. Otra técnica de multitextura es el mapeo de relieve , que permite que una textura controle directamente la dirección de orientación de una superficie para los fines de sus cálculos de iluminación; puede dar una apariencia muy buena de una superficie compleja (como la corteza de un árbol o el hormigón rugoso) que adquiere detalles de iluminación además de la coloración detallada habitual. El mapeo de relieve se ha vuelto popular en los videojuegos recientes, ya que el hardware de gráficos se ha vuelto lo suficientemente potente como para acomodarlo en tiempo real. [10]
La forma en que se calculan las muestras (por ejemplo, cuando se ven como píxeles en la pantalla) a partir de los texels (píxeles de textura) está regida por el filtrado de texturas . El método más económico es utilizar la interpolación del vecino más cercano , pero la interpolación bilineal o la interpolación trilineal entre mapas MIP son dos alternativas que se utilizan habitualmente y que reducen el aliasing o los bordes irregulares . En el caso de que una coordenada de textura esté fuera de la textura, se fija o se envuelve . El filtrado anisotrópico elimina mejor los artefactos direccionales cuando se ven texturas desde ángulos de visión oblicuos.
La transmisión de texturas es un método para utilizar flujos de datos para texturas, donde cada textura está disponible en dos o más resoluciones diferentes, a fin de determinar qué textura se debe cargar en la memoria y utilizar en función de la distancia de dibujo desde el visor y de la cantidad de memoria disponible para las texturas. La transmisión de texturas permite que un motor de renderizado utilice texturas de baja resolución para objetos que se encuentran lejos de la cámara del visor y las convierta en texturas más detalladas, leídas desde una fuente de datos, a medida que el punto de vista se acerca a los objetos.
Como optimización, es posible renderizar detalles de un modelo complejo de alta resolución o de un proceso costoso (como la iluminación global ) en una textura de superficie (posiblemente en un modelo de baja resolución). El horneado también se conoce como mapeo de renderizado . Esta técnica se utiliza más comúnmente para mapas de luz , pero también se puede utilizar para generar mapas normales y mapas de desplazamiento . Algunos juegos de computadora (por ejemplo, Messiah ) han utilizado esta técnica. El motor de software Quake original usaba el horneado sobre la marcha para combinar mapas de luz y mapas de color (" almacenamiento en caché de superficie ").
El horneado se puede utilizar como una forma de generación de niveles de detalle , donde una escena compleja con muchos elementos y materiales diferentes se puede aproximar con un solo elemento con una sola textura, que luego se reduce algorítmicamente para un menor costo de renderizado y menos llamadas de dibujo . También se utiliza para tomar modelos de alto detalle de software de escultura 3D y escaneo de nubes de puntos y aproximarlos con mallas más adecuadas para renderizado en tiempo real.
Se han desarrollado diversas técnicas en las implementaciones de software y hardware. Cada una ofrece diferentes ventajas y desventajas en cuanto a precisión, versatilidad y rendimiento.
El mapeo de texturas afines interpola linealmente las coordenadas de textura a lo largo de una superficie, por lo que es la forma más rápida de mapeo de texturas. Algunos programas y hardware (como la PlayStation original ) proyectan vértices en el espacio 3D en la pantalla durante la renderización e interpolan linealmente las coordenadas de textura en el espacio de la pantalla entre ellos. Esto se puede hacer incrementando las coordenadas UV de punto fijo o mediante un algoritmo de error incremental similar al algoritmo de línea de Bresenham .
A diferencia de los polígonos perpendiculares, esto provoca una distorsión notable con las transformaciones de perspectiva (ver figura: la textura de la casilla de verificación aparece doblada), especialmente en el caso de los polígonos primitivos cerca de la cámara . Esta distorsión se puede reducir subdividiendo el polígono en polígonos más pequeños.
En el caso de objetos rectangulares, el uso de primitivas cuádruples puede parecer menos incorrecto que el mismo rectángulo dividido en triángulos, pero como la interpolación de 4 puntos agrega complejidad a la rasterización, la mayoría de las primeras implementaciones preferían solo triángulos. Algunos equipos, como el mapeo de texturas hacia adelante utilizado por Nvidia NV1 , podían ofrecer primitivas cuádruples eficientes. Con la corrección de perspectiva (ver a continuación), los triángulos se vuelven equivalentes y esta ventaja desaparece.
En el caso de objetos rectangulares que forman un ángulo recto con respecto al espectador, como pisos y paredes, solo es necesario corregir la perspectiva en una dirección a lo largo de la pantalla, en lugar de en ambas. La asignación de perspectiva correcta se puede calcular en los bordes izquierdo y derecho del piso y, luego, una interpolación lineal afín a lo largo de ese espacio horizontal se verá correcta, porque cada píxel a lo largo de esa línea está a la misma distancia del espectador.
La textura correcta en perspectiva tiene en cuenta las posiciones de los vértices en el espacio 3D, en lugar de simplemente interpolar las coordenadas en el espacio de la pantalla 2D. [11] Esto logra el efecto visual correcto, pero es más costoso de calcular. [11]
Para realizar la corrección de perspectiva de las coordenadas de textura y , siendo el componente de profundidad desde el punto de vista del espectador, podemos aprovechar el hecho de que los valores , y son lineales en el espacio de la pantalla a lo largo de la superficie que se está texturizando. Por el contrario, los valores originales , y , antes de la división, no son lineales a lo largo de la superficie en el espacio de la pantalla. Por lo tanto, podemos interpolar linealmente estos recíprocos a lo largo de la superficie, calculando valores corregidos en cada píxel, para obtener un mapeo de textura con perspectiva correcta.
Para ello, primero calculamos los recíprocos en cada vértice de nuestra geometría (3 puntos para un triángulo). Para el vértice tenemos . Luego, interpolamos linealmente estos recíprocos entre los vértices (por ejemplo, utilizando coordenadas baricéntricas ), lo que da como resultado valores interpolados en toda la superficie. En un punto dado, esto produce los valores interpolados , y . Tenga en cuenta que esto aún no se puede utilizar como nuestras coordenadas de textura, ya que nuestra división por alteró su sistema de coordenadas.
Para corregir de nuevo al espacio, primero calculamos el corregido tomando nuevamente el recíproco . Luego usamos esto para corregir nuestro : y . [12]
Esta corrección hace que en las partes del polígono que están más cerca del espectador la diferencia de píxel a píxel entre las coordenadas de textura sea menor (estirando más la textura) y en las partes que están más lejos esta diferencia sea mayor (comprimiendo la textura).
El hardware de gráficos 3D generalmente admite texturizado con perspectiva correcta.
Se han desarrollado varias técnicas para representar geometría con texturas mapeadas en imágenes con diferentes compensaciones de calidad y precisión, que se pueden aplicar tanto al software como al hardware.
Los mapeadores de textura de software clásicos generalmente solo hacían mapeos simples con como máximo un efecto de iluminación (generalmente aplicado a través de una tabla de búsqueda ), y la corrección de la perspectiva era aproximadamente 16 veces más costosa.
El motor de Doom restringió el mundo a paredes verticales y pisos/techos horizontales, con una cámara que solo podía rotar sobre el eje vertical. Esto significaba que las paredes tendrían una coordenada de profundidad constante a lo largo de una línea vertical y los pisos/techos tendrían una profundidad constante a lo largo de una línea horizontal. Después de realizar un cálculo de corrección de perspectiva para la profundidad, el resto de la línea podría usar un mapeo afín rápido. Algunos renderizadores posteriores de esta era simularon una pequeña cantidad de inclinación de la cámara con corte , lo que permitió la apariencia de mayor libertad al usar la misma técnica de renderizado.
Algunos motores fueron capaces de renderizar mapas de altura con texturas mapeadas (por ejemplo, Voxel Space de Nova Logic y el motor de Outcast ) a través de algoritmos incrementales similares a Bresenham , produciendo la apariencia de un paisaje con textura mapeada sin el uso de primitivos geométricos tradicionales. [13]
Cada triángulo se puede subdividir en grupos de unos 16 píxeles para lograr dos objetivos: primero, mantener el molino aritmético ocupado en todo momento y segundo, producir resultados aritméticos más rápidos. [ vago ]
Para el mapeo de texturas en perspectiva sin soporte de hardware, un triángulo se divide en triángulos más pequeños para renderizarlos y se utiliza el mapeo afín en ellos. La razón por la que esta técnica funciona es que la distorsión del mapeo afín se vuelve mucho menos notoria en polígonos más pequeños. La PlayStation de Sony hizo un uso extensivo de esto porque solo admitía el mapeo afín en hardware, pero tenía un rendimiento de triángulos relativamente alto en comparación con sus pares.
Los renderizadores de software generalmente prefieren la subdivisión de pantalla porque tiene menos sobrecarga. Además, intentan hacer una interpolación lineal a lo largo de una línea de píxeles para simplificar la configuración (en comparación con la interpolación afín 2D) y, por lo tanto, nuevamente la sobrecarga (además, el mapeo de textura afín no se adapta al bajo número de registros de la CPU x86 ; el 68000 o cualquier RISC es mucho más adecuado).
Se adoptó un enfoque diferente para Quake , que calcularía las coordenadas de perspectiva correcta solo una vez cada 16 píxeles de una línea de escaneo e interpolaría linealmente entre ellas, ejecutándose efectivamente a la velocidad de la interpolación lineal porque el cálculo de perspectiva correcta se ejecuta en paralelo en el coprocesador. [14] Los polígonos se representan de forma independiente, por lo tanto, puede ser posible cambiar entre tramos y columnas o direcciones diagonales dependiendo de la orientación de la normal del polígono para lograr un z más constante, pero el esfuerzo parece no valer la pena.
Otra técnica consistía en aproximar la perspectiva con un cálculo más rápido, como un polinomio. Otra técnica utiliza el valor 1/z de los dos últimos píxeles dibujados para extrapolar linealmente el siguiente valor. Luego, la división se realiza a partir de esos valores, de modo que solo se debe dividir un pequeño resto [15], pero la cantidad de contabilidad hace que este método sea demasiado lento en la mayoría de los sistemas.
Finalmente, el motor Build extendió el truco de la distancia constante usado para Doom al encontrar la línea de distancia constante para polígonos arbitrarios y renderizar a lo largo de ella.
El hardware de mapeo de texturas se desarrolló originalmente para simulación (por ejemplo, como se implementó en Evans and Sutherland ESIG y Singer-Link Digital Image Generators DIG), y estaciones de trabajo de gráficos profesionales como Silicon Graphics , máquinas de efectos de video digital de transmisión como Ampex ADO y luego apareció en gabinetes Arcade , consolas de videojuegos de consumo y tarjetas de video para PC a mediados de la década de 1990. En la simulación de vuelo , el mapeo de texturas proporcionó importantes señales de movimiento y altitud necesarias para el entrenamiento del piloto que no estaban disponibles en superficies sin textura. También fue en aplicaciones de simulación de vuelo que el mapeo de texturas se implementó para el procesamiento en tiempo real con patrones de textura prefiltrados almacenados en la memoria para acceso en tiempo real por parte del procesador de video. [16]
Las unidades de procesamiento gráfico (GPU) modernas proporcionan unidades de función fija especializadas llamadas muestreadores de textura o unidades de mapeo de textura para realizar el mapeo de textura, generalmente con filtrado trilineal o mejor filtrado anisotrópico de múltiples toques y hardware para decodificar formatos específicos como DXTn . A partir de 2016, el hardware de mapeo de textura es omnipresente ya que la mayoría de los SOC contienen una GPU adecuada.
Algunos equipos combinan el mapeo de texturas con la determinación de superficies ocultas en el renderizado diferido basado en mosaicos o en el renderizado de líneas de escaneo ; dichos sistemas solo recuperan los texeles visibles a expensas de utilizar un espacio de trabajo mayor para los vértices transformados. La mayoría de los sistemas se han decidido por el enfoque de almacenamiento en búfer Z , que aún puede reducir la carga de trabajo del mapeo de texturas con la clasificación de adelante hacia atrás .
Entre el hardware gráfico anterior, había dos paradigmas en competencia sobre cómo entregar una textura a la pantalla:
El mapeo de textura inverso es el método que se ha convertido en estándar en el hardware moderno.
Con este método, un píxel de la pantalla se asigna a un punto de la textura. Cada vértice de una primitiva de renderizado se proyecta en un punto de la pantalla y cada uno de estos puntos se asigna a una coordenada de texel au,v en la textura. Un rasterizador interpolará entre estos puntos para rellenar cada píxel cubierto por la primitiva.
La principal ventaja es que cada píxel cubierto por un primitivo se recorrerá exactamente una vez. Una vez que se transforman los vértices de un primitivo, la cantidad de trabajo restante se escala directamente con la cantidad de píxeles que cubre en la pantalla.
La principal desventaja con respecto al mapeo de texturas hacia adelante es que el patrón de acceso a la memoria en el espacio de texturas no será lineal si la textura está en ángulo con respecto a la pantalla. Esta desventaja suele solucionarse con técnicas de almacenamiento en caché de texturas , como la disposición de memoria de texturas con desplazamiento .
La interpolación lineal se puede utilizar directamente para un mapeo de textura afín simple y eficiente, pero también se puede adaptar para lograr corrección de perspectiva.
El mapeo de texturas hacia adelante asigna cada texel de la textura a un píxel en la pantalla. Después de transformar un primitivo rectangular en un lugar en la pantalla, un renderizador de mapeo de texturas hacia adelante itera a través de cada texel en la textura, salpicando cada uno en un píxel del búfer de cuadros .
Esto fue utilizado por algunos hardware, como el 3DO , el Sega Saturn y el NV1 .
La principal ventaja es que se accederá a la textura en un orden lineal simple, lo que permite un almacenamiento en caché muy eficiente de los datos de textura. Sin embargo, este beneficio también es una desventaja: a medida que un primitivo se hace más pequeño en la pantalla, aún tiene que iterar sobre cada texel en la textura, lo que hace que muchos píxeles se sobredibujen de manera redundante.
Este método también es adecuado para renderizar primitivos de cuadrantes en lugar de reducirlos a triángulos, lo que proporcionó una ventaja cuando la textura correcta de la perspectiva no estaba disponible en el hardware. Esto se debe a que la distorsión afín de un cuadrante parece menos incorrecta que el mismo cuadrante dividido en dos triángulos (consulte el mapeo de textura afín anterior). El hardware NV1 también permitió un modo de interpolación cuadrática para proporcionar una aproximación aún mejor de la corrección de la perspectiva.
Las implementaciones de hardware existentes no proporcionaban un mapeo de coordenadas UV efectivo , que se convirtió en una técnica importante para el modelado 3D y ayudó a recortar la textura correctamente cuando la primitiva sobrepasa el borde de la pantalla. Estas deficiencias podrían haberse solucionado con un mayor desarrollo, pero desde entonces el diseño de GPU se ha orientado principalmente hacia el mapeo inverso.
Más allá de la renderización 3D, la disponibilidad de hardware de mapeo de texturas ha inspirado su uso para acelerar otras tareas:
Es posible utilizar hardware de mapeo de texturas para acelerar tanto la reconstrucción de conjuntos de datos de vóxeles a partir de exploraciones tomográficas como para visualizar los resultados . [17]
Muchas interfaces de usuario utilizan el mapeo de texturas para acelerar las transiciones animadas de los elementos de la pantalla, por ejemplo, Exposé en Mac OS X.
{{cite web}}
: CS1 maint: URL no apta ( enlace ){{cite journal}}
: Enlace externo en |ref=
( ayuda )