Mapeo de cubos
En gráficos por computadora, el mapeo de cubos es un método de mapeo de entornos que utiliza las seis caras de un cubo como la forma del mapa. El entorno se proyecta sobre los lados de un cubo y se almacena como seis texturas cuadradas, o se despliega en seis regiones de una sola textura. El mapa del cubo 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 anterior 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 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 usan comúnmente en la proyección de video 360.
Historia
[editar]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”,[2] diez años después de que Jim Blinn y Martin Newell propusieron por primera vez el mapeo ambiental. Sin embargo, las limitaciones de hardware en la capacidad de acceder a seis imágenes de texturas 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 Nvidia GeForce 256. Nvidia promocionó el mapeo de cubos en hardware como “una función 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 cubo 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 favorito de mapeo de entornos.
Ventajas
[editar]El mapeo de cubos es preferible 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 por 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.
Precediendo al mapeo de cubos, el mapeo de esferas tiene muchos defectos inherentes que lo hicieron 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 esfera 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 la imagen se pueden reducir usando ciertos trucos y técnicas como el "estiramiento previo", 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 un cálculo más complicado.
Por el contrario, el mapeo de cubos requiere solo una sola 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 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 usar imágenes de menor resolución para lograr la misma calidad. Aunque manejar las costuras del mapa del cubo es un problema, se han desarrollado algoritmos para manejar el comportamiento de las costuras y dar como resultado un reflejo perfecto.
Desventajas
[editar]Si se introduce en la escena un nuevo objeto o una nueva iluminación, 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
[editar]Resaltados especulares estables
[editar]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 utiliza 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 un brillo proporcional a la distancia desde los vértices de la malla, lo que finalmente 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 brindan 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 mediante la interpolación 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 claros que representan la curvatura con mayor precisión. Otra ventaja de este método es que escala bien, ya que se pueden codificar reflejos especulares adicionales en la textura sin aumentar el costo de renderizado. Sin embargo, este enfoque tiene la limitación de que las fuentes de luz deben ser luces distantes o infinitas, aunque afortunadamente esto suele ser el caso en los programas CAD.
Skyboxes
[editar]Los renderizados que usan mapas de cubos pueden verse mejor en escenas al aire libre. (La izquierda es con un mapa de cubos, la derecha es con una luz solar básica). Renderizado en ciclos Blender.
Quizás la aplicación más avanzada del mapeo de cubos es crear imágenes panorámicas del cielo renderizadas previamente que luego el motor gráfico representa 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 palco. 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 Skylight
[editar]Los mapas de cubos pueden ser útiles para modelar con precisión la iluminación exterior. Simplemente modelar la luz solar como una única luz infinita simplifica demasiado 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, mediante el uso de un mapa de cubo se puede capturar la contribución difusa de la iluminación del tragaluz. A diferencia de los mapas ambientales en los que se usa 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 adecuadamente un tragaluz es muy complejo; un proceso reciente está calculando 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 efectivamente la iluminación del tragaluz.
Reflexión dinámica
[editar]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, una textura de mapa de cubo 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 crear 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 representación adicionales, aún se puede realizar a velocidades interactivas.
Desafortunadamente, esta técnica no escala bien cuando hay varios objetos reflectantes presentes. 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 dinámicos de cubos se pueden generar recursivamente aproximándose a los efectos que normalmente se generan usando el trazado de rayos.
Iluminación global
[editar]En ICCVG 2002 se presentó un algoritmo para el cálculo de iluminación global a tasas interactivas utilizando una estructura de datos de mapa de cubo. [1]
texturas de proyección
[editar]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 que un desarrollador de juegos logre 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
[editar]Una textura de cubo indexa seis mapas de textura de 0 a 5 en orden Positivo X, Negativo X, Positivo Y, Negativo Y, Positivo Z, Negativo Z.[4][5] Las imágenes se almacenan con el origen en la parte inferior izquierda del imagen. Las caras positivas X e Y deben invertir la coordenada Z y la cara negativa Z debe negar la coordenada X. Si se le da la cara y las coordenadas de 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)
{
// convert range 0 to 1 to -1 to 1
float uc = 2.0f * u - 1.0f;
float vc = 2.0f * v - 1.0f;
switch (index)
{
case 0: *x = 1.0f; *y = vc; *z = -uc; break; // POSITIVE X
case 1: *x = -1.0f; *y = vc; *z = uc; break; // NEGATIVE X
case 2: *x = uc; *y = 1.0f; *z = -vc; break; // POSITIVE Y
case 3: *x = uc; *y = -1.0f; *z = vc; break; // NEGATIVE Y
case 4: *x = uc; *y = vc; *z = 1.0f; break; // POSITIVE Z
case 5: *x = -uc; *y = vc; *z = -1.0f; break; // NEGATIVE Z
}
}
Asimismo, un vector se puede convertir al índice de cara y 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;
// POSITIVE X
if (isXPositive && absX >= absY && absX >= absZ) {
// u (0 to 1) goes from +z to -z
// v (0 to 1) goes from -y to +y
maxAxis = absX;
uc = -z;
vc = y;
*index = 0;
}
// NEGATIVE X
if (!isXPositive && absX >= absY && absX >= absZ) {
// u (0 to 1) goes from -z to +z
// v (0 to 1) goes from -y to +y
maxAxis = absX;
uc = z;
vc = y;
*index = 1;
}
// POSITIVE Y
if (isYPositive && absY >= absX && absY >= absZ) {
// u (0 to 1) goes from -x to +x
// v (0 to 1) goes from +z to -z
maxAxis = absY;
uc = x;
vc = -z;
*index = 2;
}
// NEGATIVE Y
if (!isYPositive && absY >= absX && absY >= absZ) {
// u (0 to 1) goes from -x to +x
// v (0 to 1) goes from -z to +z
maxAxis = absY;
uc = x;
vc = z;
*index = 3;
}
// POSITIVE Z
if (isZPositive && absZ >= absX && absZ >= absY) {
// u (0 to 1) goes from -x to +x
// v (0 to 1) goes from -y to +y
maxAxis = absZ;
uc = x;
vc = y;
*index = 4;
}
// NEGATIVE Z
if (!isZPositive && absZ >= absX && absZ >= absY) {
// u (0 to 1) goes from +x to -x
// v (0 to 1) goes from -y to +y
maxAxis = absZ;
uc = -x;
vc = y;
*index = 5;
}
// Convert range from -1 to 1 to 0 to 1
*u = 0.5f * (uc / maxAxis + 1.0f);
*v = 0.5f * (vc / maxAxis + 1.0f);
}
Véase también
[editar]- Cubo esférico cuadrilátero
- Proyección de imagen esférica
Referencias
[editar]- ↑ Fernando, R. & Kilgard M. J. (2003). The CG Tutorial: The Definitive Guide to Programmable Real-Time Graphics. (1st ed.). Addison-Wesley Longman Publishing Co., Inc. Boston, MA, USA. Chapter 7: Environment Mapping Techniques
- ↑ Greene, N (1986). «Environment mapping and other applications of world projections». IEEE Comput. Graph. Appl. 6 (11): 21-29. doi:10.1109/MCG.1986.276658.
- ↑ «Cube Environment Mapping». web.archive.org. 4 de agosto de 2003. Archivado desde el original el 4 de agosto de 2003. Consultado el 6 de abril de 2023.
- ↑ «Introduction To Textures in Direct3D 11 - Win32 apps | Microsoft Docs».
- ↑ «Chapter 19. Image-Based Lighting».