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 iniciada 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 de la renderización de múltiples pasadas, la multitextura , los mapas mip y los mapeos más complejos como el mapeo de altura , el mapeo de relieve , el mapeo normal , el mapeo de desplazamiento , el mapeo de reflexión , el mapeo especular , el mapeo de oclusión y muchas otras variaciones de la técnica. (controlados por un sistema de materiales ) han hecho posible simular un casi fotorrealismo en tiempo real al reducir enormemente el número de polígonos y cálculos de iluminación necesarios para construir una escena 3D realista y funcional.
Amapa de textura [5][6]es una imagen aplicada (mapeada) a la superficie de una forma opolígono.[7]Esto puede ser unaimagen de mapa de bitso unatextura de procedimiento. Pueden almacenarse enformatos de archivos de imágenes, referenciados porformatos de modelos 3Dodefiniciones de materiales, y ensamblarse enpaquetes de recursos.
Pueden tener de una a tres dimensiones, aunque las dos dimensiones son más comunes en las superficies visibles. Para su uso con hardware moderno, los datos del mapa de texturas se pueden almacenar en ordenamientos combinados o en mosaico para mejorar la coherencia de la caché . Las API de renderizado generalmente administran recursos de mapas de textura (que pueden estar ubicados en la memoria del dispositivo ) como buffers o superficies, y pueden permitir el " renderizado a textura " para efectos adicionales como posprocesamiento o mapeo de 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 combinación alfa ( RGBA ), especialmente para vallas publicitarias y texturas de superposición de calcomanías . Es posible utilizar el canal alfa (que puede resultar conveniente 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 del hardware moderno. (Pueden considerarse una evolución moderna de los gráficos de mapas en mosaico ). El hardware moderno a menudo admite texturas de mapas de cubos con múltiples caras para el mapeo del entorno.
Los mapas de textura se pueden adquirir mediante escaneo / fotografía digital , diseñarse en software de manipulación de imágenes como GIMP , Photoshop o pintarse 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. A cada vértice de un polígono se le asigna una coordenada de textura (que en el segundo caso también se conoce como coordenadas UV ). [8] Esto se puede hacer mediante la asignación explícita de atributos de vértice , editados manualmente en un paquete de modelado 3D mediante herramientas de desenvolvimiento UV . También es posible asociar una transformación procedimental del espacio 3D al espacio de textura con el material. Esto podría lograrse mediante proyección plana o, alternativamente, mapeo cilíndrico o esférico . Mapeos más complejos pueden considerar la distancia a lo largo de una superficie para minimizar la distorsión. Estas coordenadas se interpolan en las caras de los polígonos para muestrear el mapa de textura durante el renderizado. 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 hornear ).
El mapeo de texturas mapea la superficie del modelo (o el espacio de la pantalla durante la rasterización) en el espacio de textura ; En este espacio, el mapa de textura es visible en su forma no distorsionada. Las herramientas de desenvolvimiento UV suelen proporcionar una vista en el espacio de textura para la edición manual de coordenadas de textura. Algunas técnicas de renderizado, como la dispersión del subsuelo, se pueden realizar aproximadamente mediante operaciones de textura-espacio.
La multitextura es el uso de más de una textura a la vez en un polígono. [9] Por ejemplo, se puede utilizar una textura de mapa de luz para iluminar una superficie como alternativa a recalcular esa iluminación cada vez que se renderiza la superficie. Se utilizan microtexturas o texturas detalladas para agregar detalles de mayor frecuencia, y los mapas de tierra pueden agregar desgaste y variación; esto puede reducir en gran medida la aparente periodicidad de las texturas repetidas. Los gráficos modernos pueden utilizar más de 10 capas, que se combinan mediante sombreadores , para 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 sus cálculos de iluminación; puede dar una muy buena apariencia a una superficie compleja (como corteza de árbol u 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 las muestras (por ejemplo, cuando se ven como píxeles en la pantalla) se calculan a partir de los texels (píxeles de textura) se rige 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 comúnmente utilizadas que reducen los alias o irregularidades . En el caso de que una coordenada de textura esté fuera de la textura, se sujeta o se envuelve . El filtrado anisotrópico elimina mejor los artefactos direccionales al visualizar texturas desde ángulos de visión oblicuos.
La transmisión de texturas es un medio de usar flujos de datos para texturas, donde cada textura está disponible en dos o más resoluciones diferentes, para determinar qué textura debe cargarse en la memoria y usarse según la distancia de dibujo desde el espectador y cuánta memoria está disponible para texturas. La transmisión de texturas permite que un motor de renderizado utilice texturas de baja resolución para objetos alejados de la cámara del espectador y las resuelva en texturas más detalladas, leídas de una fuente de datos, a medida que el punto de vista se acerca a los objetos.
Como optimización, es posible representar 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 ligeros , pero también se puede utilizar para generar mapas normales y mapas de desplazamiento . Algunos juegos de ordenador (por ejemplo, Messiah ) han utilizado esta técnica. El motor de software Quake original utilizaba 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 nivel de detalle , donde una escena compleja con muchos elementos y materiales diferentes se puede aproximar mediante un solo elemento con una sola textura, que luego se reduce algorítmicamente para reducir el costo de renderizado y menos llamadas . 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 la renderización en tiempo real.
Varias técnicas han evolucionado en implementaciones de software y hardware. Cada uno ofrece diferentes compensaciones en precisión, versatilidad y rendimiento.
El mapeo de texturas afín interpola linealmente las coordenadas de textura a través de una superficie, por lo que es la forma más rápida de mapeo de texturas. Algunos software y hardware (como la PlayStation original ) proyectan vértices en el espacio 3D en la pantalla durante el renderizado e interpolan linealmente las coordenadas de textura en el espacio de la pantalla entre ellos. Esto se puede hacer incrementando las coordenadas UV de puntos fijos 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 en las transformaciones de perspectiva (ver figura: la textura del cuadro de verificación aparece doblada), especialmente cuando los primitivos están cerca de la cámara . Esta distorsión se puede reducir subdividiendo el polígono en polígonos más pequeños.
Para el caso de objetos rectangulares, usar primitivas cuádruples puede parecer menos incorrecto que el mismo rectángulo dividido en triángulos, pero debido a que la interpolación de 4 puntos agrega complejidad a la rasterización, la mayoría de las primeras implementaciones preferían solo los triángulos. Parte del hardware, como el mapeo de texturas directo utilizado por la Nvidia NV1 , pudo ofrecer primitivas cuádruples eficientes. Con la corrección de perspectiva (ver más abajo), los triángulos se vuelven equivalentes y esta ventaja desaparece.
Para objetos rectangulares que están en ángulo recto con el espectador, como pisos y paredes, la perspectiva solo necesita corregirse en una dirección a lo largo de la pantalla, en lugar de en ambas. El mapeo de perspectiva correcto se puede calcular en los bordes izquierdo y derecho del piso, y luego una interpolación lineal afín a lo largo de ese tramo 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 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 , el original y antes de la división no son lineales en la superficie del espacio de la pantalla. Por lo tanto, podemos interpolar linealmente estos recíprocos a través de la superficie, calculando valores corregidos en cada píxel, para dar como resultado un mapeo de textura en 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, usando coordenadas baricéntricas ), lo que da como resultado valores interpolados en toda la superficie. En un punto dado, esto produce , y interpolados . Tenga en cuenta que esto aún no se puede utilizar como nuestras coordenadas de textura ya que nuestra división modificó 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 la textura sea menor (estirando la textura más) y en las partes más alejadas esta diferencia sea mayor (comprimiendo la textura). .
El hardware de gráficos 3D normalmente admite texturas con perspectiva correcta.
Se han desarrollado varias técnicas para representar la geometría mapeada de texturas en imágenes con diferentes compensaciones de calidad/precisión, que se pueden aplicar tanto al software como al hardware.
Los mapeadores de texturas 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 girar alrededor del 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 utilizar un mapeo afín rápido. Algunos renderizadores posteriores de esta época simularon una pequeña cantidad de inclinación de la cámara con corte, lo que permitió la apariencia de una mayor libertad al usar la misma técnica de renderizado.
Algunos motores pudieron representar mapas de altura con mapas de textura (por ejemplo, Voxel Space de Nova Logic y el motor de Outcast ) a través de algoritmos incrementales similares a los de Bresenham , produciendo la apariencia de un paisaje con mapas de textura sin el uso de primitivas geométricas tradicionales. [13]
Cada triángulo se puede subdividir en grupos de aproximadamente 16 píxeles para lograr dos objetivos. En primer lugar, mantener el molino aritmético ocupado en todo momento. En segundo lugar, producir resultados aritméticos más rápidos. [ impreciso ]
Para el mapeo de texturas en perspectiva sin soporte de hardware, un triángulo se divide en triángulos más pequeños para renderizar y se usa un 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 perceptible en polígonos más pequeños. La Sony PlayStation hizo un uso extensivo de esto porque solo admitía mapeo afín en hardware pero tenía un rendimiento triangular relativamente alto en comparación con sus pares.
Los renderizadores de software generalmente prefieren la subdivisión de pantalla porque tiene menos gastos generales. Además, intentan realizar 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 texturas afín no cabe en el 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 exploración e interpolaría linealmente entre ellas, funcionando 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 que puede ser posible cambiar entre tramos y columnas o direcciones diagonales dependiendo de la orientación de la normal del polígono para lograr una z más constante, pero el esfuerzo parece no vale la pena.
Otra técnica fue aproximar la perspectiva con un cálculo más rápido, como un polinomio. Otra técnica más 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 amplió el truco de distancia constante utilizado 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 y 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 digitales de transmisión como Ampex ADO y que aparecieron más tarde. 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 de pilotos que no están disponibles en superficies sin textura. También fue en las aplicaciones de simulación de vuelo donde se implementó el mapeo de texturas 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 de gráficos (GPU) modernas proporcionan unidades de función fija especializadas llamadas muestreadores de texturas , o unidades de mapeo de texturas , para realizar mapeos de texturas, 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 texturas es omnipresente ya que la mayoría de los SOC contienen una GPU adecuada.
Algunos hardware combinan el mapeo de texturas con la determinación de superficies ocultas en renderizado diferido basado en mosaicos o renderizado de líneas de exploración ; Dichos sistemas solo recuperan los texels visibles a expensas de utilizar un mayor espacio de trabajo 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 de gráficos anterior, había dos paradigmas en competencia sobre cómo entregar una textura a la pantalla:
El mapeo de texturas 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 a un punto en 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 completar cada píxel cubierto por la primitiva.
La principal ventaja es que cada píxel cubierto por una primitiva se atravesará exactamente una vez. Una vez que se transforman los vértices de una primitiva, la cantidad de trabajo restante aumenta directamente con la cantidad de píxeles que cubre en la pantalla.
La principal desventaja frente al mapeo de textura directo es que el patrón de acceso a la memoria en el espacio de textura no será lineal si la textura está en ángulo con la pantalla. Esta desventaja a menudo se soluciona mediante técnicas de almacenamiento en caché de texturas , como la disposición de memoria de texturas swizzled .
La interpolación lineal se puede utilizar directamente para un mapeo de texturas afín simple y eficiente, pero también se puede adaptar para corregir la perspectiva.
El mapeo directo de texturas asigna cada texel de la textura a un píxel en la pantalla. Después de transformar una primitiva rectangular en un lugar en la pantalla, un renderizador de mapeo de textura directo itera a través de cada texel en la textura, colocando cada uno en un píxel del frame buffer .
Este 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 permitirá un almacenamiento en caché muy eficiente de los datos de la textura. Sin embargo, esta ventaja es también su desventaja: a medida que una primitiva se hace más pequeña en la pantalla, todavía tiene que iterar sobre cada texel de la textura, lo que provoca que muchos píxeles se sobredibujen de forma redundante.
Este método también es muy adecuado para renderizar primitivas cuádruples en lugar de reducirlas a triángulos, lo que proporcionaba una ventaja cuando la textura correcta en perspectiva no estaba disponible en el hardware. Esto se debe a que la distorsión afín de un quad parece menos incorrecta que el mismo quad dividido en dos triángulos (consulte el mapeo de textura afín arriba). 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 , lo 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 la GPU se ha movido principalmente hacia el mapeo inverso.
Más allá del renderizado 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 mapeo de texturas para acelerar las transiciones animadas de elementos de la pantalla, por ejemplo, Exposé en Mac OS X.
{{cite web}}
: Mantenimiento CS1: URL no apta ( enlace ){{cite journal}}
: Enlace externo en |ref=
( ayuda )