stringtranslate.com

Mapeo cúbico

La imagen inferior izquierda muestra una escena con un punto de vista marcado con un punto negro. La imagen superior muestra la red del mapeo del cubo como se ve desde ese punto de vista, y la imagen inferior derecha muestra el cubo superpuesto a la escena original.

En el campo de los gráficos por ordenador , el mapeo cúbico es un método de mapeo del entorno que utiliza las seis caras de un cubo como forma del mapa. El entorno se proyecta sobre los lados de un cubo y se almacena como seis texturas cuadradas o se desdobla en seis regiones de una sola textura.

El mapa cúbico se genera renderizando primero la escena seis veces desde un punto de vista, con las vistas definidas por un tronco de vista de 90 grados que representa cada cara del cubo. [1] O si primero se considera que el entorno se proyecta sobre una esfera , entonces cada cara del cubo es su proyección gnomónica .

En la mayoría de los casos, se prefiere el mapeo de cubos al método más antiguo de mapeo de esferas porque elimina muchos de los problemas inherentes al mapeo de esferas, como la distorsión de la imagen, la dependencia del punto de vista y la ineficiencia computacional. Además, el mapeo de cubos proporciona una capacidad mucho mayor para soportar la representación en tiempo real de reflexiones en relación con el mapeo de esferas porque la combinación de ineficiencia y dependencia del punto de vista limita severamente la capacidad de aplicar el mapeo de esferas cuando hay un punto de vista que cambia constantemente.

Las variantes del mapeo de cubos también se utilizan comúnmente en la proyección de video de 360 ​​grados . [2]

Historia

El mapeo de cubos fue propuesto por primera vez en 1986 por Ned Greene en su artículo “Environment Mapping and Other Applications of World Projections”, [3] diez años después de que Jim Blinn y Martin Newell lo propusieran por primera vez . Sin embargo, las limitaciones del hardware en la capacidad de acceder a seis imágenes de textura simultáneamente hicieron que no fuera factible implementar el mapeo de cubos sin más desarrollos tecnológicos. Este problema se solucionó en 1999 con el lanzamiento de la Nvidia GeForce 256. Nvidia promocionó el mapeo de cubos en hardware como “una característica innovadora de calidad de imagen de la GeForce 256 que... permitirá a los desarrolladores crear reflejos precisos en tiempo real. Acelerado en hardware, el mapeo de entornos de cubos liberará la creatividad de los desarrolladores para usar reflejos y efectos de iluminación especular para crear entornos interesantes e inmersivos”. [4] Hoy en día, el mapeo de cubos todavía se usa en una variedad de aplicaciones gráficas como un método favorito de mapeo de entornos.

Ventajas

El mapeo de cubos se prefiere a otros métodos de mapeo de entornos debido a su relativa simplicidad. Además, el mapeo de cubos produce resultados similares a los obtenidos con el trazado de rayos , pero es mucho más eficiente computacionalmente: la reducción moderada en la calidad se compensa con grandes ganancias en eficiencia.

El mapeo de esferas, que es anterior al mapeo de cubos, tiene muchos defectos inherentes que lo hacen poco práctico para la mayoría de las aplicaciones. El mapeo de esferas depende de la vista, lo que significa que se necesita una textura diferente para cada punto de vista. Por lo tanto, en aplicaciones donde el punto de vista es móvil, sería necesario generar dinámicamente un nuevo mapeo de esferas para cada nuevo punto de vista (o generar previamente un mapeo para cada punto de vista). Además, una textura mapeada sobre la superficie de una esfera debe estirarse y comprimirse, y la deformación y la distorsión (particularmente a lo largo del borde de la esfera) son una consecuencia directa de esto. Aunque estos defectos de imagen se pueden reducir utilizando ciertos trucos y técnicas como el "estiramiento previo", esto solo agrega otra capa de complejidad al mapeo de esferas.

El mapeo paraboloide proporciona algunas mejoras respecto de las limitaciones del mapeo esférico, sin embargo requiere dos pasadas de renderizado además de operaciones especiales de deformación de imagen y cálculos más complejos.

Por el contrario, el mapeo de cubos requiere solo un único paso de renderizado y, debido a su naturaleza simple, es muy fácil de comprender y generar para los desarrolladores. Además, el mapeo de cubos utiliza toda la resolución de la imagen de textura, en comparación con los mapeos de esferas y paraboloides, lo que también le permite utilizar imágenes de menor resolución para lograr la misma calidad. Aunque el manejo de las uniones del mapa de cubos es un problema, se han desarrollado algoritmos para manejar el comportamiento de las uniones y dar como resultado un reflejo sin fisuras.

Desventajas

Si se introduce un nuevo objeto o una nueva iluminación en la escena, o si algún objeto que se refleja en ella se mueve o cambia de alguna manera, entonces el reflejo cambia y el mapa cúbico debe volver a renderizarse. Cuando el mapa cúbico se fija a un objeto que se mueve por la escena, entonces el mapa cúbico también debe volver a renderizarse desde esa nueva posición. [ cita requerida ]

Aplicaciones

Reflejos especulares estables

Los programas de diseño asistido por ordenador (CAD) utilizan reflejos especulares como pistas visuales para transmitir una sensación de curvatura de la superficie al renderizar objetos 3D. Sin embargo, muchos programas CAD presentan problemas en el muestreo de reflejos especulares porque los cálculos de iluminación especular solo se realizan en los vértices de la malla utilizada para representar el objeto, y se utiliza la interpolación para estimar la iluminación en toda la superficie del objeto. Los problemas ocurren cuando los vértices de la malla no son lo suficientemente densos, lo que da como resultado un muestreo insuficiente de la iluminación especular. Esto, a su vez, da como resultado reflejos con un brillo proporcional a la distancia desde los vértices de la malla, lo que en última instancia compromete las pistas visuales que indican la curvatura. Lamentablemente, este problema no se puede resolver simplemente creando una malla más densa, ya que esto puede reducir en gran medida la eficiencia de la representación de objetos.

Los mapas cúbicos proporcionan una solución bastante sencilla y eficiente para la representación de reflejos especulares estables. Se pueden codificar múltiples reflejos especulares en una textura de mapa cúbico, a la que se puede acceder interpolando a través del vector de reflexión de la superficie para proporcionar coordenadas. En relación con el cálculo de la iluminación en vértices individuales, este método proporciona resultados más limpios que representan la curvatura con mayor precisión. Otra ventaja de este método es que se escala bien, ya que se pueden codificar reflejos especulares adicionales en la textura sin aumentar el costo de la representación. Sin embargo, este enfoque es limitado porque las fuentes de luz deben ser luces distantes o infinitas, aunque afortunadamente este suele ser el caso en los programas CAD.

Cajas del cielo

Los renders que utilizan mapas cúbicos pueden verse mejor en escenas al aire libre. (A la izquierda se muestra un mapa cúbico, a la derecha se muestra una luz solar básica). Renderizado en Blender Cycles.
Ejemplo de una textura que se puede asignar a las caras de un skybox cúbico, con caras etiquetadas

Quizás la aplicación más avanzada del mapeo cúbico es la creación de imágenes panorámicas del cielo pre-renderizadas que luego son renderizadas por el motor gráfico como caras de un cubo a una distancia prácticamente infinita con el punto de vista ubicado en el centro del cubo. La proyección en perspectiva de las caras del cubo realizada por el motor gráfico deshace los efectos de la proyección del entorno para crear el mapa cúbico, de modo que el observador experimenta una ilusión de estar rodeado por la escena que se utilizó para generar el skybox. Esta técnica ha encontrado un uso extendido en los videojuegos , ya que permite a los diseñadores agregar entornos complejos (aunque no explorables) a un juego casi sin costo de rendimiento.

Iluminación del tragaluz

Los mapas cúbicos pueden ser útiles para modelar la iluminación exterior con precisión. Modelar simplemente la luz solar como una única luz infinita simplifica en exceso la iluminación exterior y da como resultado una iluminación poco realista. Aunque mucha luz proviene del sol, la dispersión de los rayos en la atmósfera hace que todo el cielo actúe como una fuente de luz (a menudo denominada iluminación del tragaluz). Sin embargo, al utilizar un mapa cúbico, se puede capturar la contribución difusa de la iluminación del tragaluz. A diferencia de los mapas ambientales donde se utiliza el vector de reflexión, este método accede al mapa cúbico en función del vector normal de la superficie para proporcionar una aproximación rápida de la iluminación difusa del tragaluz. La única desventaja de este método es que calcular mapas cúbicos para representar correctamente un tragaluz es muy complejo; un proceso reciente es calcular la base armónica esférica que mejor representa la iluminación difusa de baja frecuencia del mapa cúbico. Sin embargo, se ha realizado una cantidad considerable de investigación para modelar eficazmente la iluminación del tragaluz.

Reflexión dinámica

Reflexiones en mapas cúbicos en acción

El mapeo de entorno básico utiliza un mapa cúbico estático: aunque el objeto se puede mover y distorsionar, el entorno reflejado permanece constante. Sin embargo, una textura de mapa cúbico se puede actualizar de manera constante para representar un entorno que cambia dinámicamente (por ejemplo, árboles que se balancean con el viento). Una forma simple pero costosa de generar reflejos dinámicos implica generar los mapas cúbicos en tiempo de ejecución para cada cuadro. Aunque esto es mucho menos eficiente que el mapeo estático debido a los pasos de renderización adicionales, aún se puede realizar a velocidades interactivas.

Lamentablemente, esta técnica no se escala bien cuando hay varios objetos reflectantes. Por lo general, se requiere un mapa de entorno dinámico único para cada objeto reflectante. Además, se agregan más complicaciones si los objetos reflectantes pueden reflejarse entre sí: los mapas de cubos dinámicos se pueden generar de forma recursiva aproximando los efectos que se generan normalmente mediante el trazado de rayos.

Iluminación global

En ICCVG 2002 se presentó un algoritmo para el cálculo de la iluminación global a velocidades interactivas utilizando una estructura de datos de mapa cúbico. [1]

Texturas de proyección

Otra aplicación que ha encontrado un uso generalizado en los videojuegos es el mapeo de texturas proyectivas . Se basa en mapas cúbicos para proyectar imágenes de un entorno en la escena circundante; por ejemplo, una fuente de luz puntual está vinculada a un mapa cúbico que es una imagen panorámica tomada desde el interior de una jaula de linterna o un marco de ventana a través del cual se filtra la luz. Esto permite a un desarrollador de juegos lograr una iluminación realista sin tener que complicar la geometría de la escena o recurrir a costosos cálculos de volumen de sombras en tiempo real .

Direccionamiento de memoria

Esta ilustración muestra cómo se indexa y direcciona un mapa cúbico.

Una textura de cubo indexa seis mapas de textura de 0 a 5 en orden X positivo, X negativo, Y positivo, Y negativo, Z positivo, Z negativo. [5] [6] Las imágenes se almacenan con el origen en la parte inferior izquierda de la imagen. Las caras X e Y positivas deben invertir la coordenada Z y la cara Z negativa debe negar la coordenada X. Si se dan las coordenadas de la cara y la textura , el vector no normalizado se puede calcular mediante la función:

void convert_cube_uv_to_xyz ( int index , float u , float v , float * x , float * y , float * z ) { // convierte el rango de 0 a 1 a -1 a 1 float uc = 2.0f * u - 1.0f ; float vc = 2.0f * v - 1.0f ; switch ( index ) { caso 0 : * x = 1.0f ; * y = vc ; * z = - uc ; break ; // X POSITIVA caso 1 : * x = -1.0f ; * y = vc ; * z = uc ; break ; // X NEGATIVA caso 2 : * x = uc ; * y = 1.0f ; * z = - vc ; break ; // Y POSITIVA caso 3 : * x = uc ; * y = -1.0f ; * z = vc ; break ; // Y NEGATIVA caso 4 : * x = uc ; * y = vc ; * z = 1.0f ; break ; // Z POSITIVA caso 5 : * x = - uc ; * y = vc ; * z = -1.0f ; break ; // Z NEGATIVA } }                                                                                                         

Del mismo modo, un vector se puede convertir al índice de la cara y las coordenadas de textura con la función:

void convert_xyz_to_cube_uv ( float x , float y , float z , int * index , float * u , float * v ) { float absX = fabs ( x ) ; float absY = fabs ( y ); float absZ = fabs ( z ); int isXPositive = x > 0 ? 1 : 0 ; int isYPositive = y > 0 ? 1 : 0 ; int isZPositive = z > 0 ? 1 : 0 ; float maxAxis , uc , vc ; // X POSITIVO if ( isXPositive && absX >= absY && absX >= absZ ) { // u (0 a 1) va de +z a -z // v (0 a 1) va de -y a +y maxAxis = absX ; uc = - z ; vc = y ; * índice = 0 ; } // X NEGATIVO if ( ! isXPositive && absX >= absY && absX >= absZ ) { // u (0 a 1) va de -z a +z // v (0 a 1) va de -y a +y maxAxis = absX ; uc = z ; vc = y ; * índice = 1 ; } // Y POSITIVO if ( isYPositive && absY >= absX && absY >= absZ ) { // u (0 a 1) va de -x a +x // v (0 a 1) va de +z a -z maxAxis = absY ; uc = x ;                                                                                                                                        vc = - z ; * índice = 2 ; } // Y NEGATIVA if ( ! isYPositive && absY >= absX && absY >= absZ ) { // u (0 a 1) va de -x a +x // v (0 a 1) va de -z a +z maxAxis = absY ; uc = x ; vc = z ; * índice = 3 ; } // Z POSITIVA if ( isZPositive && absZ >= absX && absZ >= absY ) { // u (0 a 1) va de -x a +x // v (0 a 1) va de -y a +y maxAxis = absZ ; uc = x ; vc = y ; * índice = 4 ; } // Z NEGATIVO si ( ! isZPositive && absZ >= absX && absZ >= absY ) { // u (0 a 1) va de +x a -x // v (0 a 1) va de -y a +y maxAxis = absZ ; uc = - x ; vc = y ; * índice = 5 ; }                                                                                        // Convertir rango de -1 a 1 a 0 a 1 * u = 0.5f * ( uc / maxAxis + 1.0f ); * v = 0.5f * ( vc / maxAxis + 1.0f ); }                  

Referencias

  1. ^ Fernando, R. y Kilgard MJ (2003). The CG Tutorial: The Definitive Guide to Programmable Real-Time Graphics (El tutorial de gráficos por computadora: la guía definitiva para gráficos programables en tiempo real). (1.ª ed.). Addison-Wesley Longman Publishing Co., Inc. Boston, MA, EE. UU. Capítulo 7: Técnicas de mapeo del entorno
  2. ^ stevewhims (6 de enero de 2021). "Mapeo de entornos cúbicos (Direct3D 9): aplicaciones Win32". learn.microsoft.com . Consultado el 21 de agosto de 2024 .
  3. ^ Greene, N (1986). "Mapeo del entorno y otras aplicaciones de las proyecciones mundiales". IEEE Comput. Graph. Appl . 6 (11): 21–29. doi :10.1109/MCG.1986.276658. S2CID  11301955.
  4. ^ Nvidia, enero de 2000. Resumen técnico: Reflexiones perfectas y efectos de iluminación especular con mapeo de entorno cúbico Archivado el 4 de octubre de 2008 en Wayback Machine.
  5. ^ "Introducción a las texturas en Direct3D 11 - Aplicaciones Win32 | Microsoft Docs". 23 de agosto de 2019.
  6. ^ "Capítulo 19. Iluminación basada en imágenes".

Véase también