• El realismo de una escena depende de la iluminación.
• 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
• 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.
• 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)
• 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.
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
• 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);
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);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 2.0);
• 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.
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);
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();
}
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,
– 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);
– 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);
• 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:
Publicar un comentario