martes, 8 de mayo de 2007

Previo 8

1.- Investigue como crear y definir una fuente de luz en opengl creación de la luz:
CREACION DE FUENTES DE LUZ
Las propiedades de una fuente de luz son el color, posición y dirección. El comando usado para especificar todas las propiedades de una luz es glLight*(), tiene tres argumentos para identificar la luz que se está utilizando, la propiedad y el valor deseado para esapropiedad.
Después de definir las características de las luces, hay que encenderlas con el comando glEnable(). También hay que llamar a este comando con el parámetro GL_LIGHTING , de esta forma se preparar OpenGL para desarrollar los cálculos de Iluminación.

¿Cuantas luces se pueden definir?:
Podemos tener al menos ocho fuentes de luz en la escena (puede haber más, depende de la implementación de OpenGL. OpenGL necesita realizar cálculos para determinar cuanta luz recibe cada vértice de cada fuente de luz. El incremento del número de luces influye en una ejecución más lenta.

Parametrización de la fuente de luz

void glLight{if}[v] (GLenum light, GLenum pname, TYPE param )
Crea la luz especificada por light, la cual puede ser GL_LIGHT0, GL_LIGHT1,
…GL_LIGHT7. Las características de la luz quedan definidas por pname. El argumento
param indica los valores que establece la característica pname; si se utiliza la versión de
vector(v) pname es un puntero a un grupo de valores, o el propio valor si la versión sin vector es la que estamos usando(i,f).
Valores por defecto para el parámetro pname de glLLight*().
Tipos de luces
En OpenGL existen tres tipos fundamentales de luces:
Luces direccionales
Luces locales
Focos
Todos los tipos de luces permiten definir una componente ambiente, una difusa y una especular con componentes RGBA.
Definir las fuentes de luz (propiedades de cada una de las luces).
GLvoid glLightfv(GLenum light, GLenum pname, const GLfloat *params);
Light: la luz a la que se esté haciendo referencia (GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, etc.).
*params, es un array de valores RGBA, cada valor define el porcentaje de intensidad de cada color que tiene la luz.
Luces direccionales
Una luz direccional esta situada en el infinito
Definir el vector direccional
float difusa[3]={1.0,0.0,0.0};
float direccion[4]={1.0,1.0,1.0,0.0};
glLightfv(GL_LIGHT0, GL_POSITION, direccion};
glLightfv(GL_LIGHT0, GL_DIFFUSE,difusa);
Luces locales
Las luces locales se definen de la misma forma que las direccionales solo que el cuarto elemento del vector vale uno.
float difusa[3]={1.0,0.0,0.0};
float posicion[4]={1.0,1.0,1.0,1.0};
glLightfv(GL_LIGHT0, GL_POSITION, posición};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difusa);
Focos de luz
El foco viene definido como: una luz local, una dirección o una apertura del foco.
float difusa[3]={1.0,0.0,0.0};
float posicion[4]={1.0,1.0,1.0,1.0};
float direccion[3]={1.0,1.0,1.0};
glLightfv(GL_LIGHT0, GL_POSITION, posicion};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difusa);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direccion); //Dirección del foco
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 20); // ángulo de corte entre 0 y 180

Color de la luz
OpenGL permite asociar a cualquier luz tres parámetros relacionados con el color:
GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR. El parámetro GL_AMBIENT se refiere a la intensidad RGBA de la luz ambiente que una fuente de luz añade a la escena. El valor por defecto es que no hay luz ambiente. El parámetro GL_DIFFUSE es el que está más relacionado con el concepto que tenemos normalmente de “color de una luz”; se refiere a la intensidad RGBA de la luz difusa que una fuente de luz añade a la escena. El valor por defecto es (1.0, 1.0, 1.0, 1.0) para GL_LIGHT0 que produce una luz blanca brillante. El valor por defecto para GL_LIGHT1… GL_LIGHT7 es (0.0, 0.0, 0.0, 0.0). El parámetro GL_SPECULAR afecta a el color del brillo especular en un objeto. Un objeto como un vaso tiene una luz especular que es el color de la luz que está brillando en él, normalmente blanca. Si queremos crear un efecto realista, el parámetro GL_SPECULAR y GL_DIFFUSE se deben establecer al mismo valor.

Habilitación y desabilitación de luces
Para que las luces tengan efecto se debe activar el cálculo del modelo de iluminación utilizando las luces usando la llamada: glEnable(GL_LIGHTING) y para deshabilitarlo glDisable(GL_LIGHTING);
y activar cada una de las luces individuales que se quieran utilizar con
glEnable(GL_LIGHTn) y deshabilitarlas glDisable(GL_LIGHTn);

Luz por defaul y características por defaul
Es una luz ambiente básica la cual especificará como se realiza la iluminación de la escena en cuanto a si las luces afectan a las dos partes de un objeto el modelo de cálculo de la relación entre el observador y los objetos en el caso de componente especular.
Propiedades para definir del modelo básico de iluminación:
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambiente); //Valores de lacomponente ambiente base.
GlLightModelf(GL_LIGHT_MODEL_TWO_SIDE,TRUE); //las luces afectana ambas caras de un material.
GlLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, TRUE); //Coloca el modo de cálculo especular con el observador local, si no todos los cálculos se hace como si el observador estuviese situado sobre el eje Z.


2.- Investige la diferencia entre luz he iluminación(ligth/ligthing)

Habilitación y desabilitación de la iluminación (¿Cómo?)
Para la habilitación/deshabilitación de toda la iluminación dentro de una escena se utiliza:
glEnable(GL_LIGHTING);
glDisable(GL_LIGHTING);

Para que hay que habilitar o desabilitar la iluminación
Con OpenGL necesitas habilitar o deshabilitar explícitamente la iluminación. Si no
Está habilitada el color actual es mapeado al vértice pero los cálculos de normales, fuentes de luz, modelo de iluminación y propiedades de material no se producen.

3.- Investigue la definición de propiedades de material a una superficie
Ø El modelo de iluminación de OpenGL realiza una aproximación del color de un material en función de la luz que incide sobre él y la luz que es capaz de reflejar
Ø Por ejemplo una pelota perfectamente roja es aquel objeto cuyo material es capaz de absorber todas longitudes de onda excepto el rojo y es capaz de reflejar únicamente este color
Ø Los materiales tienen dos propiedades sobre sus colores, que indican cómo influye cada una de las propiedades de un rayo de luz sobre él
Ø Ambient
Ø Diffuse
Ø También tiene tres propiedades sobre la capacidad de emisión y reflexión de luz
Ø Specular
Ø Shininess
Ø Emission
Ø Ambient
Ø se casa con la propiedad Ambient de un rayo de luz e indica cómo se va a comportar el material en función de la componente Ambient del rayo de luz incidente
Ø se refiere al color por defecto del material
Ø Diffuse
Ø se casa con la propiedad Diffuse de un rayo de luz e indica cómo se va a comportar el material en función de la componente Diffuse del rayo de luz incidente
Ø se refiere a la luz que reflejará de forma difusa
Ø Estas dos propiedades determinan el color del material y suelen tener valores aproximados sino iguales
Ø Specular
Ø se casa con la propiedad Specular de un rayo de luz e indica cómo se va a comportar el material en función de la componente Specular del rayo de luz incidente
Ø La propiedad especular se suele definir blanca o gris, de forma que los reflejos del material se degradan desde el color base de la luz incidente hasta el color definido en esta propiedad
Ø Shininess
Ø Determina la concentración de los puntos que van a reflejar la luz
Ø Puede ser un único punto o toda la superficie del objeto

Ø Emission
l Esta propiedad define la capacidad de un objeto de simular la emisión de luz
l NO es una fuente de luz
l Se definen los colores de la luz que emite
l Sirve para simular estrellas, lámparas u otros objetos similares

Características de las superficies (difusa, especular, brillantez, emisividad, etc.)
Luz ambiente
La luz ambiental es aquella que no proviene de una dirección concreta, incide sobre todas las partes del objeto por igual.
Iambiente = ka Ia
ka coeficiente de reflexión ambiental [0,1] dependiente de cada objeto.
Ia intensidad ambiental en todo punto del espacio.

Luz difusa
• La fuente tiene una localización y una dirección particular
• Una vez toca la superficie del objeto, se refleja en todas direcciones
La luz difusa es la que proviene de una dirección particular y es reflejada en todas direcciones.
Afecta a aquellas partes del objeto en las que la luz incide.
La luz difusa es reflejada por la superficie de un objeto de manera adireccional.
I L : Intensidad de la fuente
q : Angulo de incidencia [0º..90º]
Kd: Coeficiente de reflexión difusa para cada objeto [0..1]
N: Normal a la superficie (unitario)
L: Vector de iluminación (unitario)
Luz especular
• También es direccional, pero el reflejo se produce en una dirección concreta
• Produce un punto brillante en la superficie que ilumina --> reflejo especular
La luz especular procede de una dirección concreta y se refleja en una única dirección.
Produce brillos intensos.
Las reflexiones especulares son normalmente del mismo color que la fuente de luz.
La intensidad de la luz especular reflejada depende de:
La longitud de onda de la luz incidente
El ángulo de la luz incidente
Las características del material
En un espejo perfecto la dirección desde la que se observa el reflejo es la dirección de reflexión perfecta R.
La reflexión especular depende de la posición del observador.
Dependiendo de la superficie (grado de pulido) el brillo es más o menos concentrado alrededor del punto donde R y V coinciden.
BRILLOS
Se basan en la componente especular de los materiales
Produce un blanqueamiento del material
Depende del punto de vista
Produce reflejos especulares
Para realizar brillos en un material, la luz debe contener una componente especular distinta de cero:
Espec[]= {1.0f, 1.0f, 1.0f, 1.0f};
glLigth(GL_LIGHT0, GL_SPECULAR, Espec);
El material sobre el que incida también deberá tener una componente especular distinta de cero:
Glfloat especular[] = {1.0f, 1.0f, 1.0f, 1.0f}; glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT, GL_SPECULAR, especular);

La propiedad de brillo del material determina el tamaño de la superficie que va a reflejar el brillo
glMaterialf(GL_FRONT, GL_SPECULAR, mat_option);
glMateriali(GL_FRONT, GL_SHININESS, 128);

El valor de esta componente varía entre:
0 La superficie es un punto
128 Toda la superficie del objeto refleja
SOMBRAS
Ausencia de luz producida generalmente por la superposición de un cuerpo opaco entre una fuente de luz y otro cuerpo
En OpenGL las proyecciones sólo se realizan sobre objetos volumétricos
Tipos de Sombras:
Sombras Proyectadas
Sombras Volumétricas
Sombras proyectadas
Es la técnica más sencilla, y consiste en calcular una matriz de proyección sobre el plano sobre el que se quiere dibujar la sombra
Una vez calculada esta matriz, si se multiplica por la matriz del modelo, y se dibujan el resto de las figuras, éstas se estarán proyectando sobre ese plano

Sombras volumétricas
La técnica anterior es muy sencilla, pero solo sirve para dibujar esas sobras proyectadas sobre planos
Si se tiene una composición de figuras en las que unas proyectan sombras sobre otras, con la técnica anterior no se podrán representar
Para evitar esto se utiliza una matriz especial que calculará la influencia de la posición de un objeto sobre los restantes

NIEBLA
Efecto especial utilizado para difuminar una escena dando la impresión de que se halla realmente cubierta por una masa de niebla
En general consiste en difuminar el color de la escena, oscureciendo los objetos más lejanos llegando incluso a desaparecer, mientras que los objetos más cercanos aparecen más claros
El efecto niebla se puede aplicar de dos formas principalmente:
Basado en vértices
Basado en tablas

¿Como se define sobre que cara(s) de un polígono se aplican los materiales?
Se tiene la función
void glMaterial{if}{v} (GLenum face, GLenum pname, TYPE *param);
Donde:
Parámetros de glMaterial{fv}
Face: Indica la cara sobre la que se va a aplicar el material
GL_FRONT à Se aplica sobre las caras delanteras del objeto
GL_BACK à Se aplica sobre las caras internas del objeto
GL_FRONT_AND_BACK à Se aplica sobre todas las caras del objeto
Param: Indica la propiedad que se va a establecer de las ya explicadas 4.- Invetige acerca del mapeo de texturas en opengl

Carga-definición de bytmap

La carga se hace abriendo el archivo de el bitmap directamente y asignándolo a un apuntador para después pintarlo:
bool CTextura::CargarBMP(char *szNombreFichero)
{
FILE *hFichero;
AUX_RGBImageRec *Imagen;
bool bResultado=false;


if (szNombreFichero) // Comprobamos que el nombre de fichero sea correcto
{
hFichero=fopen(szNombreFichero,"r"); // Comprobamos si el fichero existe (Si podemos abrirlo)

if (hFichero) // ¿Existe el fichero?
{
fclose(hFichero); // Cerramos el handle
Crear(szNombreFichero);

Imagen=auxDIBImageLoad(szNombreFichero); // Cargamos el BMP
m_nAncho=Imagen->sizeX;
m_nAlto=Imagen->sizeY;

glTexImage2D(GL_TEXTURE_2D, 0, 3, m_nAncho, m_nAlto, 0, GL_RGB, GL_UNSIGNED_BYTE, Imagen->data);

bResultado=true;
}
}
delete Imagen->data;
delete Imagen;
return bResultado;
}

Transformación de la textura y Modos de aplicación de una textura (repeat,wrap,etc)

Se indica con la función:
El tamaño de una textura generalmente no es el mismo que el del polígono proyectado sobre el que se pega, existirán casos en que el tamaño de la textura será mayor que el del polígono proyectado y otros en que será menor.

Necesitamos especificar cómo se calculará el color final de los píxeles sobre el polígono proyectado, a partir de la imagen de textura. Por otro lado, quizás estemos interesados en que la textura se repita cada cierto intervalo de tiempo. Todo este comportamiento se fija a través de la función:

void glTexParameter{if}{v}(GLenum tipoTex, GLenum param, TYPE valor);

donde tipoTex puede ser GL_TEXTURE_1D o GL_TEXTURE_2D y param y valor pueden tomar los valores de las siguiente tabla:

Parámetro Valor
GL_TEXTURE_WRAP_S GL_CLAMP, GL_REPEAT
GL_TEXTURE_WRAP_T GL_CLAMP, GL_REPEAT
GL_TEXTURE_MAG_FILTER GL_NEAREST, GL_LINEAR
GL_TEXTURE_MIN_FILTER GL_NEAREST, GL_LINEAR,
GL_NEAREST_MIPMAP_NEAREST,
GL_NEAREST_MIPMAP_LINEAR,
GL_LINEAR_MIPMAP_NEAREST,
GL_LINEAR_MIPMAP_LINEAR
GL_TEXTURE_BORDER_COLOR cuatro valores en el intervalo [0...1]

Un ejemplo de su uso es el siguiente:
glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

Mapeo de la textura en una superficie

Se inicializa la textura antes de indicar el tipo de la superficie por ejemplo:
glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
La primera permite que las texturas se repitan en horizontal, y la segunda,
en vertical.
Con este cambio, podríamos mapear las texturas con coordenadas mayores
a 1, de manera que las texturas se repetirían, de esta manera:
glBindTexture(GL_TEXTURE_2D,texture_floor);
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0);
glVertex3f(-6.0,0.0,-6.0);
glTexCoord2d(0.0,6.0);
glVertex3f(-6.0,0.0,6.0);
glTexCoord2d(6.0,6.0);
glVertex3f(6.0,0.0,6.0);
glTexCoord2d(6.0,0.0);
glVertex3f(6.0,0.0,-6.0);
glEnd();

5.- Programa

No hay comentarios: