Escolar Documentos
Profissional Documentos
Cultura Documentos
Unidad 3
Objetivos:
I) comprender como las condiciones de iluminacin del mundo real se pueden aproximar usando
OpenGL.
II) Renderizar objetos iluminados definiendo las fuentes de luz deseadas y sus modelos de iluminacin.
III) Definir las propiedades del material de los objetos a ser iluminados.
IV) Manipular la matriz de stack para controlar la posicin de las fuentes de iluminacin.
INTRODUCCIN
La iluminacin de objetos sirve para dar una sensacin de realidad sobre los grficos, realzando
y dando la sensacin de profundidad en esquemas 3D. Un objeto en dos dimensiones que se grfica,
con fondo negro y color de objeto blanco, puede ver diferente usando iluminacin tal como se muestra
en la siguiente figura:
Figura iluminada
TIPOS DE ILUMINACIN
AMBIENTE.- Es luz esparcida en todas direcciones, muy similar a la luz del da.
DIFUSA.- Viene en una direccin, cuando choca con una superficie la mayor parte del haz de luz es
reflejado en la misma concentracin.
ESPECULAR.- Es cuando el rayo de luz incide sobre una superficie y al chocar en ella se desvan y
regresan los rayos al medio de donde salieron formando un ngulo igual a la luz incidente sobre el
objeto.
TEORA
Modos de Renderizacin
Cuando renderizamos una primitiva disponemos de dos mtodos de
rellenado. Para cambiar entre uno u otro se hace con la funcin void
glShadeModel(GLenum mode), como parmetro le pasamos uno de los siguientes
modos:
: Renderiza la primitiva con un solo color, elegido de uno de los
vrtices
dependiendo
de
la
primitiva.
GL_SMOOTH : Renderiza la primitiva interpolando el color de los vrtices.
GL_FLAT
Modelo de iluminacin
El modelo de iluminacin como hemos mencionado anteriormente es
bastante bsico y pasamos a describirlo a continuacin describiendo cada
una de sus partes.
El clculo del color se realiza en cada vrtice segn las luces que haya
Luces
Para habilitar el modo de iluminacin se realiza con la
funcin glEnable(GL_LIGHTING), cuando renderizamos en este modo la
instruccin glColor no tienen ninguna influencia ya que el color resultante
de cada vrtice es calculado a partir de los materiales del vrtice y las
luces que haya encendidas.
Disponemos de ocho luces que podemos encender o apagar con la
funcin glEnable(GL_LIGHTi) donde i =[0..7]. Cada luz la podemos configurar
estableciendo los siguientes parmetros con la funcin glLight{if}v :
Parametro
GL_AMBIENT
GL_DIFFUSE
GL_SPECULAR
(1.0, 1.0,
(0.0, 0.0,
GL_LIGHT7
(1.0, 1.0,
(0.0, 0.0,
GL_LIGHT7
GL_POSITION
GL_SPOT_DIRECTION
GL_SPOT_EXPONENT
0.0
GL_SPOT_CUTOFF
180.0
GL_CONSTANT_ATTENUATI
1.0
ON
GL_LINEAR_ATTENUATION 0.0
GL_QUADRATIC_ATTENUAT
0.0
ION
Significado
intensidad ambiente de la
luz
intensidad difusa de la luz
intensidad especular de la
luz
(x, y, z, w) posicin de la luz
(x, y, z) direccin de la luz
exponente del foco
angulo de abertura del foco
factor de atenuacin
constante
factor de atenuacin lineal
factor de atenuacin
cuadratico
Componentes de la luz
La luz tiene tres componentes: ambiente, difusa y especular:
Ambiente : Es la luz que se emite en todas direcciones y rebota en todas
direcciones.
Difusa : Luz emitida desde el punto de luz que rebota en todas las
direcciones.
Especular : Luz emtidia en una direccin que rebota segn la normal del
polgono, provoca el brillo puntual del objeto, p.e. el brillo blanco de la
bola de bola de billar negra.
Parametro
o FALSE
GL_LIGHT_MOEL_TWO_SID
0.0
E
o FALSE
GL_LIGHT_MODEL_CONTRO
GL_SINGLE_COLOR
L_COLOR
Materiales
En el modelo de renderizacin sin iluminacin definiamos el color de cada
vrtice, ahora tenemos que definir los materiales. Se definen cuatro
componentes de material para cada vrtice.
Ambiente : Es la componente del material que refleja la luz
independientemente de la direccin que venga.
Difusa : Es la componente del material que refleja segn la direccin de
procedencia de la luz.
Especular : Componente que refleja la luz especular, provoca el efecto
brillo.
Emisiva : Componente de color que se aade independientemente de la
luz recibida.
Para establecer las componentes del material lo hacemos con la
funcin glMaterial
Parametro
GL_AMBIENT
GL_DIFFUSE
GL_SPECULAR
GL_SHININESS
0.0
GL_EMISSION
Significado
componente ambiente
componente difusa
componente espcular
exponente de brillo
componete emisiva
Normales
Una de las caractersticas que se puede establecer de un vrtice es el
color (o el material si estamos en modo iluminacion), pero podemos
establecer otras caractersticas como la coordenada de la textura o la
normal que sirve para realizar los calculos de la iluminacin resultante. No
importa el orden en que se definan las caractersticas pero siempre se
har antes de definir el vrtice.
glColor3f(1.0, 0.3, 0.4); // Color del vrtice
glNormal3f(1.0, 0.0, 0.0); // Normal del vrtice
glTexCoord2f(0.0, 1.0); // Coordenada de la textura
glVertex3f(1.0, 3.2, 3.6); // Vrtice
Despues del clculo cada componente RGBA es limitada al rango [0, 1].
(A) Emisin del material
Es el valor de la componte emision del material asignada al vrtice
(B) Luz ambiente global escalada
Se calcula multiplicando la luz ambiente global por la componente
ambiente del material.
ambient light model * ambient material
(C) Contribuciones desde las fuentes de luz
La contribucin es la suma de las contribuciones de cada fuente de luz
contribucin de una luz = factor de atenuacin * efecto foco * (termino
ambiente + termino difuso + termino especular)
Factor de atenuacin
Si la luz es direccional el factor es 1 sino se calcula tal y como se ha
explicado en el apartado Luces.
Efecto foco
Si la luz es direccional el efecto foco es 1 sino se calcula tal y como
sigue:
1 si no es un foco propiamente dicho (GL_SPOT_CUTOFF es 180.0)
0 si la luz es un foco pero el vrtice cae fuera del cono
iluminado
max(vd,0)GL_SPOT_EXPONENT donde:
glPopMatrix();
// Dibujamos la escena
glTranslatef(0.0, 0.0, -5.0);
glutTeaPot(1.0);
glutSwapBuffers();
}
Valor Default
Significado
GL_AMBIENT
GL_DIFFUSE
GL_SPECULAR
GL_POSITION
GL_SPOT_DIRECTION
GL_SPOT_EXPONENT
0.0
spotlight exponent
GL_SPOT_CUTOFF
180.0
GL_CONSTANT_ATTENUATI
ON
1.0
GL_LINEAR_ATTENUATION
0.0
GL_QUADRATIC_ATTENUA
TION
0.0
PRCTICA
1) Cambie el color de la luz por una luz de color azul
2) Cambie la iluminacin para que sea por el lado izquierdo en vez del derecho,
es decir que la parte ms oscura este del lado derecho.
3) Genere un barrido de luz que sea de derecha a izquierda y cuando llegue al otro
extremo cambie la direccin de izquerda a derecha y as en ciclo. Esto dar la impresin
de que una persona est alumbrando la esfera con una lmpara y la gira de un sentido a
otro.
ENTREGA: Viernes 26 de Febrero, 2016.
APNDICE 1
#include "stdafx.h"
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
void init(void)
{
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 50.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidSphere(1.0, 20, 16);
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-1.5, 1.5, -1.5*(GLfloat)h / (GLfloat)w,
1.5*(GLfloat)h / (GLfloat)w, -10.0, 10.0);
else
glOrtho(-1.5*(GLfloat)w / (GLfloat)h,
1.5*(GLfloat)w / (GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
REFERENCIA:
sitio web:
http://dmi.uib.es/~josemaria/OpenGL/Iluminacion.html