En gráficos por computadora , el mapeo de cubos es un método de mapeo del entorno que utiliza las seis caras de un cubo como forma del mapa. El entorno se proyecta en los lados de un cubo y se almacena como seis texturas cuadradas, o se despliega en seis regiones de una sola textura. El mapa de cubos se genera renderizando primero la escena seis veces desde un punto de vista, con las vistas definidas por un frustum de vista de 90 grados que representa cada cara del cubo. [1]
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 admitir la representación en tiempo real de reflejos en relación con el mapeo de esferas porque la combinación de ineficiencia y dependencia del punto de vista limita gravemente la capacidad de aplicar el mapeo de esferas cuando hay un punto de vista que cambia constantemente.
Historia
El mapeo de cubos fue propuesto por primera vez en 1986 por Ned Greene en su artículo “Mapeo ambiental y otras aplicaciones de proyecciones mundiales”, [2] diez años después de que el mapeo ambiental fuera presentado por primera vez por Jim Blinn y Martin Newell . Sin embargo, las limitaciones del hardware en la capacidad de acceder a seis imágenes de textura simultáneamente hicieron inviable 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 de calidad de imagen revolucionaria de 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 ". [3] Hoy en día, el mapeo de cubos todavía se usa en una variedad de aplicaciones gráficas como un método preferido de mapeo del entorno.
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 mediante el trazado de rayos , pero es mucho más eficiente desde el punto de vista computacional: la reducción moderada en la calidad se compensa con grandes ganancias en la eficiencia.
El mapeo de esferas , anterior al mapeo de cubos, tiene muchos defectos inherentes que lo hacían 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 tanto, en aplicaciones donde el punto de vista sea móvil, sería necesario generar dinámicamente un nuevo mapeo de esferas para cada nuevo punto de vista (o, pregenerar un mapeo para cada punto de vista). Además, una textura mapeada en 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 "preestirado", esto solo agrega otra capa de complejidad al mapeo de esferas.
El mapeo de paraboloides proporciona algunas mejoras en las limitaciones del mapeo de esferas, sin embargo, requiere dos pases de renderizado además de operaciones especiales de deformación de imágenes y cálculos más complicados.
Por el contrario, el mapeo de cubos requiere solo una pasada 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 usa la resolución completa de la imagen de textura, en comparación con los mapeos de esfera y paraboloide, lo que también le permite usar imágenes de menor resolución para lograr la misma calidad. Aunque el manejo de las costuras del mapa de cubos es un problema, se han desarrollado algoritmos para manejar el comportamiento de las costuras y dar como resultado una reflexión perfecta.
Desventajas
Si se introduce un nuevo objeto o una nueva iluminación en la escena o si algún objeto que se refleja en él se mueve o cambia de alguna manera, entonces el reflejo cambia y el mapa del cubo debe volver a renderizarse. Cuando el mapa del cubo se fija a un objeto que se mueve a través de la escena, el mapa del cubo también debe volver a renderizarse desde esa nueva posición.
Aplicaciones
Destacados especulares estables
Los programas de diseño asistido por computadora (CAD) utilizan reflejos especulares como señales visuales para transmitir una sensación de curvatura de la superficie al renderizar objetos 3D. Sin embargo, muchos programas CAD presentan problemas al muestrear 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 la interpolación se usa para estimar la iluminación en la superficie del objeto. Los problemas ocurren cuando los vértices de la malla no son lo suficientemente densos, lo que resulta en un muestreo insuficiente de la iluminación especular. Esto, a su vez, da como resultado reflejos con brillo proporcional a la distancia desde los vértices de la malla, lo que en última instancia compromete las señales visuales que indican la curvatura. Desafortunadamente, 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 de cubos proporcionan una solución bastante sencilla y eficiente para generar reflejos especulares estables. Se pueden codificar múltiples reflejos especulares en una textura de mapa de cubo, a la que luego 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 renderizado. Sin embargo, este enfoque está limitado en el sentido de que las fuentes de luz deben ser luces lejanas o infinitas, aunque afortunadamente este suele ser el caso en los programas CAD.
Skyboxes
Quizás la aplicación más avanzada del mapeo de cubos es crear imágenes panorámicas del cielo pre-renderizadas que luego son representadas 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 proyectar el entorno para crear el mapa del cubo, de modo que el observador experimenta la ilusión de estar rodeado por la escena que se utilizó para generar el skybox. Esta técnica ha encontrado un uso generalizado 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 de tragaluces
Los mapas de cubos pueden resultar útiles para modelar con precisión la iluminación exterior. El simple hecho de modelar 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 de tragaluces). Sin embargo, mediante el uso de un mapa de cubos, se puede capturar la contribución difusa de la iluminación del tragaluz. A diferencia de los mapas de entorno en los que se utiliza el vector de reflexión, este método accede al mapa del cubo 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 de cubos 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 del cubo. Sin embargo, se ha realizado una cantidad considerable de investigación para modelar eficazmente la iluminación de tragaluces.
Reflexión dinámica
El mapeo de entorno básico utiliza un mapa de cubo estático; aunque el objeto se puede mover y distorsionar, el entorno reflejado se mantiene constante. Sin embargo, la textura de un mapa de cubos se puede actualizar constantemente para representar un entorno que cambia dinámicamente (por ejemplo, árboles meciéndose con el viento). Una forma simple pero costosa de generar reflejos dinámicos consiste en construir los mapas de cubos en tiempo de ejecución para cada fotograma. Aunque esto es mucho menos eficiente que el mapeo estático debido a los pasos de renderizado adicionales, aún se puede realizar a velocidades interactivas.
Desafortunadamente, esta técnica no se escala bien cuando están presentes múltiples 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 aproximándose a 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 de cubos . [1]
Texturas de proyección
Otra aplicación que encontró un uso generalizado en los videojuegos es el mapeo de texturas proyectivo . Se basa en mapas de cubos para proyectar imágenes de un entorno en la escena circundante; por ejemplo, una fuente de luz puntual está vinculada a un mapa de cubo 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 al 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
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. [4] [5] Las imágenes se almacenan con el origen en la parte inferior izquierda de la imagen. Las caras positivas X e Y deben invertir la coordenada Z y la cara Z negativa debe negar la coordenada X. Si se le dan las coordenadas de la cara y la textura, el vector no normalizado puede ser calculado por 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 ; flotar vc = 2.0f * v - 1.0f ; cambiar ( índice ) { caso 0 : * x = 1.0f ; * y = vc ; * z = - uc ; romper ; // POSITIVO X caso 1 : * x = -1.0f ; * y = vc ; * z = uc ; romper ; // NEGATIVO X caso 2 : * x = uc ; * y = 1.0f ; * z = - vc ; romper ; // POSITIVO Y caso 3 : * x = uc ; * y = -1,0f ; * z = vc ; romper ; // Y NEGATIVO caso 4 : * x = uc ; * y = vc ; * z = 1.0f ; romper ; // POSITIVO Z caso 5 : * x = - uc ; * y = vc ; * z = -1.0f ; romper ; // NEGATIVO Z } }
Asimismo, 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 ); flotador absY = fabs ( y ); flotador 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 ; // POSITIVO X 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 ; } // NEGATIVO X si ( ! IsXPositivo && 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 ; } // POSITIVO Y 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 NEGATIVO 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 ; } // POSITIVO Z 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 ; } // NEGATIVO Z si ( ! IsZPositivo && 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 ); }
Relacionados
Un gran conjunto de mapas de cubos gratuitos para experimentación: http://www.humus.name/index.php?page=Textures
Mark VandeWettering tomó el famoso autorretrato de MC Escher Mano con esfera reflectante y revirtió el mapeo para obtener estas imágenes de mapas de cubos: izquierda , derecha , arriba , abajo , atrás , frente . Aquí hay una demostración de three.js con estas imágenes (se ve mejor en una ventana amplia del navegador y es posible que deba actualizar la página para ver la demostración): https://web.archive.org/web/20140519021736/http://threejs.org /examples/webgl_materials_cubemap_escher.html
También puede convertir otras proyecciones ambientales en un mapa de cubos (por ejemplo, de una proyección equirrectangular a un mapa de cubos )
Referencias
- ^ Fernando, R. y Kilgard MJ (2003). El tutorial de CG: 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 cartografía ambiental
- ^ Greene, N (1986). "Mapeo ambiental y otras aplicaciones de proyecciones mundiales". Computación IEEE. Grafico. Apl . 6 (11): 21-29. doi : 10.1109 / MCG.1986.276658 .
- ^ Nvidia, enero de 2000. Resumen técnico: Reflejos perfectos y efectos de iluminación especular con mapeo ambiental de cubos. Archivado el 4 de octubre de 2008 en Wayback Machine.
- ^ https://msdn.microsoft.com/en-us/library/windows/desktop/ff476906(v=vs.85).aspx
- ^ http://www.nvidia.com/object/cube_map_ogl_tutorial.html
Ver también
- Cubo esférico cuadrilátero
- Proyección de imagen esférica