Professional Documents
Culture Documents
390nm
720 nm
El color que vemos en los objetos es resultado de la luz reflejada por su superficie El negro es la ausencia de color. Un objeto negro no refleja nada El blanco es la combinacin de todos los colores. Un objeto blanco refleja todas la luz que le llega
El cerebro mezcla la combinacin de las tres y devuelve un solo color resultado De esta forma, cualquier color que vemos es en realidad una combinacin de ondas con longitudes dentro del espectro visible
Espacio de color
Es un espacio 3D cuyas dimensiones son las componentes R, G y B Variando cada eje entre 0 y 1 obtenemos el cubo de color, que incluye todos los colores visibles al ojo humano G
Verde (0,1,0)
Amarillo (1,1,0)
Negro (0,0,0)
Rojo (1,0,0)
R
Azul (0,0,1) Magenta (1,0,1)
Sombreado de polgonos
Para definir el color activo (con el que se pintan los vrtices) se usa:
void glColor3f (GLfloat rojo, GLfloat verde, GLfloat azul) void glColor3ub (GLfloat rojo, GLfloat verde, GLfloat azul)
Si todos los vrtices tienen el mismo color, todo el polgono es constante Si cada vrtice tiene un color diferente, el color del interior del polgono depender del modo de sombreado elegido: G
Modo plano: el color del polgono es el del ltimo vrtice glShadeModel (GL_FLAT) Modo interpolado: el color del polgono se deduce a partir del color de cada vrtice glShadeModel (GL_SMOOTH)
// Activa el sombreado suave glShadeModel (GL_SMOOTH); // Dibuja el tringulo glBegin (GL_TRIANGLES); // Vrtice rojo glColor3ub (255, 0, 0); glVertex3f (100, 0, 0); // Vrtice verde glColor3ub (0, 255, 0); glVertex3f (0, 100, 0); // Vrtice azul glColor3ub (0, 0, 255); glVertex3f (0, 0, 100); glEnd();
24 bits
Bits de color
Si el sistema operativo no puede mostrar 24 bits color, ste busca los colores ms adecuados --> no es preciso cambiar el cdigo! Lgicamente, la calidad de la imagen ser diferente
8 bits
Si el nmero de bits color es pequeo, podemos indicarle a OpenGL que use tramas para aproximar el color real:
glEnable (GL_DITHER);
Desventajas
no permite efectos de iluminacin
void PanelVista_Paint(TObject *Sender) { switch (ModoColor) { case 2: // modo slido glPolygonMode(GL_FRONT,GL_FILL); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); break; case 1: // modo almbrico glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT); } // Transformacin de vista glPushMatrix(); gluLookAt (...); // dibujamos los objetos RenderWorld(); glPopMatrix(); }
Iluminacin
Luz ambiente
Es la luz que no viene de ninguna direccin particular Aunque provenga de una fuente, despus de mltiples rebotes por la escena ha perdido la direccionalidad Los objetos iluminados por esta luz la reciben de igual manera en todas sus superficies y en todas direcciones
Materiales
En el mundo real, los objetos tienen color por s mismos El color del material se define segn las longitudes de onda que refleje Bajo una luz blanca, los objetos aparecen con sus colores naturales
(1.0, 1.0, 1.0) (0.5, 0.2, 1.0)
En general, la luz emitida es el resultado de la luz que llega, escalada por los coeficientes del material
(1, 1, 0)
(1, 0.5, 0)
GLfloat mrojo[4]= {1,0,0,1}; GLfloat mverde[4]={0,1,0,1}; glBegin (..) glMaterialfv(GL_FRONT, GL_AMBIENT, mrojo); ... glMaterialfv(GL_FRONT, GL_AMBIENT, mverde); ... glEnd();
Luz difusa
La fuente tiene una localizacin y una direccin particular Una vez toca la superficie del objeto, se refleja en todas direcciones
Luz incidente
Ni
Luz especular
Tambin es direccional, pero el reflejo se produce en una direccin concreta Produce un punto brillante en la superficie que ilumina --> reflejo especular
Luz incidente
Ni
Reflexin especular ideal Reflexin difusa
Estos ngulos se usan en conjuncin con la iluminacin y las propiedades de los materiales para obtener el color de cada vrtice A partir del color de los vrtices, se interpola el interior de los polgonos
Vectores normales
Para obtener los ngulos hay que conocer la normal a la superficie Para especificar la normal activa:
void glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz) void glNormal3fv (GLfloat n[3])
N=<nx, ny, nz>
Las normales deben tener longitud 1 Si queremos que OpenGL normalize los vectores automticamente:
glEnable (GL_NORMALIZE)
glEnable (GL_LIGHTING); // Seleccionar el material glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, Material); // Fuente de luz glLightfv (GL_LIGHT0, GL_AMBIENT, LuzAmbiente); glLightfv (GL_LIGHT0, GL_DIFFUSE, LuzDifusa); glLightfv (GL_LIGHT0, GL_POSITION, PosLuz); glEnable (GL_LIGHT0); glBegin (..) // Dibujar el objeto glNormal3f(...); glVertex3f(...); ... glNormal3f(...);
coef=128
coef=32
coef=2
glEnable (GL_LIGHTING); // Seleccionar el material glMaterialfv (GL_FRONT, GL_SPECULAR, Material); glMaterialf (GL_FRONT, GL_SHININESS, 32); // Fuente de luz glLightfv (GL_LIGHT0, GL_AMBIENT, LuzAmbiente); glLightfv (GL_LIGHT0, GL_POSITION, PosLuz); glEnable (GL_LIGHT0); glBegin (..) // Dibujar el objeto glNormal3f(...); glVertex3f(...); ... glNormal3f(...);
Este trmino no afecta al resto de objetos En ese caso, habra que crear una fuente de luz en la misma posicin del objeto
N N N
1 f at = kc + kl d + k q d 2
glLightf (GLenum luz, GL_CONSTANT_ATTENUATION, GLfloat kc) glLightf (GLenum luz, GL_LINEAR_ATTENUATION, GLfloat kl) glLightf (GLenum luz, GL_QUADRATIC_ATTENUATION, GLfloat kq)
Focos de luz
Con un foco de luz, decidimos en qu direccin se radia la luz Para indicar la direccin
void glLightfv (Glenum luz, GL_SPOT_DIRECTION, GLfloat dir[3])
GL_SPOT_CUTOFF
GL_
SPO
T_D IRE C
TIO N
void PanelVista_Paint(TObject *Sender) { switch (ModoColor) { case 3: // modo iluminacin glEnable (GL_LIGHTING); glLightfv (GL_LIGHT0, GL_AMBIENT_AND_DIFFUSE, Luz); glLightfv (GL_LIGHT0, GL_POSITION, LuzPos); glEnable (GL_LIGHT0); glEnable (GL_COLOR_MATERIAL); glColorMaterial (GL_FRONT, GL_AMBIENT_AND_DIFFUSE); } glPushMatrix(); glLightfv (GL_LIGHT1, GL_DIFFUSE, FocoLuz); glLightfv (GL_LIGHT1, GL_POSITION, FocoPos); glLightfv (GL_LIGHT1, GL_SPOT_DIRECTION, FocoDir); glLightf (GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.00001); glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 20); glEnable (GL_LIGHT1); gluLookAt (...); RenderWorld(); glPopMatrix(); }