Atenuación, Proyecciones y Texturizado en OpenGL: Conceptos Esenciales de Gráficos por Computadora
Atenuación de la Luz
En la vida real, a medida que la energía radiante de una fuente luminosa viaja a través del espacio, su intensidad se atenúa. Es decir, con la distancia, los rayos luminosos pierden “fuerza” y apreciamos menos sus efectos. Existen dos tipos de atenuaciones:
Atenuación Lineal
Este tipo de atenuación afecta a las fuentes de luz Posicional y Reflector. Significa que una superficie próxima a la fuente luminosa recibe una intensidad de luz incidente mayor que otra superficie distante, de acuerdo a una distancia “d” lineal. OpenGL calcula este factor de atenuación con la fórmula correspondiente.
Atenuación Radial
Esta atenuación se presenta en las fuentes de luz Spotlight. Indica que los objetos recibirán menos intensidad luminosa conforme su posición se aleje de la dirección central.
Proyecciones
Las proyecciones se encargan de realizar el “recorte” y de convertir la información de la escena a dos dimensiones. Son la analogía al uso de una cámara: se tiene una posición, una ubicación a la cual se apunta y se agrega un factor de inclinación. Estas propiedades influyen en la forma en que se ve la escena en nuestro dispositivo de despliegue.
- Proyección Ortogonal
- Proyección en Perspectiva
Elementos de la Proyección
Posición de visualización, también llamada “foco” o “punto de proyección”
El punto de proyección es el lugar matemático en donde se encontrará el observador. También es el lugar en donde coinciden las líneas de proyección.
Líneas de proyección
Son líneas rectas que van desde la información de la escena (vértices) hasta el punto de proyección.
Plano de proyección
Es un plano que se encuentra entre el punto de proyección y la información de la escena. Las líneas de proyección que pasen por el plano representarán la información que será visualizada en el dispositivo de despliegue en dos dimensiones.
Volumen de visualización
Es el espacio dentro de nuestro escenario que podrá ser visualizado.
Ambos tipos de perspectivas realizan la conversión de la información de la escena a dos dimensiones con ayuda de las líneas de proyección y el plano de proyección.
Proyección Ortogonal
- a) El punto de proyección se encuentra en el infinito.
- b) Las líneas de proyección son paralelas entre sí.
- c) Las líneas de proyección son ortogonales al plano de proyección.
- d) El volumen de visualización es un prisma rectangular.
Debido a las características de las líneas de proyección y del volumen de visualización, esta proyección “ignora” la profundidad a la cual se encuentren los objetos en la escena. Es muy utilizada en aplicaciones de diseño para facilitar la creación de modelos.
Proyección en Perspectiva
- a) El punto de proyección se encuentra en un punto definido dentro del escenario matemático.
- b) Las líneas de proyección cruzan el plano de proyección con un ángulo.
- c) El volumen de visualización es una pirámide truncada (frustum).
Debido a sus características, este tipo de proyección da la sensación de profundidad en los objetos; sin embargo, ocasiona que los objetos se distorsionen y que las líneas paralelas no puedan ser percibidas como tales.
Funciones en OpenGL
Existen dos formas de crear estas perspectivas:
glFrustum(left, right, bottom, top, near, far);
gluPerspective(alpha, aspect, near, far);Por lo tanto, la forma en que vemos los objetos del escenario variará dependiendo de su distancia al plano de proyección.
Cámara Sintética
Consiste en tratar de aproximar el comportamiento de la cámara en un ambiente virtual al de una cámara en la vida real.
Texturizado
Los Modelos de Color y de Iluminación Locales nos ayudan a determinar, teóricamente, el color de cada uno de los píxeles que conforman una superficie. En realidad son una aproximación y nos dan el color, o degradado de color, sobre la superficie.
Color Liso
Asigna un único color uniforme a toda la superficie.
Mapeo de Texturas (Texture Mapping)
Es la regla de correspondencia para aplicar una textura a una superficie. Por lo tanto, el mapeo de texturas es “la acción de asignar a cada píxel de una superficie su correspondiente texel de una textura”.
Textura
Es un arreglo de datos que contiene información de color y transparencia. Actualmente, también puede contener información de normales, profundidades, sombras, entre otros. Las texturas se aplican a nivel de píxel y permiten generar patrones que, mediante modelos de iluminación, serían muy costosos computacionalmente.
Cada uno de los elementos del arreglo de datos que conforman una textura recibe el nombre de Texel (Texture Element o Texture Pixel).
Tipos de Texturas
Por generación
- a) Archivos almacenados en memoria: Texturas que se encuentran en archivos de imágenes (.bmp, .jpg, .tga, .raw, etc.) en un medio de almacenamiento.
- b) Procedimentales (procedurales): Texturas generadas mediante la evaluación de una función y/o algoritmo, que da como resultado valores de color correspondientes a los texels.
Por tamaño
- Texturas de una dimensión (1D): Solo tienen un texel de altura o de ancho.
- Texturas de dos dimensiones (2D): Tienen más de un texel de altura y de ancho.
- Texturas de tres dimensiones (3D): Son texturas con volumen.
Espacio de Textura
No se puede hacer la asignación directa de un texel a un píxel, debido a los siguientes factores:
- a) La posición de la superficie puede cambiar durante la ejecución del programa, por lo que también cambian los texels asignados.
- b) El tamaño de una textura no siempre corresponde al tamaño de la superficie a la cual será aplicada.
Por ello se utiliza el Espacio de Textura: la textura está definida mediante coordenadas, las cuales serán asignadas a las coordenadas cartesianas de los vértices de la superficie.
El Espacio de Textura define las coordenadas que serán asignadas a los vértices de la superficie. No importa el tamaño de la textura: las coordenadas que definen la textura (s, t) o (u, v) siempre estarán entre los valores [0, 1]. Por ello, generalmente se trabaja con texturas rectangulares, para facilitar la obtención de las coordenadas en el espacio de textura.
Algo muy importante que recalcar es que, aun cuando la textura esté definida entre valores de [0, 1], las coordenadas asignadas a los vértices pueden o no estar entre dichos valores. Estas últimas, llamadas Coordenadas de Texturizado, son las coordenadas finales que reciben los vértices de la superficie para la asignación de los texels de la textura.
Texturizado en OpenGL
Habilitar y configurar el Mapeo de Texturas
Para habilitar el mapeo de texturas en OpenGL se utiliza la siguiente línea en la función de configuración (InitGL):
glEnable(GL_TEXTURE_2D);La configuración consiste en determinar el comportamiento de la textura con Coordenadas de Texturizado mayores a 1 y/o menores a 0:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S | GL_TEXTURE_WRAP_T, GL_CLAMP | GL_REPEAT);Crear una Textura
OpenGL no tiene funciones propias para “crear” texturas: es tarea del programador incorporar el algoritmo de creación (procedimentales) o el lector de archivos de imágenes (almacenadas) para obtener la información de color.
glTexImage2D(tipo, #mipmaps, formato, ancho, alto, borde, formato datos, tipo datos, datos);
glGenTextures(x, &TextureNames);Especificar la superficie a la cual se aplicará
Se utiliza la función:
glBindTexture(tipo, indiceTextura);Las definiciones de superficies que se encuentren después de glBindTexture() se verán afectadas por la textura, siempre y cuando tengan Coordenadas de Texturizado. Si indiceTextura = 0, no se utilizará textura.
Coordenadas de Texturizado
Las superficies que se deseen dibujar con una textura deberán tener asignados a sus vértices sus correspondientes Coordenadas de Texturizado:
glTexCoord2f(s, t);
glVertex3f(x, y, z);Filtros
Son “algoritmos que se aplican a las texturas cuando éstas tienen que ser redimensionadas para poder ser aplicadas a una superficie”.
En aplicaciones de computación gráfica en tiempo real, los objetos cambian constantemente de tamaño, por lo que la utilización de filtros es continua. Debe existir un compromiso entre la calidad y el tiempo de respuesta de un filtro.
Filtros más utilizados
GL_NEARESTGL_LINEARGL_NEAREST_MIPMAP_NEARESTGL_LINEAR_MIPMAP_NEARESTGL_NEAREST_MIPMAP_LINEARGL_LINEAR_MIPMAP_LINEAR- Filtro anisotrópico (Anisotropic Filtering)
Filtro MIP Map
La técnica de MIP maps o Mipmaps (multum in parvo, “mucho en un pequeño espacio”) consiste en tener una o varias copias precalculadas y optimizadas de una textura. Estas nuevas copias difieren de la original en su tamaño y se utilizan cuando el tamaño de la superficie donde serán aplicadas difiere en un porcentaje del tamaño de la textura original.
Filtro Anisotrópico
Los filtros originales consideraban que la textura siempre se encontraría ortogonal al espectador; sin embargo, esto no siempre sucede (por ejemplo, pisos y techos), por lo que sus resultados no siempre son favorables. El filtro anisotrópico (dependiente de la dirección) soluciona esta problemática.
Cinemática Inversa (Inverse Kinematics)
La cinemática es el estudio de cómo se mueven las cosas. Describe el movimiento de una estructura jerárquica. Generalmente se trabaja con una base y un efector final.
Cinemática Directa
Es el proceso de realizar los cálculos que describen la geometría en el espacio de mundo, con base en los valores de los grados de libertad (DOF).
Cinemática Inversa
El objetivo de la cinemática inversa es calcular el vector de las articulaciones que hace que el efector final alcance cierta posición. Su cálculo es más complicado que el de la cinemática directa, ya que pueden existir muchas soluciones o, en ocasiones, ninguna. Se utilizan ecuaciones muy complejas y costosas computacionalmente para resolver el sistema.
Métodos para resolver la Cinemática Inversa
- Jacobiano: trabaja con derivadas parciales. Su ventaja es que pueden aprovecharse varias propiedades para simplificar las operaciones, pero conlleva una pérdida en la calidad de los resultados.
- Denavit-Hartenberg: hace uso de matrices para representar los posibles movimientos en una articulación.
Antialiasing
El antialiasing sirve para ocultar los típicos “dientes de sierra” en los bordes de las figuras. Cuanto más antialiasing se aplique, más costoso será de procesar para el sistema, es decir, mayor será la carga de cómputo.