jueves, noviembre 09, 2006

Capítulo 5: Lighting

Efecto de la Iluminación

• El realismo de una escena depende de la iluminación.

Lighting en OpenGL
• OpenGL aproxima la iluminación, descomponiendo la luz en tres componentes: R, G, B.

• El color de una fuente de luz se caracteriza por la cantidad de rojo, verde y azul que puede emitir.
• Las propiedades de los materiales se caracterizan por la cantidad de luz roja, verde y azul que pueden reflejar en distintas direcciones.
• OpenGL utiliza una aproximación “liviana” para realizar el proceso en tiempo real.
• El modelo de lighting está dividido en cuatro componentes:
– Ambiente
– Difusa
– Especular
– Emisivo

Modelo de Lighting
• Componente Ambiente:
– Es luz que a sido esparcida por todo el ambiente y es imposible de determinar su origen.
– Cuando golpea una superficie se esparce igualmente en todas direcciones.
– Una sala iluminada tiene una gran componente ambiente.
• Componente Difusa:
– La luz viene de una dirección, pero cuando golpea una superficie se esparce igualmente en todas las direcciones.
– Una luz que proviene de una posición particular tiene una componente difusa.
• Componente Especular:
– La luz viene de una dirección, y cuando golpea una superficie se refleja en una dirección en particular.
– Un láser bien enfocado que choca con un espejo produce casi un 100% de reflexión especular.
– Ejemplos de materiales: metales pulidos y plásticos.

Colores de Materiales
• El color de los materiales depende de luz RGB que llega y de la cantidad que se refleja.
• A un material se le asignan diferentes valores de reflexión para cada componente: ambiente, difusa y especular.
• Además dispone de una propiedad de color de emisión, la cual crea la sensación de que un objeto emite luz.

Cálculo de Valores RGB
• Para una fuente de luz y materiales se definen valores RGB.
• Para una fuente de luz corresponden a la intensidad emitida de cada componente.
• Para los materiales corresponde a la capacidad de reflexión del de cada componente.
• Si una luz tiene componentes (LR, LG, LB), y un material (MR, MG, MB), sin considerar los efectos de reflectividad, el color resultante es:
– (LR*MR, LG*MG, LB*MB)

Ejemplo: Esfera Iluminada
• Definición de normales para cada vértice.
• Creación, posicionamiento y habilitación de una o más luces.
• Selección del modelo de lighting.
• Definición de las propiedades de los materiales.

Creación de Fuentes de Luz
void glLight{if}(GLenum light, GLenum pname, TYPEparam);
void glLight{if}v(GLenum light, GLenum pname, TYPE *param);

• Crea una fuente de luz: GL_LIGHT0, ... , GL_LIGHT7.
• Las características se definen por pname (ver tabla).
• param indica los valores asignados, dada la característica pname.

Valores por defecto para pname
Ejemplo de Definición y Posicionamiento de una Fuente de Luz
GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

Posición de la Fuente de Luz
• OpenGL permite ubicar una luz en el infinito o localmente:
– Direccional: está en el infinito, los rayos son paralelos. Se puede variar la dirección (x,y,z).
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

– Posicional: tiene en un posición (x,y,z) que especifica su posición en coordenadas del objeto. Luego es transformada por la matriz ModelView y almacenada en coordenadas del observador.

GLfloat light_position[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

Atenuación de la Luz
• Para luz posicional OpenGL permite atenuación de la luz:

• Ejemplo:
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.5);

Spotlights

• Cut_Off:
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0);

• Dirección:
GLfloat spot_direction[] = { -1.0, -1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);

• Concentración de la Luz:
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 2.0);

Controlando la Posición y Dirección
• OpenGL trata la posición y dirección de una fuente de luz tal cual como lo hace para la posición de una primitiva geométrica.
• Cuando se llama a glLight*(), la posición y dirección es transformada por la actual matriz de ModelView y se almacena en coordenadas del observador.
• Ejemplos:
– Luz en una posición fija.
– Luz en movimiento en torno a un objeto estacionario.
– Luz moviéndose junto con el punto de vista.

Luz en una Posición Fija
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*h/w, 1.5*h/w, -10.0, 10.0);
else
glOrtho (-1.5*w/h, 1.5*w/h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
/* later in init() */
GLfloat light_position[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, position);

Luz Moviéndose Independientemente
static GLdouble spin;
void display() {
GLfloat light_position[] = { 0.0, 0.0, 1.5, 1.0 };
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glPushMatrix();
glRotated(spin, 1.0, 0.0, 0.0);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glPopMatrix();
glutSolidTorus (0.275, 0.85, 8, 15);
glPopMatrix();
glFlush();
}

Ver Ejemplo movelight.c

Luz Moviéndose con el Punto de Vista
GLfloat light_position() = { 0.0, 0.0, 0.0, 1.0 };
glViewport(0, 0, (GLint) w, (GLint) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
static GLdouble ex, ey, ez, upx, upy, upz;
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
gluLookAt (ex, ey, ez, 0.0, 0.0, 0.0, upx, upy, upz);
glutSolidTorus (0.275, 0.85, 8, 15);
glPopMatrix();
glFlush();
}


Seleccionando un Modelo de Lighting
• Para seleccionar las propiedades del modelo:
void glLightModel{if}(GLenum pname, TYPEparam);
void glLightModel{if}v(GLenum pname, TYPE *param);

– pname define la característica (ver tabla).
– param especifica el valor.

Parámetros del Modelo de Lighting
• Luz Ambiente Global:
– Adicionalmente, se puede definir una luz ambiente que no viene de ningún lado:
GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);

• Punto de Vista Local o Infinito:
– OpenGL permite definir un punto de vista local o infinito.
– Es importante en el cálculo de la reflexión especular.
– Para habilitar modelo local:
– glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);

• Lighting en los dos lados:
– OpenGL permite activar cálculo de lighting para la cara Front y Back de cada polígono:
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

Definición de las Propiedades de los Materiales
• voidglMaterial{if}(GLenum face, GLenum pname, TYPEparam);
• voidglMaterial{if}v(GLenum face, GLenum pname, TYPE *param);
– face: GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.
– pname: propiedad (ver tabla).
– Param: valor.

No hay comentarios: