Documentos de Académico
Documentos de Profesional
Documentos de Cultura
B
G
R
Y
M
C
1
1
1
La figura 20 (a,b,c) muestra las representaciones en las
correspondientes bandas de la imagen en la figura 20 (a). Para obtener estas
imgenes se ha normalizado cada canal a uno independientemente,
dividindolo por 255, a continuacin se le ha restado a uno dicha cantidad y por
ltimo se ha multiplicado el resultado por 255.
7.7.4. El modelo de color YUV
Este es el formato de color que se utiliza por los estndares de TV
NTSC, PAL y SECAM. La Y representa la componente de blanco y negro y la
informacin de color U y V se aade para mostrar una imagen en color. La
transformacin es:
B
G
R
V
U
Y
100 . 0 515 . 0 615 . 0
436 . 0 289 . 0 147 . 0
114 . 0 587 . 0 299 . 0
Observemos que U = 0.492 (B - Y). y que V = 0.877 (R Y ).
Normalmente U y V son submuestreados por un factor de dos a cuatro en la
dimensin espacial, ya que el ojo humano es mucho menos sensible a estos
factores. Esto es muy til, por ejemplo, para reducir el nmero de bits utilizado
en tcnicas de compresin de imgenes.
7.7.5. El modelo de color YIQ
Este modelo se utiliza en las emisiones de TV en color. Bsicamente,
YIQ es una recodificacin de RGB para aumentar la eficiencia en la trasmisin
y para mantener la compatibilidad con los estndares de TV monocromo. De
hecho, la componente Y del sistema YIQ proporciona toda la informacin de
video que se requiere para una televisin monocromo. La conversin de RGB a
YIQ viene dada por:
B
G
R
Q
I
Y
311 . 0 523 . 0 212 . 0
321 . 0 275 . 0 596 . 0
114 . 0 587 . 0 299 . 0
Este sistema fue diseado teniendo en cuenta las caractersticas del
sistema visual humano, obteniendo mayor sensibilidad a los cambios en
luminancia que a los cambios de matiz o saturacin. As pues, este estndar
usa ms bits (o ancho de banda) para representar Y y menos para I y Q.
Es uno de los modelos que ms se utilizan. Una de sus mayores
ventajas es que las informaciones de luminancia (Y) y color (I y Q) estn
separadas, esto nos permite procesar la luminancia sin afectar al color.
Colores y sombras
25
La figura 22 (d,e,f) muestra las representaciones en las correspondientes
bandas de la imagen en la figura 22 (a).
Figura 22 - (a) Plano C del modelo CMY (b) Plano M del modelo CMY (c) Plano
Y del modelo CMY (d) Plano Y del modelo YIQ (e) Plano I del modelo YIQ (f)
Plano Q del modelo YIQ.
Observemos que la figura 22(d) es una imagen en niveles de gris de la
imagen original. Puesto que las bandas YUV tienen rangos distintos todas han
sido llevadas al [0,255] para la visualizacin. Tengamos en cuenta que tanto la
banda U como V pueden tener valores negativos.
7.7.6. El modelo de color HSI
El matiz es un atributo que describe la pureza de un color. La saturacin
es una medida del grado en el que un color puro se diluye con la luz blanca. La
utilidad del modelo de color HSI se debe principalmente a estas dos
caractersticas:
- La componente de intensidad se separa de la informacin de color
- Las otras dos componentes estn muy relacionadas con la forma en
la que el ser humano percibe el color.
Gracias a estas propiedades este modelo es muy apropiado para el
desarrollo de algoritmos de procesamiento de imgenes basados en
propiedades del sistema de visin humano.
Colores y sombras
26
7.7.7. El sistema HLS (Hue, Saturation and Luminance)
Este modelo utiliza los tres componentes bsicos del color: matiz (Hue),
saturacin (Saturation) y brillo (Luminance). Una representacin grfica
incluyendo estas tres propiedades genera el
denominado "espacio y color".
En el permetro del disco estn situados
los colores azul, magenta, rojo, amarillo, verde
y cyan, separados 60 uno de otro:
Cada punto del permetro describe un
color que es mezcla de los dos adyacentes.
Un punto que no est en el permetro
contendr una mezcla de todos. Por lo tanto,
estos puntos describen colores pastel que
contienen una cierta cantidad de blanco. La
distancia al centro (radio) indicar la
saturacin del color. El brillo (intensidad del
color) depende de la altura en el doble cono, y
es un valor entre 0 y 1.
El punto medio del disco central
describe un blanco de intensidad media.
Supongamos que, por ejemplo, comenzamos
en el permetro del cono en el ngulo cero
(color azul) y nos movemos en lnea recta
hacia arriba: estamos aadiendo ms blanco,
por lo que pasaremos por un azul claro, un azul pastel casi blanco hasta llegar
finalmente a un blanco brillante. Esto sucede con todos los colores.
La conclusin es que todos los colores convergen al blanco a medida
que avanzamos hacia el vrtice superior y hacia el negro a medida que
bajamos.
7.7.8. Modelo HSV
Fue creado a partir de un concepto intuitivo de la manera de trabajar de
un artista y su modo de mezclar colores para obtener el correcto sombreado y
la obtencin de los tonos intermedios. La seleccin y obtencin de colores en el
modelo HSV es mucho ms intuitiva que en los modelos RGB y CMY. Se basa
principalmente en el control de los valores de matiz, saturacin y valor (HSV).
Hue (Matiz): Se representa en un ngulo en torno a un eje vertical
(0...360). Los vrtices del hexgono se separaran a intervalos de 60. El rojo
est en 0, el amarillo en 60, el verde en 120 y el azul-verde opuesto al rojo
en H = 180. Los colores complementarios distan 180.
Figura 23 - Modelo HLS
Colores y sombras
27
Saturation (Saturacin): Varia
de 0 a 1. Representa la pureza de un
matiz. La pureza mxima se representa
en S = 1. En S = 0 se tiene la escala de
gris.
Value (Valor): Varia de 0 en la
cspide del cono hexagonal a 1 en la
parte superior. En la cspide se
encuentra el negro, en la parte superior
los colores de mxima intensidad.
Los conceptos de color
asociados con los trminos sombras,
tintes y tonos se representan en un plano seccional-transversal del cono
hexagonal HSV. Si se agrega negro a un matiz puro se disminuye V hacia el
lado del cono hexagonal. Por lo tanto, varias sombras se representan con
valores S=1 y 0<= V <= 1. Si se agrega blanco a un tono puro se producen
diferentes tintes a travs del plano superior del cono hexagonal, donde los
valores de los parmetros son V = 1 y 0 <= S <= 1. Diversos tonos se
especifican agregando blanco y negro, produciendo puntos de color dentro del
rea seccional-transversal triangular del cono hexagonal. Cuando V= 1 y S = 1
se tienen los matices puros. El blanco se obtiene en S = 0 y V = 1.
Figura 24 - Modelo HSV
Colores y sombras
28
7.8. Colores en OpenGL
7.8.1. Utilizacin de colores con OpenGL
OpenGL especifica un color utilizando las intensidades separadas de
componentes rojo, verde y azul. Por lo tanto un color se especifica con 3
valores positivos, y puesto que el mximo disponible en el PC para el
almacenamiento de esta informacin son 24 bits (8 bits para cada componente)
podemos modelar los colores disponibles mediante un cubo de 255 unidades
en cada cara. A este volumen lo denominamos el espacio de color RGB.
Este cubo de color contiene todos los colores que podremos utilizar en
nuestras aplicaciones, tanto en la superficie como en el interior del mismo.
El modelo de color RGBA es el que utilizamos cuando definimos un color
con la funcin glColor*; utilizamos el modelo de color indexado cuando
seleccionamos un color de dibujo indicando un ndice en una matriz de colores
disponible llamada paleta. Dentro de esta paleta, especificamos el color exacto
que queremos seleccionando las intensidades de las componentes roja, verde
y azul.
Los elementos geomtricos se dibujan con los atributos activos en cada
momento. En cualquier momento se pude modificar el valor de
los atributos, sustituyendo el nuevo valor al anterior. Los atributos
podrn apilarse y desapilarse.
La figura siguiente muestra el dibujo simple de dos
tringulos de diferentes colores. Estos se definen con la
instruccin glColor3f(red,green,blue) tal como se muestra en el
cdigo C (ver cdigo completo en el anexo, ejemplo 1).
void triangulo1(void)
{
glBegin(GL_TRIANGLES);
glColor3f(1.0,0.0,0.0);
glVertex2f(0.0,0.4);
glVertex2f(-0.4,0.0);
glVertex2f(0.4,0.0);
glEnd();
}
void triangulo2(void)
{
glBegin(GL_TRIANGLES);
glColor3f(0.0,0.0,1.0);
glColor3f(0.0,1.0,0.0);
glVertex2f(0.0,-0.4);
glVertex2f(-0.4,0.2);
glVertex2f(0.4,0.2);
glEnd();
}
Figura 25 - Tringulos
Colores y sombras
29
Listado 1 - Ejemplo de definicin de colores
A pesar de que existe una instruccin que establece el color del segundo
tringulo a azul, sta no tendr efecto ya que quedar anulado por la siguiente
instruccin que lo pone a verde.
La sintaxis de la funcin glColor es la siguiente:
Al dibujar polgonos se puede controlar que se dibujen sus aristas o solo
el interior. Es normal dibujar las aristas al realizar esquemas, mientras que
estas se suelen suprimir cuando se desea general imgenes realistas. El
control de visibilidad de las aristas se realiza con la funcin glEdgeflag(b)
donde el argumento b ser 0 o 1 dependiendo de que se active o no el dibujo
de las aristas.
Pero no slo podemos conseguir colores solidos, tambin gradientes. Eso
lo podemos llevar a la con un tringulo, por ejemplo; bastar con que le
asignemos un color distinto a cada vrtice para que OpenGL rendere la imagen
con el gradiente de color resultante entre ellos (fijmonos que estamos con lo
que se denomina, color suave). La construccin del tringulo quedar as:
Propsito: Selecciona el color actual en el modo de color RGBA.
Fichero de inclusin: <gl.h>
Sintaxis: void glColor<numero args><tipo args>. Donde nmero de argumentos
puede ser 3 4 (si hay componente alfa), y tipo de argumentos puede ser b(byte),
d(double), f(float), etc.. Por ejemplo: void glColor4b( GLbyte rojo, GLbyte verde,
GLbyte azul, GLbyte alfa); o void glColor3fv(const GLfloat *v);
Descripcin: Selecciona el color activo especificando por separado las
componentes roja, verde y azul. Algunas aceptan tambin la componente alfa (si no
se especifica vale por defecto 1.0). Las funciones con sufijo v toman un puntero a
una matriz que especifica las componentes.
Parmetros:
rojo
Especifica la componente roja del color.
verde
Especifica la componente verde del color.
azul
Especifica la componente azul del color.
alfa
Especifica la componente alfa del color. (Ver siguiente apartado)
*v
Colores y sombras
30
glBegin GL_TRIANGLES
glColor3f( 1.0,0.0,0.0 ) //color rojo
glVertex3f( 0.0,1.0,0.0 )
glColor3f( 0.0,1.0,0.0 ) //color verde
glVertex3f( -1.0,-1.0,0.0 )
glColor3f( 0.0,0.0,1.0 ) //color azul
glVertex3f( 1.0,-1.0,0.0 )
glEnd
Listado 2 - Ejemplo de definicin de un gradiente
El resultado de la coloracin de la escena es la siguiente:
Figura 26 - Gradiente
7.8.2. Modelo de color RGBA
En el modelo RGBA utilizamos la funcin glColor*( ) para seleccionar el
color actual que establece los colores rojo, verde, azul y la componente alfa (si
se utiliza transparencia). Todos los objetos dibujados despus de la aplicacin
de esta funcin tendrn el ltimo color especificado en la misma.
Canal alpha
El canal alpha no es ms que una imagen de 8 bits en escala de grises.
OpenGL interpreta esta informacin como sigue:
Un valor alpha de 0 (color negro) indica transparencia total, es
decir, que la zona del polgono afectada por este valor no se ver.
Un valor de 128 (color gris "puro") indica semitransparencia.
Un valor de 255 (color blanco) indica opacidad total
El funcionamiento es el siguiente:
El modelo RGBA de color dota a cada punto de una cuarta componente
llamada canal alfa. Este sirve para decidir que debe hacerse con ese punto si
contribuye junto con otros a colorear un pxel. Hasta ahora el citado pxel se
Colores y sombras
31
pintara del color del polgono ms cercano pero si activamos el canal alfa
obtendremos mezclas de colores para el pxel. Cada polgono contribuir en
un cierto tanto por ciento a colorear el pxel de forma que podemos obtener
interesantes efectos como emular un cristal tintado o un papel de celofn rojo,
por ejemplo:
En esta imagen se observa que
mezclando dos colores generamos un
tercero o lo que es lo mismo, que si tengo
un objeto de color rojo y le pongo delante
un papel translcido de color azul, la
interseccin de ambos se ver de color
lila.
Eso ocurre porque el polgono que
est ms cerca tiene un cierto grado de
transparencia por lo cul nos deja ver lo
que tiene detrs. A esto se le llama
Blending. Siempre se habla de una
fuente (source) y un destino (destination). El destino es el valor de color que
un pxel ya tiene asignado en el frame buffer. La fuente es el color que
viene, el color que se mezclar con el que ya tiene.
Se combinan los colores de la fuente y del destino segn el valor de
alfa que tiene cada uno de ellos. Se define una funcin de mezclado, o de
blending que, segn sea, aplicar de una forma o de otra el canal alfa de
cada color.
Para hacer esto con OpenGL se deber activar el mezclado de
colores y desactivarlo con las funciones glEnable(GL_BLEND) y
glDisable(GL_BLEND).
Para indicar como debe hacerse la mezcla se usar la funcin
glBlendFunc(Glenum factorfuente, Glenum factordestino). Dos
ejemplos:
1. glBlendFunc(GL_ONE,GL_ZERO). En este caso estamos
dando una importancia de 1 (mxima) al canal alfa de la fuente y
de 0 (nula) al canal alfa del destino. Eso equivale a decir que el
color final se compone de un 100% del de la fuente y de un 0%
del color destino por lo cual el pxel acaba siendo del color de la
fuente.
2. glBlendFunc(GL_SRC_ALPHA, GL_ONE). En este caso le
decimos que multiplique a la fuente por su valor de alfa y sume el
resultado al color destino. En este caso y asumiendo un valor de
alfa igual a 0.75 para la fuente, podramos decir que el color
resultante=(color de la fuente*0.75)+Color del destino.
Sintaxis de la funcion:
glBlendFunc(Glenumfactor_o,Glenumfactor_d):
Figura 27 - Funcionamiento
canal alpha
Colores y sombras
32
Propsito: Define el color de las funciones de mezcla.
Fichero de inclusin: <GL/gl.h>
Sintaxis: void glBlendFunc( GLenum factor_o, GLenum factor_d);
Descripcin: Selecciona los factores de origen y destino para la mezcla de colores.
Primero debemos llamar a glEnable(GL_BLEND) para activar la mezcla de colores.
Parmetros:
factor_o
GLenum: la funcin de mezcla de color en origen.
factor_d
GLenum: la funcin de mezcla de color en destino.
Retornos: Ninguno
Colores y sombras
33
Para las funciones glColor que aceptan valores enteros el rango de
valores que se acepta vara entre 0.0 y 1.0. el mximo y el mnimo valor que
puede ser almacenado en el framebuffer.
Cuando se especifican las componentes de color utilizando enteros sin
signo, estas componentes son mapeadas linealmente a valores de coma
flotante, de manera que representen valores comprendidos entre el 1.0
(intensidad total) y 0.0 (intensidad nula). Las componentes especificadas
utilizando valores enteros con signo son mapeadas linealmente a valores de
coma flotante, de manera que el valor ms positivos representa al 1.0 y el
ms negativo al 0.0
Sufijo Tipo de Dato Valor mnimo mnimo Valor de
Mapeo
Valor
Mximo
Valor Mximo de
Mapeo
B 1-byte-integer -128 -1.0 127 1.0
S 2-byte-integer -32768 -1.0 32767 1.0
I 4-byte-integer -
2.147.483.648
-1.0 2.147.483.647 1.0
Ub Unsigned 1- byte-
integer
0 0.0 255 1.0
Us Unsigned 2- byte-
integer
0 0.0 65535 1.0
Ui Unsigned 4- byte-
integer
0 0.0 4.294.967.295 1.0
Una de las primeras acciones que hay que realizar en nuestras
aplicaciones es limpiar el rea de dibujo en la que vamos a trabajar.
Propsito: Selecciona los valores de color y alfa para borrar los buffers de color.
Fichero de inclusin: <gl.h>
Sintaxis: void glClearColor(GLclampf rojo, GLclampf verde, GLclampf azul,
GLclampf alfa);
Descripcin: Selecciona los valores de relleno para borrar los buffers rojo, verde,
azul y alfa, que varan entre [0.0f,1.0f].
Parmetros:
rojo
GLclampf: la componente roja del valor de relleno.
verde
GLclampf: la componente verde del valor de relleno.
azul
GLclampf: la componente azul del valor de relleno.
alfa
GLclampf: la componente alfa del valor de relleno.
Retornos: Ninguno.
Colores y sombras
34
Limpiaremos la ventana cada vez que dibujemos una nueva imagen. Utilizando
el modelo tetradimensional RGBA podemos crear efectos en la ventana de
dibujo que interacta con otras ventanas que se encuentren debajo de ella,
manipulando la opacidad de la ventana al limpiarla.
La funcin glClearColor(GLclampf rojo, GLclampf verde, GLclampf azul,
GLclampf alfa) selecciona los valores de relleno para
borrar los buffers rojo, verde, azul y alfa, que varan entre
[0.0f,1.0f]. Su sintaxis es la siguiente:
La figura muestra un ejemplo de modelo de color
RGBA en el que se muestra la transparencia de un
cristal de color rojo que deja ver parte de la esfera verde
situada por detrs de l. El cdigo correspondiente a la
misma es el siguiente:
Figura 28 modelo
de color RGBA
Colores y sombras
35
#include <windows.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <math.h>
int idventana;
void cristal(void)
{
glShadeModel(GL_FLAT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glPushMatrix();
glTranslatef(-10,-10,-100.0);
glBegin(GL_QUADS);//Dibuja el cristal
glColor4f(1.0,0.0,0.0,0.10);
glVertex3f(0,0,0);
glVertex3f(0,10,0);
glVertex3f(10,10,0);
glVertex3f(10,0,0);
glEnd();
glPopMatrix();
glDisable(GL_BLEND);
}
void bola(void)
{
glPushMatrix();
glTranslatef(0,0,-150);
glColor4f(0.0,0.8,0.0,1.0);//Dibuja la bola amarilla
glutSolidSphere(6,20,10);
glPopMatrix();
}
void display(void)
{
GLfloat pos[4]={2.0,12.0,3.0,0.0};
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
bola();
cristal();
glutSwapBuffers();
glFlush();
}
void myReshape(GLsizei w, GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
Colores y sombras
36
glLoadIdentity();
if (h==0)
gluPerspective(20,(GLdouble)w,1.0,500.0);
else
gluPerspective(20,(GLdouble)w/(GLdouble)h,1.0,500.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glFlush();
}
void Idle(void)
{
angulo+=0.5;
if (angulo>360) angulo=0;
glutPostRedisplay();
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowPosition(0,0);
glutInitWindowSize(300,300);
idventana=glutCreateWindow("Transparencia");
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutIdleFunc(Idle);
glutMainLoop();
return 0;
}
Listado 3 - Ejemplo de definicin de transparencia
7.8.3. Modelo de color indexado
Muchos sistemas tienen frame buffer limitado en profundidad. Podemos
tener una resolucin espacial para el frame buffer de 1280x1024, pero cada
pxel tendra solo 8 bits de profundidad. Podemos dividir estos 8 bits en grupos
ms pequeos de bits para asignar rojo, verde y azul. En algunas aplicaciones
esta tcnica puede ser adecuada, pero no es muy flexible en la asignacin de
colores ya que divide los bytes en distintos grupos de bits que pueden afectar
al resultado.
Colores y sombras
37
Podemos seleccionar los colores interpretando nuestra limitacin de
profundidad (en los pxeles) como ndices mejor que como valores de color.
Estos ndices corresponden a filas o entradas en una tabla. Suponiendo que
nuestro frame buffer tiene k bits por pxel. Cada valor de pxel o ndice es un
entero entre 0 y 2
k
-1. Si podemos mostrar colores con una precisin de m bits
podremos elegir entre 2
m
rojos, 2
m
verdes y 2
m
azules. Produciremos
cualquiera de los 2
3m
colores aunque el frame buffer solo pueda especificar 2
k
colores. Utilizamos una tabla de bsqueda de colores de tamao 2
k
* 3
m,
el
programa del usuario considerar 2
k
filas de la tabla con los colores deseados
utilizando m bits para cada rojo, verde y azul.
Una vez que el usuario ha construido la tabla puede especificar un color
por su ndice que apunta a la posicin adecuada en la tabla de bsqueda de
color. Para k=m=8, una configuracin muy comn, se pueden elegir 256
colores de entre 16 millones de colores. Las 256 entradas en la tabla
constituyen la paleta de color del usuario.
Entrada Rojo Verde Azul
0 0 0 0
1 2
m
-1 0 0
. 0 2
m
-1 0
. . . .
. . . .
2
k
-1 . . .
m bits m bits m bits
Si estamos utilizando el modelo de color indexado, el color actual es
seleccionado llamando a la funcin:
void glIndex{sifd ub} (TYPE c );
void glIndex{sifd ub}v (const TYPE *c );
Sintaxis de la funcin glIndex:
Colores y sombras
38
En el modelo RGBA vimos la especificacin de glClearColor(), para el
modelo de color indexado existe su anlogo que es glClearIndex().
Formato de la instruccin glClearIndex:
Para especificar el modo indexado de color debemos seleccionar el
miembro iPixelType de la estructura PIXELFORMATDESCRIPTOR como se
muestra a continuacin:
Propsito: Selecciona el ndice de color actual para usar con las
operaciones de color.
Fichero de inclusin: <gl.h>
Sintaxis:
void glIndexd( GLdouble c);
void glIndexf( GLfloat c);
void glIndexi( GLint c);
void glIndexs( GLshort c);
void glIndexdv( const GLdouble *c);
void glIndexfv( const GLfloat*c);
void glIndexiv( const GLint *c);
void glIndexsv( const GLshort *c);
Descripcin: Esta funcin cambia el ndice de color actual al
especificado por c.
Parmetros:
c
El ndice del nuevo color para uso en las siguientes operaciones.
*c
Un puntero al ndice del nuevo color para uso en las siguientes
operaciones.
Retornos: Ninguno.
Propsito: Especifica un ndice de color para el buffer de
color.
Fichero de inclusin: <GL/gl.h>
Sintaxis: void glClearIndex(GLfloat indice);
Descripcin: Selecciona el valor de color que usaremos
para borrar el buffer de color con
glClear(GL_COLOR_BUFFER_BIT).
Parmetros:
ndice
GLfloat: el ndice de color para el buffer de color.
Retornos: Ninguno.
Colores y sombras
39
PIXELFORMATDESCRIPTOR pfd; //declaracin estructura
pfd.iPixelType = PFD_TYPE_COLORINDEX; //Seleccin modo
indexado de color
Si por el contrario trabajamos con el modo RGBA de color
seleccionaremos el miembro iPixelType de la estructura
PIXELFORMATDESCRIPTOR de esta manera:
pfd.iPixelType = PFD_TYPE_RGBA; //Seleccin
modo RGBA de color
Pegar cdigo paleta.c
/////////////////////////////////////////////////////
// Principal o punto de entrada para todos los
programas Windows
/////////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hCurrentInst, HINSTANCE
hPreviousInst,
LPSTR lpszCmdLine, int nCmdShow)
{
HGLRC hRC; // Contexto para OpenGL
HWND hWnd; // Almacenamiento
para la gestion de Ventana
MSG msg; // Estructura de
mensajes de Windows
DWORD buffer = PFD_DOUBLEBUFFER; // tipo de
buffer
BYTE color = PFD_TYPE_RGBA; // tipo de
color
// Si en la llamada a la aplicacin se ha
incluido el parmetro -sb
if (strstr(lpszCmdLine, "-sb")) { // Modo RGB
buffer = 0;
}
Colores y sombras
40
// Si en la llamada a la aplicacin se ha
incluido el parmetro -ci
if (strstr(lpszCmdLine, "-ci")) {
color = PFD_TYPE_COLORINDEX; // Modo de
color Indexado
}
// Si en la llamada a la aplicacin se ha
incluido el parmetro -h
if (strstr(lpszCmdLine, "-h")) {
//Mostramos ayuda
MessageBox(NULL, "paleta [-ci] [-sb]\n"
" -sb single buffered\n"
" -ci color index\n",
"Usage help", MB_ICONINFORMATION);
exit(0); //saliendo!!
}
// Crea la ventana principal de la aplicacin con
el tipo
// y buffer de color seleccionado
hWnd = CreateOpenGLWindow("paleta", 0, 0, 256,
256, color, buffer);
if (hWnd == NULL)
// Si no se puede crear correctamente
salimos del programa!!
exit(1);
// Almacena el contexto de dispositivo
hDC = GetDC(hWnd);
// Crea el contexto de generacin y lo activa
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
// Visualiza la ventana
ShowWindow(hWnd, SW_SHOW);
Colores y sombras
41
UpdateWindow(hWnd);
while (1) //bucle infinito!!
{
// Procesa los mensajes de la aplicacin
hasta que
// la aplicacin se cierra
while(PeekMessage(&msg, hWnd, 0, 0,
PM_NOREMOVE)) {
if(GetMessage(&msg, hWnd, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
goto quit; //solicitada salida del
programa
}
}
// Le hace de todo al triangulo (lo dibuja,
rota, colorea, ...)
triangulo();
}
//Solicitan salir del programa
quit:
// Deselecciona el contexto de generacin
activado
wglMakeCurrent(NULL, NULL);
ReleaseDC(hDC, hWnd);
wglDeleteContext(hRC);
//destruye la ventana window!
DestroyWindow(hWnd);
Colores y sombras
42
// Borra la paleta si fue creada
if (hPalette)
DeleteObject(hPalette);
return 0;
}
/////////////////////////////////////////////////////
// Creacion de la ventana para la aplicacin
/////////////////////////////////////////////////////
HWND CreateOpenGLWindow(char* title, int x, int y, int
width, int height,
BYTE type, DWORD flags)
{
int n, pf;
HWND hWnd; //
Almacenamiento para la gestion de Ventana
WNDCLASS wc; // Estructura de
clase de Windows
LOGPALETTE* lpPal; // Puntero a
memoria para la paleta logica
PIXELFORMATDESCRIPTOR pfd; // Descriptor
del formato de pixel
static HINSTANCE hInstance = 0; // Instancia de
almacenamiento
// Tan solo registro la clase de la ventana una
vez
// uso hInstance como un flag
if (!hInstance) {
hInstance = GetModuleHandle(NULL);
// Registra el estilo de la Ventana
wc.style = CS_OWNDC;
Colores y sombras
43
wc.lpfnWndProc = (WNDPROC)WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
// No se necesita para la brocha de fondo de la
ventana OpenGL
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "OpenGL";
// Registra la clase de la ventana
if (!RegisterClass(&wc)) {
MessageBox(NULL, "RegisterClass() failed: "
"No puedo registrar la class
Window.", "Error", MB_OK);
return NULL;
}
}
// Crea la ventana principal de la aplicacin
hWnd = CreateWindow("OpenGL", title,
WS_OVERLAPPEDWINDOW |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
x, y, width, height, NULL, NULL,
hInstance, NULL);
// Si no se puede crear la ventana principal
mostramos error!
if (hWnd == NULL) {
MessageBox(NULL, "CreateWindow() failed: No
puedo crear la ventana.","Error", MB_OK);
return NULL;
Colores y sombras
44
}
hDC = GetDC(hWnd);
// No hay garantas de que el contenido de la
pila que comienza en
// pfd este a 0, nos aseguramos de ello
memset(&pfd, 0, sizeof(pfd));
pfd.nSize = sizeof(pfd); // Tamao de
la estructura
pfd.nVersion = 1; // Version de
esta estructura
// Dibuja
en la ventana (No en el mapa de bits), // Soporta llamada
OpenGL en la ventana, flags
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | flags;
pfd.iPixelType = type; // Tipo de pixel
pfd.cColorBits = 32; // Tamao del
Buffer de Profundidad
// Escoge el formato de pixel que mejor encaje en
lo descrito por pfd
pf = ChoosePixelFormat(hDC, &pfd);
if (pf == 0) {
MessageBox(NULL, "ChoosePixelFormat() failed: "
"No encuentro un formato de pxel que se
ajuste!.", "Error", MB_OK);
return 0;
}
// Selecciona el formato de pxel para el
contexto de dispositivo
if (SetPixelFormat(hDC, pf, &pfd) == FALSE)
{
Colores y sombras
45
MessageBox(NULL, "SetPixelFormat() failed:
"
"No encuentro el formato especificado.",
"Error", MB_OK);
return 0;
}
//Toma el formato de pxel y recupera la
descripcion del formato de pxel
DescribePixelFormat(hDC, pf,
sizeof(PIXELFORMATDESCRIPTOR), &pfd);
/* Si el tipo de pxel seleccionado es Index se
necesita una paleta
entonces realiza selecciona una paleta con las
entradas especificadas*/
if (pfd.dwFlags & PFD_NEED_PALETTE ||
pfd.iPixelType == PFD_TYPE_COLORINDEX) {
n = 1 << pfd.cColorBits;
if (n > 256) n = 256;
lpPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) +
sizeof(PALETTEENTRY) * n);
memset(lpPal, 0, sizeof(LOGPALETTE) +
sizeof(PALETTEENTRY) * n);
lpPal->palVersion = 0x300;
lpPal->palNumEntries = n;
GetSystemPaletteEntries(hDC, 0, n, &lpPal-
>palPalEntry[0]);
/* Si el tipo de pxel seleccionado es RGBA,
entonces realiza seleccin
Colores y sombras
46
de las mascaras para RGB, si por el contrario
se selecciona Indexado
hay que elegir los elementos de forma
individual 1 a 1 */
if (pfd.iPixelType == PFD_TYPE_RGBA) {
int redMask = (1 << pfd.cRedBits) - 1;
int greenMask = (1 << pfd.cGreenBits) - 1;
int blueMask = (1 << pfd.cBlueBits) - 1;
int i;
/* Rellena las entradas con los colores
necesarios para el RGB */
for (i = 0; i < n; ++i) {
lpPal->palPalEntry[i].peRed =
(((i >> pfd.cRedShift) & redMask) *
255) / redMask;
lpPal->palPalEntry[i].peGreen =
(((i >> pfd.cGreenShift) & greenMask) *
255) / greenMask;
lpPal->palPalEntry[i].peBlue =
(((i >> pfd.cBlueShift) & blueMask) *
255) / blueMask;
lpPal->palPalEntry[i].peFlags = 0;
}
}
else
{
/* Rellena las entradas con los colores
necesarios para el Index */
lpPal->palPalEntry[0].peRed = 0;
lpPal->palPalEntry[0].peGreen = 0;
lpPal->palPalEntry[0].peBlue = 0;
lpPal->palPalEntry[0].peFlags =
PC_NOCOLLAPSE;
Colores y sombras
47
lpPal->palPalEntry[1].peRed = 255;
lpPal->palPalEntry[1].peGreen = 0;
lpPal->palPalEntry[1].peBlue = 0;
lpPal->palPalEntry[1].peFlags =
PC_NOCOLLAPSE;
lpPal->palPalEntry[2].peRed = 0;
lpPal->palPalEntry[2].peGreen = 255;
lpPal->palPalEntry[2].peBlue = 0;
lpPal->palPalEntry[2].peFlags =
PC_NOCOLLAPSE;
lpPal->palPalEntry[3].peRed = 0;
lpPal->palPalEntry[3].peGreen = 0;
lpPal->palPalEntry[3].peBlue = 255;
lpPal->palPalEntry[3].peFlags =
PC_NOCOLLAPSE;
}
//Crea la paleta
hPalette = CreatePalette(lpPal);
if (hPalette) {
//Avanza, selecciona y realiza la paleta
para este contexto de dispositivo
SelectPalette(hDC, hPalette, FALSE);
RealizePalette(hDC);
}
//libera la memoria de la estructura lpPal
free(lpPal);
}
ReleaseDC(hDC, hWnd);
return hWnd;
}
Listado 4 - Color indexado vs. Color RGBA
Colores y sombras
48
Figura 29 - Paleta modelo de color RGB
Figura 30 - Paleta modelo de color Index
7.8.4. Modelo de color RGBA vs. Modelo de color Indexado
No podemos usar el modo de color indexado y el modo de color RGBA
juntos. Esto significa que si usamos el modo indexado en un dispositivo de
color real, no tendremos acceso a todos los colores disponibles. Bajo algunas
implementaciones, la paleta de color indexado puede tener hasta 4096
entradas; sin embargo, la implementacin de Microsoft slo soporta 256
entradas.
Adems de limitar la seleccin de colores, el modo indexado de color no
soporta otros efectos especiales de OpenGL, incluidos muchos efectos de
iluminacin y sombreado, niebla, anti-escalonado y mezcla alfa. Generalmente
es mejor usar el modo RGBA. La ventaja ms significativa de usar el indexado
es un mayor control de la paleta en dispositivos de pantalla de 8 bits.
Nuestra decisin en la utilizacin de modelo de color RGBA o Indexado
puede basarse en el hardware disponible y en las necesidades de nuestra
aplicacin. Para la mayora de sistemas muchos colores pueden ser
representados simultneamente tanto con el modelo de color RGBA como con
el modelo de color Indexado. Sin embargo, en muchos efectos como el
sombreado, la iluminacin, mapeado de texturas y niebla, el modelo RGBA
proporciona una mayor flexibilidad que el modelo de color indexado.
Podemos optar por utilizar el modelo de color indexado en tres casos:
1. Si estamos migrando una aplicacin que hace un uso importante del
modelo de color indexado es ms sencillo no cambiarlo al modelo RGBA.
Colores y sombras
49
2. Si disponemos de un pequeo numero de planos de color el modelo
RGBA puede producir sombreados de color de baja calidad. Por ejemplo,
si slo disponemos de 8 planos de color con el modelo RGBA slo
dispondremos de 3 bits para el rojo, 3 bits para el verde y 2 para el azul,
es decir, 8 (2
3
) sombras de rojo y verde, y slo 4 de azul.
En esta situacin si tenemos limitados los requerimientos de sombreado
podemos utilizar una tabla de bsqueda de color para obtener mas
colores de sombra. Por ejemplo, si requerimos slo sombras azules se
puede utilizar el modelo de color indexado y almacenar 256 (2
8
) sombras
de color azul, esto es mucho mejor que las 4 sombras que nos ofreca el
modelo de color RGBA.
3. El modelo de color indexado puede ser utilizado para hacer varios
trucos, como mapas de color, animaciones y dibujo por capas.
En general, utilizaremos el modelo de color RGBA siempre que sea
posible ya que permite mapeado de texturas y trabaja mejor con sombreado,
iluminacin, niebla, antialiasing y combinacin de colores (blending).
7.8.5. Ocultaciones
OpenGL permite utilizar dos mtodos de ocultacin: el algoritmo de las
caras de detrs (Back Face Removal), y el algoritmo del Z-buffer.
7.8.5.1. Algoritmo de las caras de detrs
Consiste en ocultar las caras que no se dibujaran porque formaran
parte de la parte trasera del objeto. Para decirle a OpenGL que queremos
activar este mtodo de ocultacin, tenemos que escribir:
glEnable(GL_CULL_FACE)
Colores y sombras
50
Figura 31 - Sin ocultaciones
Figura 32 - Ocultando caras de detrs
Importante. OpenGL ignora totalmente la normal que le podamos pasar
con la funcin glNormalf, as que esta normal slo se utiliza a efectos de
iluminacin. A efectos de ocultacin de caras, OpenGL decide si oculta o no
una cara a partir del orden de definicin de los vrtices que la forman.
As, si la proyeccin sobre del camino que forman los vrtices del
primero al ltimo es en el sentido de las agujas del reloj, entonces se dice que
el orden es clockwise. Si es en sentido inverso, se dice que es
counterclockwise. Por defecto, OpenGL slo renderiza aquellos polgonos
cuyos vrtices estan en orden counterclockwise cuando son proyectados
sobre la ventana. Pero los objetos definidos por la GLUT no tienen porqu estar
definidos clockwise (como es el caso de la tetera). Por tanto, antes de
renderizarlos usando este algoritmo de ocultacin, debemos llamar a
glFrontFace(GL_CW) o a glFrontFace(GL_CCW).
7.8.5.2 Algoritmo del Z-buffer
El algoritmo del Z-buffer es del tipo espacio-imagen. Cada vez que se va
a renderizar un pixel, comprueba que no se haya dibujado antes en esa
posicin un pixel que est ms cerca respecto a la cmara. Este algoritmo
funciona bien para cualquier tipo de objetos: cncavos, convexos, abiertos y
cerrados. Para activarlo, hay que hacer una llamada a:
glEnable(GL_DEPTH_TEST)
Colores y sombras
51
Esta llamada le dice a OpenGL que active el test de profundidad.
Adems, cada vez que se redibuje la escena, a parte de borrar el buffer de
color, hay que borrar el buffer de profundidad. Esto se hace con la llamada:
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT).
Por ltimo, pero no menos importante, al inicializar OpenGL se le tiene
que decir que cree el buffer de profundidad. Esto se hace al definir el modo de
visualizacin (ver captulo GLUT).
Figura 33 - Sin Z-Buffer Figura 34 - Con Z-Buffer
7.8.5.3. Combinando ambos algoritmos
El algoritmo de la eliminacin de las caras de detrs es suficiente para
renderizar para objetos convexos y cerrados, como este octahedro, pero para
objetos cncavos y cerrados no basta. Por ejemplo, un objeto con una cara
parcialmente oculta, como el de la figura, no tiene porqu renderizarse bien:
Figura 35 - Sin ocultaciones Figura 36 - Eliminando caras de detrs
Ahora bien, si sabemos que todos nuestros objetos estn cerrados, es
decir, no se ve el interior, podemos combinarlo con el Z-buffer, ya que
descartaremos ya para empezar las caras que no vamos a ver, ganando as en
velocidad de renderizacin.
Colores y sombras
52
Figura 37 - Z-Buffer Figura 38 - Caras de detrs + Z-Buffer
Ahora bien, la combinacin de estos dos algoritmos no siempre es
adecuada. En el caso de la tetera, por ejemplo, puesto que la tapa no est
perfectamente ajustada a la tetera, y por tanto, queda un hueco (es decir, se ve
el interior) Si utilizamos el algoritmo de las caras de detrs veremos a travs!
Por tanto, en este caso lo mejor es utilizar slo el algoritmo del Z-buffer.
Figura 39 - Caras de detrs + Z-Buffer Figura 40 - Slo Z-Buffer
7.8.6. El color de los materiales
La forma en que la luz incide sobre las superficies de los objetos
depende de las propiedades del material de los mismos. En OpenGL la forma
de definir estas propiedades es la funcin glMaterial cuya sintaxis es void
glMaterial{if}[v](GLenum face, GLenum pname, TYPEparam);
El primer argumento determina la cara del objeto donde se aplica el
material, puede tomar los valores GL_FRONT, GL_BACK, o
GL_FRONT_AND_BACK.
El siguiente argumento indica la propiedad del material que va a fijarse
(sus posibles valores se muestran en la tabla). Finalmente, el argumento param
permite asignar los valores a la propiedad pname.
Colores y sombras
53
Nombre del parmetro Valor por
defecto
Significado
GL_AMBIENT (0.2, 0.2, 0.2,
1.0)
ambient color of material
GL_DIFFUSE (0.8, 0.8, 0.8,
1.0)
diffuse color of material
GL_AMBIENT_AND_DIFFUSE
ambient and diffuse color of
material
GL_SPECULAR (0.0, 0.0, 0.0,
1.0)
specular color of material
GL_SHININESS 0.0 specular exponent
GL_EMISSION (0.0, 0.0, 0.0,
1.0)
emissive color of material
GL_COLOR_INDEXES (0,1,1) ambient, diffuse, and specular
color indices
Reflexin ambiente y difusa
La reflexin difusa determina el color de un objeto y la reflexin ambiente
la forma en que el objeto redistribuye la luz ambiente que recibe. Los objetos
del mundo real suelen tener el mismo color de reflexin ambiente y difusa.
Reflexin especular
La componente especular define el color de los brillos del objeto cuya
forma se controla con el parmetro GL_SHININESS de modo que cuando
mayor sea este parmetro el brillo aparecer ms concentrado.
Emisin
OpenGL permite asignar a los objetos un color de emisin para que
parezca que dichos objetos emiten luz de un color, lo que permite simular
lmparas y objetos luminosos. Se pueden conseguir mejores efectos simulando
fuentes de luz en la misma posicin que los objetos para los que se define un
color de emisin.
Cambio de las propiedades del material
Para minimizar el coste asociado a la realizacin de cambios en las
propiedades del material se usa la funcin glColorMaterial cuya sintaxis es la
siguiente:
Colores y sombras
54
Cara podr tomar los valores GL_FRONT_AND_BACK, GL_FRONT o
GL_BACK y modo GL_AMBIENT_AND_DIFFUSE, GL_DIFFUSE,
GL_SPECULAR o GL_EMISIN.
Una vez que se realiza la llamada a la funcin, se puede cambiar el color
de la propiedad que indica el parmetro modo para la cara definida en cara
usando glColor.
Despus de llamar a la funcin glColorMaterial es necesario realizar
una llamada a glEnable con el argumento GL_COLOR_MATERIAL.
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glColor3f(0.2, 0.5, 0.8);
......../* dibujamos algo aqu */
glColor3f(0.9, 0.0, 0.2);
......... /*y otros */
glDisable(GL_COLOR_MATERIAL);
Listado 5 - Definiciones para materiales
Veamos un ejemplo de todo esto:
#include <windows.h>
Propsito: Permite que los colores del material sigan el color definido
por glColor.
Fichero de inclusin: <gl.h>
Sintaxis: void glColorMaterial(GLenum cara, GLenum modo);
Descripcin: Esta funcin permite seleccionar las propiedades de un
material sin tener que llamar directamente a glMaterial. Usando esta
funcin, podemos definir ciertas propiedades del material siguiendo
el color especificado actualmente por glColor. Para habilitar el
seguimiento, llamaremos a glEnable(GL_COLOR_MATERIAL).
Parmetros:
func
Retornos: Ninguno.
Colores y sombras
55
#include <GL/gl.h>
#include <GL/glut.h>
GLfloat mat_diffuse [] = {0.5, 0.5,
0.5, 1.0};
GLfloat mat_specular [] = {0.5, 0.5,
0.5, 1.0};
GLfloat mat_shininess [] = {50};
void init (void)
{
GLfloat light_position[] = {1.0, 1.0,
1.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION,
light_position);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glDepthFunc(GL_LEQUAL);
glEnable (GL_DEPTH_TEST);
}
void display (void)
{
int i,j;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
for (i=-1; i<=1; i++)
{
for (j=-1; j<=1; j++)
{
glPushMatrix();
Figura 41 - Color de materiales
Colores y sombras
56
glTranslatef((float)i*3.0,(float)j*3.0,0.0);
glutSolidSphere(1.0,16,16);
glPopMatrix();
}
}
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport ( 0, 0, w, h );
glMatrixMode ( GL_PROJECTION );
glLoadIdentity ( );
if ( h==0 )
gluPerspective ( 60, ( float ) w, 1.0, 20.0 );
else
gluPerspective ( 60, ( float ) w / ( float ) h,
1.0, 20.0 );
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity ( );
gluLookAt(0.0,0.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
}
/* Ciclo principal
* Abre una ventana con tamao inicial definido, barra de
titulo,
* modo RGB, y control de eventos */
int main (int argc, char** argv)
{
glutInit (&argc, argv);
Colores y sombras
57
glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE |
GLUT_DEPTH);
glutInitWindowSize (250,250);
glutInitWindowPosition (100,100);
glutCreateWindow ("Ejemplo de luz");
init ();
/* llamada a inicializacion*/
glutReshapeFunc (reshape); /* llamada
para eventos de reshape de ventana*/
glutDisplayFunc (display); /* llamada
para dibujar...*/
glutMainLoop (); /* Crea la
ventana y dibuja...*/
}
Listado 6 - Ejemplo uso de propiedades de materiales
Colores y sombras
58
7.9. Sombras
Una sombra es una regin de oscuridad donde la luz es obstaculizada.
Una sombra ocupa todo el espacio de detrs de un objeto opaco con una
fuente de luz frente a l. La seccin eficaz de una sombra es una silueta
bidimensional o una proyeccin invertida del objeto que bloquea la luz.
Cuanto menor es el ngulo entre la direccin de la luz y un objeto
alargado que la obstaculice, ms corta ser su sombra. Por otro lado, cuanto
menor sea el ngulo entre la direccin de la luz y la superficie en la que
aparece la sombra, ms larga ser sta. Si el objeto est cerca de la fuente
luminosa, la sombra ser mayor que si el objeto se encuentra lejos. Si la
superficie est curvada, habr ms distorsiones.
Cuando la fuente de luz no es puntual, la sombra se divide en umbra y
penumbra. Cuanto ms ancha es la fuente de luz, ms difuminada o borrosa
ser la sombra.
Si hay mltiples fuentes luminosas, habr mltiples sombras, con las
partes solapadas ms oscuras, o con una combinacin de colores. Cuando una
persona o un objeto est en contacto con la superficie, como una persona
sentada en el suelo o un poste clavado, las sombras convergen al punto de
contacto.
Si slo existe una fuente de luz, las sombras arrojadas por aquella sern
siempre grises, sea cual sea el color de la fuente. En cambio, si existen dos
fuentes de luz de distintos colores, supongamos rojo y azul, las sombras
proyectadas por cada una de ellas sern del color de la otra fuente de luz, y
slo la interseccin de ambas sombras ser gris. Es decir, la sombra de la luz
roja ser azul, pues est iluminada por la fuente azul, y viceversa. En el caso
de que existan ms fuentes de luz, cada sombra ser del color resultante de la
adicin de las fuentes que an iluminan esa zona, permaneciendo en gris las
zonas donde intersecten las sombras de todas las fuentes luminosas.
El proceso de sombreado o shading (en el contexto de los grficos
realizada por ordenador) implica la simulacin de computadora (o ms
exactamente; el clculo) como las caras de un polgono se comportarn
cuando es iluminado por una fuente de la luz virtual. El clculo exacto vara
segn no slo que datos estn disponibles sobre la cara sombreada, sino
tambin la tcnica de sombreado.
Generalmente este afecta propiedades de la especularidad y valores de
intensidad, reflexin y transparencia.
Este proceso se realiza durante el renderizado.
El sombreado altera el color de las caras de un modelo 3D basndose
en el ngulo de la superficie con la fuente de luz. Las siguientes imgenes
muestran las diferencias:
Colores y sombras
59
Figura 42 Imagen renderizada de una caja.
Esta imagen no tiene sombreado de las caras, pero usa lneas en los
bordes para separar las caras.
Figura 43 Imagen sin lneas en los bordes
Aqu se observa como el sombreado altera el color de las 3 caras
basndose en el ngulo de las fuentes de luz.
Figura 44 Imagen son sombreado en las caras
Colores y sombras
60
7.9.1 Efecto falloff (Distance falloff)
Tericamente, dos superficies que son paralelas son iluminadas con la
misma intensidad por una fuente de luz distante, como por ejemplo el sol.
Incluso si una superficie est ms distante, el ojo ve ms en el mismo espacio,
por eso la iluminacin parece la misma.
Ntese que en la primera imagen el color de las caras frontales de las
dos cajas son exactamente iguales. Parece que hay una pequea diferencia en
el punto de encuentro de las caras, pero esto es una ilusin ptica causada por
el borde vertical debajo de donde se encuentran las caras.
En la segunda imagen se puede observar que las superficies de las
caras son brillantes en la caja delantera y ms oscuras en la situada en la parte
de atrs. Tambin la superficie sobre la que estn pasa de claro a oscuro
segn se aleja.
Este efecto falloff produce imgenes que parezcan ms realistas.
Figura 45 Cajas renderizadas con OpenGL
Figura 46 Cajas renderizadas con ARRIS CAD, efecto falloff
Un modelo de intensidad puede aplicarse al sombreado de superficies de
varias formas dependiendo del tipo de superficie y de los requisitos de la
aplicacin. Los objetos con varias superficies suelen sombrearse de forma
realista con una sola intensidad por cada superficie. Para una superficie curva
Colores y sombras
61
podramos aplicar el modelo de intensidad a cada punto de la superficie;
aunque esto produce un efecto muy realista es un proceso muy lento.
Para acelerar el proceso se podra representar una superficie curva
como un conjunto de polgonos y aplicar el modelo de sombreado a cada
plano. Cada una de estas superficies poligonales podra sombrarse despus
con intensidad constante o bien podramos variar el sombrado con valores de
intensidad interpolados.
Los algoritmos de superficies visibles determinan qu superficies ve el
ojo dependiendo de su posicin. Los algoritmos de sombras determinan que
objetos se ven desde la fuente de luz. Por tanto, estos dos tipos de algoritmos
son esencialmente iguales. Las superficies visibles desde la fuente de luz estn
iluminadas, las no visibles estn en sombra.
Cuando hay mltiples fuentes de luz una superficie debe clasificarse
respecto a cada fuente de luz. Consideraremos en este tema algoritmos de
sombra para fuentes de luz puntuales. La visibilidad a partir de una fuente
puntual de luz es como la visibilidad en el ojo: todo o nada.
Cuando un punto en la superficie no puede verse desde una fuente
puntual de luz, el clculo de iluminacin debe ajustarse para tenerlo en cuenta.
Las reas en la sombra de todas las fuentes puntuales de luz todava
estn iluminadas por la luz ambiente.
Aunque la utilizacin de sombras requiere el clculo de la visibilidad de la
fuente de luz, pueden generarse sombras falsas sin hacer pruebas de
visibilidad.
7.9.2 Sombreado
La intensidad de luz que se observa en cada superficie de un objeto
depende del tipo de fuentes de luz que la ilumine y de las caractersticas de la
superficie del objeto. Algunos objetos tienen superficies brillantes y otros
opacas o mate. Adems, algunos objetos se construyen con materiales opacos,
mientras que otros son mas o menos trasparentes. Un modelo de sombreado
para producir intensidades realistas sobre las superficies de un objeto debe
considerar estas propiedades.
Los patrones de sombra generados por un mtodo de superficie oculta
son validos en cualquier posicin de visin seleccionada siempre que las
posiciones de la fuente de luz no se alteren. Las superficies que son visibles
desde la posicin de visin se sombrean segn el modelo de intensidad, con
patrones de superficie y sombras anexados. Las superficies visibles que no son
iluminadas por una fuente de punto se les aplica nicamente intensidad de luz
ambiental. Las superficies visibles que son iluminadas por una fuente de puntos
Colores y sombras
62
se sombrean combinando el modelo de intensidad y la lista de patrones. Las
reas de sombra proyectada se sombrean nicamente con la intensidad de la
luz ambiental.
Asumiendo que se puede computar vectores normales, dado un conjunto
de fuentes de luz y un observador, los modelos de luz e iluminacin
desarrollados pueden aplicarse a cada punto de una superficie.
Lamentablemente, aunque se tenga ecuaciones sencillas para determinarlos
vectores normales, la cantidad de computaciones requeridas puede ser muy
grande. Se han visto muchas de las ventajas de usar modelos poligonales para
los objetos. Una ventaja adicional, para polgonos planos, es que se puede
reducir bastante el trabajo requerido para el sombreado. La mayora de los
sistemas grficos, incluyendo OpenGL, explota las posibles eficiencias para
polgonos planos, descomponiendo superficies curvas en muchos polgonos
planos pequeos, cada uno teniendo un vector normal bien definido.
7.9.3 Tipos de sombreado
7.9.3.1 Sombreado plano (Flat Shading)
Es una tcnica usada en grficos 3D en la que se sombrea cada
polgono de un objeto basndose en el ngulo que existe entre la superficie
normal del polgono y la direccin de la fuente de luz, sus respectivos colores y
la intensidad de la luz. Es el tipo de sombreado utilizado para el renderizado de
alta velocidad donde tcnicas de sombreado ms avanzadas tienen un coste
computacional excesivo.
La desventaja del sombreado de intensidad constante es que da a los
modelos con un nmero bajo de polgonos un aspecto poco natural, formado
por mltiples caras. A veces esta apariencia puede ser ventajosa, como al
modelar objetos poligonales. Los diseadores a veces usan esta tcnica para
observar las diferentes caras del objeto que estn creando.
Bajo ciertas restricciones se puede obtener un sombreado realista en un
objeto con superficies planas utilizando intensidades con superficies
constantes. Si el objeto est nicamente expuesto a luz ambiental y no se
aplican texturas, sombras de superficie, etc., el sombreado de intensidad
constante genera representaciones exactas de la superficie del objeto. Para
objetos cuya superficie se ilumina con un foco de luz puntual el modelo produce
una superficie de intensidad constante siempre que el punto de referencia
visual y el foco estn suficientemente alejados de la superficie del objeto. Si por
el contrario el foco est alejado de la superficie no hay variacin en la direccin
hacia la fuente. La direccin hacia un punto de visin distinto no cambiara
sobre una superficie, por lo tanto V.R = cte.
Si se representa mediante un conjunto de superficies planas una
superficie curva y los planos que subdividen esta superficie se hacen lo
suficientemente pequeos. Se pueden sombrear con intensidades de superficie
constante.
Colores y sombras
63
Cuando la orientacin entre planos adyacentes cambia en forma
abrupta, la diferencia en intensidades de superficie puede producir un efecto
spero e irreal. Se pueden aliar las discontinuidades de intensidad en estos
casos variando la intensidad sobre cada superficie de acuerdo con algn
esquema de interpolacin.
Existen otro tipo de tcnicas de sombreado ms avanzadas como el
sombreado de Gouraud y el sombreado de Phong.
Figura 47 Comparacin de las tcnicas de sombreado
7.9.3.2 Sombreado de Gouraud
Creada en 1971 y llamada as en honor a Henri Gouraud, este mtodo
es usado para simular el efecto de difusin de de la luz y los colores a travs
de la superficie del objeto, esta tcnica consigue alcanzar el sombreado de
superficies con pocos polgonos sin el alto coste computacional de calcular la
iluminacin de cada pxel.
El sombreado de Gouraud aplica el patrn de iluminacin a cada
vrtice del polgono y entonces promedia los valores de color en toda la
superficie del objeto para as alcanzar un efecto de sombreado suave
que parece ms realista sobre superficies curvas.
Este mtodo de sombreado se emplea para disimular los polgonos
cuando stos se emplean para aproximar una superficie curva, como una
esfera o un toroide, por ejemplo.
El mtodo es el siguiente: primero calculamos las normales a la
superficie en los vrtices de los polgonos. Esta normal en cada punto podemos
calcularla de dos maneras: 1-basndonos las caractersticas de la superficie
que vamos a aproximar, por ejemplo si se trata de una esfera, sabemos que la
normal va a ir en direccin opuesta al centro de la esfera. 2- Si no conocemos
la superficie que estamos aproximando, podemos sumar todas las normales de
los polgonos de los que forme parte ese vrtice y normalizar el resultado.
Colores y sombras
64
Una vez hecho esto, calculamos por los procedimientos de iluminacin
vistos anteriormente el color que correspondera a cada vrtice. Despus,
cuando vamos a dibujar el polgono, vamos interpolando linealmente a travs
de cada arista entre los dos colores de los extremos de dicha arista, y por
ltimo al ir trazando las lneas horizontales (o scanlines) que forman el
polgono, interpolamos de nuevo linealmente entre los dos valores que
correspondan a los puntos de las dos aristas entre las que estemos trazando la
lnea horizontal. El resultado final de todo esto es un polgono con un suave
gradiente de intensidades sobre su superficie.
Se puede ver grficamente esto con el ejemplo de
la figura 48, en la que conocemos los valores de la
intensidad en los puntos 1 2 y 3. Al ir dibujando el
tringulo, calculamos los valores del primer y el ultimo
pxel del triangulo en cada lnea interpolando, a lo largo
de las aristas, los valores de los vrtices. Esto nos da el
valor inicial y el final de cada lnea horizontal, y para
rellenarla solo tenemos que interpolar linealmente de
nuevo los estos valores a lo largo de la lnea.
Un vector normal a una superficie es un vector
que apunta en una direccin perpendicular a dicha
superficie. Si partimos de un tringulo, con tres vrtices
P1, P2 y P3, el procedimiento para calcular la normal es
muy sencillo; se escoge un punto como origen, digamos
P2, y se calculan los vectores v1=P1-P2, y v2=P3-P2;
calculamos el producto vectorial entre V1 y V2, y nos sale
el vector normal.
Adems, puesto que el vector normal prcticamente
solo se va a usar para calcular su ngulo con otros
vectores, es muy til hacer que su mdulo sea uno,
dividiendo cada una de las componentes (x,y,z) entre el
mdulo del vector.
En la figura se ve un tringulo con su vector normal. Una cosa que hay
que tener en cuenta al calcular un vector normal a un triangulo, es que el
producto vectorial no cumple la propiedad
conmutativa, o sea que hay que tener cuidado
porque segn en que orden se multipliquen v1 y v2
el vector normal puede apuntar en una direccin o
en la opuesta.
La aplicacin de las normales a la hora de
acelerar el dibujado de polgonos es la siguiente:
como normalmente los tringulos se usan para
representar aproximaciones a superficies, como por
ejemplo esferas, se puede considerar que tales
Figura 48 - Scanlines
Figura 49 - Normal
Figura 50 - Normales
Colores y sombras
65
superficies tienen una cara interior que no se ve (el interior de la esfera, p ej) y
una exterior que si se ve. Entonces, podemos calcular las normales a los
tringulos asegurndonos de que apunten al exterior de la superficie, y
despus eliminar los polgonos cuya normal no apunte en direccin a la
pantalla, porque se entiende que estamos viendo su parte trasera y por tanto
no se dibuja. En la figura vemos un ejemplo en 2D de este mtodo. En este
caso, hay una serie de segmentos que aproximan una circunferencia.
Descartamos por medio de las normales las caras 4, 5, 6 y 7 y dibujamos las
caras 1 2 y 3. A estas tres caras que vamos a dibujar hay que aplicarles otro
algoritmo para verificar superficies ocultas, como el del pintor o el buffer z, ya
que el mtodo de las normales no garantiza que las caras que apuntan hacia la
cmara no vayan a estar parcial o totalmente tapadas por otro objeto.
Algunas veces los objetos sombreados con Gouraud muestran las zonas
de unin de polgonos conocido como el efecto de la banda de Mach. Este
fenmeno es una consecuencia de como se conectan los conos al nervio ptico
en el ojo, y no hay nada que se pueda hacer al respecto, fuera de buscar
tcnicas de sombreado mas suaves que no produzcan grandes diferencias en
sombreado en los bordes de los polgonos.
Figura 51 Sombreado Gouraud banda de Mach
7.9.3.3 Sombreado de Phong
Es el mtodo usado en los grficos 3D para la interpolacin de
superficies en el pasterizado de polgonos, para obtener mejor resolucin
especular que en las generadas en el modelo de reflexin de Pong.
Este mtodo fue desarrollado por Bui Tuong Phong en 1973 en la
universidad de Utah. El modelo de reflexin de Phong es un modelo de
iluminacin local que puede producir un cierto grado de realismo en los objetos
3D mediante la combionacin de e elementos: difusin, reflexin especular y
luz ambiente para cada punto de la superficie considerada.
Colores y sombras
66
La interpolacin de Phong , como mtodo de renderizado, se peude
considerar como una mejora del sombreado de Gouraud que proporciona una
mejor aproximacin a la aplicacin punto-por-punto de un modelo de reflexin
superficial, asumiendo una suavidad variante de la superficie como vector
normal.
Para ello se determina el vector normal promedio en cada vrtice del
polgono. Se interpola linealmente los vrtices normales sobre la superficie del
polgono. Se aplica un modelo de iluminacin sobre los puntos de la superficie
utilizando las normales interpoladas.
Phong propuso que, en lugar de interpolar intensidades de los vrtices,
segn se hace en el sombreado Gouraud, se interpole normales a lo largo del
polgono. Para un polgono que comparte lados y vrtices con otros polgonos,
Figura 52 - Esquema
se pueden computar normales en los vrtices interpolando sobre las normales
de los polgonos que comparten el vrtice. Luego, se puede usar interpolacin
bilineal, para interpolar las normales sobre el polgono
Figura 53 - Esquema
Se puede usar las normales interpoladas en los vrtices A y B para
interpolar a lo largo de lado entre ellas:
n() = (1-)nA + nB
Se puede hacer una interpolacin similar en todos los lados. LA normal
en cualquier punto interior se puede obtener de los puntos en los lados
mediante
n(,) = (1-)nC + nD
Colores y sombras
67
Una vez obtenidas las normales en cada punto, se puede hacer clculos
de sombreado independientes. Normalmente, este proceso se combinar con
la rasterizacin del polgono, para que la lnea entre C y D proyecte a una lnea
de rastreo en el frame buffer.
7.9.3.4 Sombreado BlinnPhong
Es una variante del modelo de reflexin de Phong que intercambia la
precisin visual por eficiencia computacional.
En sombrado de Phong solo se recalcula el ngulo R*V entre el
observador (V) y el rayo de luz de la fuente (L) reflejado (R) en una superficie.
Si en vez de eso se calcula el vector intermedio entre el observador y los
vectores de las fuentes de luz:
Podemos reemplazar R*V con N*H, este producto de puntos representa
el coseno de un ngulo que es la mitad del ngulo representado por el producto
de puntos de Phong si V,L y R se encuentran en el mismo plano. Esto produce
modelos empricos ms certeros para determinar la distribucin de las
funciones de reflexin bidireccional que el modelo de Phong. Blinn-Phong es el
modelo de sombreado por defecto que utiliza OpenGL y se lleva a todos los
vrtices segn pasan por la tubera de grficos, mientras que los valores de los
pixeles entre los vrtices son interpolados por el sombreado de Gouraud
(menos costoso).
Figura 54 Sombreado de Phong y Blinn-Phong
Colores y sombras
68
7.9.4 Sombreado en OpenGL
Se especifica la tcnica de sombreado deseada con la funcin
glShadeModel.
Void glShadeModel(Glenum mode);
El parmetro mod puede tener 2 valores GL_SMOOTH (por defecto) o
GL_FLAT.
7.9.4.1 Sombreado Plano (Flat)
Los tres vectores, l, n y v, pueden variar segn se va entre puntos sobre
una superficie.
*Para un polgono plano, n es constante.
*Si se asume un observador distante (la bandera
GL_DISTANT_VIEWER en OpenGL), v es constante sobre el polgono.
*Si la fuente de luz es distante, l es constante.
Distante se puede interpretar como una fuente o un observador en el
infinito; en particular, si los polgonos son pequeos, las distancias relativas
para el infinito no tienen que ser muy grandes. Los ajustes necesarios, como
cambiar la ubicacin de la fuente u observador a la direccin de la fuente u
observador, de forma correspondiente, puede hacerse a las ecuaciones de
sombreado y a su implementacin.
Si los tres vectores son constantes, entonces el clculo de sombreado
se lleva a cabo una sola vez para cada polgono, y se asignar la misma
sombra a cada punto en el polgono. Esta tcnica se conoce como sombreado
plano o constante. En OpenGL, se especifica sombreado plano mediante
glShadeModel(GL_FLAT);
Si se usa sombreado plano, OpenGL usar las normales asociadas con
el primer vrtice de un polgono
Sencillo para el clculo de sombreado. Para primitivas como un strip de
tringulo, OpenGL usa la normal del tercer vrtice para el primer tringulo, la
normal del cuarto vrtice para el segundo, etc. Reglas similares se aplican para
otras primitivas, como strips cuadrilteros.
Sombreado plano mostrar diferencias de sombreado entre los
polgonos. Si las fuentes de luz y el observador estn cerca del polgono, los
vectores v y l sern diferentes para cada polgono. Sin embargo, si los
polgonos se disearon para modelar una superficie suave, sombreado plano
no ser el mas apropiado, ya que se vern aunque sea diferencias de
sombreado pequeas entre polgonos adyacentes.
Colores y sombras
69
Figura 55 Variacin se sombreado
El sistema visual humano tiene una sensibilidad remarcada para
pequeas diferencias de intensidad de color, causada por la propiedad de
inhibicin lateral. Si se ve una secuencia incremental de intensidades, se
percibe los incrementos de brillantez reforzados en un lado del intervalo de
intensidad y decremento de brillantez reforzado del otro lado
Figura 56 Percepcin de intensidad
Ejemplo de cdigo en Open GL
Figura 57 Sombreado G_FLAT
glShadeModel(GL_FLAT);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); // activamos el color rojo
glVertex3f(-1.0f, 0.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f); // activamos el color verde
glVertex3f(1.0f, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f); // activamos el color azul
glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
Colores y sombras
70
El tringulo se rellena con el color azul, puesto que el modelo de
sombreado es GL_FLAT y el color activo en la definicin del ltimo vrtice es el
azul.
7.9.4.2 Sombreado Interpolativo y Gouraud
Si se asigna el modelo de sombreado para que sea suave, mediante
glShadeModel(GL_SMOOTH);
OpenGL interpolar colores para las primitivas, como las lneas. Si se permite
sombreado y luz suaves, y se asigna a cada vrtice la normal del polgono
siendo sombreado, se calculara la luz en cada vrtice, determinando el color
del vrtice, usando las propiedades materiales y los vectores v y l se computan
para cada vrtice. Si la fuente de luz es distante, y el observador es distante o
no hay reflexiones especulares, entonces el sombreado interpolativo
sombreara un polgono con un color constante.
Desde la perspectiva de OpenGL, el sombreado Gouraud es
deceptivamente sencillo. Se necesita solamente asignar correctamente las
normales de vrtices. La literatura a menudo no distingue entre el sombreado
interpolativo y el Gouraud. Sin embargo, existe un problema, encontrar las
normales para promediar. Si el programa es lineal, especificar una lista de
vrtices (y otras propiedades), no se tiene la informacin necesaria de cuales
polgonos comparten un vrtice. Lo que se requiere es una estructura de datos
para representar un "mesh". Atravesar esta estructura de datos puede generar
los vrtices con las normales promediadas. Tal estructura de datos debe
contener, de manera mnima, polgonos, vrtices, normales, y propiedades de
los materiales. Una posible estructura se muestra en al siguiente figura,
teniendo como elemento clave los polgonos que se juntan en cada vrtice
Figura 58 Estructura de datos para facilitar sombreado
Colores y sombras
71
Ejemplo de cdigo OpenGL
Figura 59 Sombreado GL_SMOOTH
7.9.4.3 Stencil Buffer
Sirve para mejorar la calidad de las sombras y los reflejos.
Es un test extra por pxel y un conjunto de operaciones muy parecidas al
Z-Buffer.
Aade planos de bits adicionales para cada pxel adems de los bits de
color y profundidad.
Es una manera de marcar pxeles en una renderizacin para controlar su
actualizacin en renderizaciones siguientes.
El valor stencil de un pxel es un entero sin signo (unsigned int).
Para activar y desactivar el test de stencil se utilizar la funcin
glEnable(GL_STENCIL_TEST) y glDisable(GL_STENCIL_TEST).
Para borrar el stencil buffer se usar la funcin glClearStencil cuya
sintaxis es la siguiente:
glShadeModel(GL_SMOOTH);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); // activamos el color rojo
glVertex3f(-1.0f, 0.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f); // verde
glVertex3f(1.0f, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f); // azul
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();
Colores y sombras
72
Propsito: Especifica un valor de estarcido para el buffer de estarcido.
Fichero de inclusin: <GL/gl.h>
Sintaxis: void glClearStencil(GLint valor);
Descripcin: Esta funcin selecciona el valor de color que usaremos
para borrar el buffer de estarcido con
glClear(GL_STENCIL_BUFFER_BIT).
Parmetros:
valor
GLint: el valor de limpieza del buffer de estarcido.
Retornos: Ninguno.
El stencil test compara el valor del pxel del stencil buffer con un valor de
referencia. Permite las comparaciones: never, always, less than, less than or
equal, greater than, greater than or equal, equal, not equal.
Es ms potente que el buffer de profundidad. Antes de comparar realiza
una operacin AND tanto del valor de referencia como del valor del buffer, con
un valor que sirve como mscara.
GlStencilFunc(GL_EQUAL, 0x1,0xff).
El primer parmetro ser la funcin de comparacin, el segundo el valor
de referencia y el tercero la mscara.
Si el pxel no pasa el test de profundidad es rechazado, en cambio, si lo
pasa, se reemplaza el valor del Z-Buffer. El stencil test es ms complicado:
- No pasa el stencil test
- Pasa stencil test y no el test de profundidad
- Pasa stencil test y test de profundidad
Para cada caso tenemos 6 operaciones distintas: GL_KEEP,
GL_REPLACE, GL_INVERT, GL_INCREMENT, GL_DECREMENT, GL_ZERO.
Antes de escribir se aplica un mscara:
GlStencilOp(GL_KEEP //Stencil fail
GL_DECR //Pasa el stencil y falla la profundidad
GL_INCR //Pasa el stencil y pasa la profundidad)
GlStencilMask(0xff);
Colores y sombras
73
State
Description
Initial Value State Update
Command
State Query Token
Stencilling
enable
GL_FALSE glEnable
glDisable
GL_STENCIL_TEST
Stencil
function
GL_ALWAYS glStencilFunc GL_STENCIL_FUNC
Stencil
compare
mask
All 1s glStencilFunc GL_STENCIL_VALUE_MASK
Stencil
reference
value
0 glStencilFunc GL_STENCIL_REF
Stencil fail
operation
GL_KEEP glStencilOp GL_STENCIL_FAIL
Stencil
depth fail
operation
GL_KEEP glStencilOp GL_STENCIL_PASS_DEPTH_PASS
Stencil
depth pass
operation
GL_KEEP glStencilOp GL_STENCIL_PASS_DEPTH_PASS
Stencil
write mask
All 1s glStencilMask GL_STENCIL_WRITEMASK
Stencil
buffer clear
value
0 glClearStencil GL_STENCIL_CLEAR_VALUE
Tiene una serie de limitaciones:
- El objeto reflejado sale por fuera de la superficie reflectante
- Desde detrs del espejo se ve el objeto reflejado.
- No permite reflejos infinitos. Est limitado a n reflejos.
A continuacin se muestra el algoritmo para el empleo del stencil para
simular sombras:
1.- Cargar la matriz de modelizacin.
GlMatrixMode(GL_MODELVIEW);
GlLoadIdentity();
GlLookAt(eye[0], eye[1], eye[2], center[0], center[1], center[2], up[0],
up[1], up[2]);
2.- Dada la luz y la ecuacin del plano donde se proyecta, asumiendo que el
objeto esta entre la luz y el plano, habilitar la luz y renderizar el objeto y el
plano
Glfloat lightPosition[4]={LX,LY,LZ,1.0);
Glfloat groundPlaneEquation[4]={A,B,C,D};
Colores y sombras
74
GlLightfv{GL_LIGHT0, GL_POSITION,lightPosition);
GlEnable(GL_LIGHT0);
GlEnable(GL_LIGHTING);
DibujarObjeto();
DibujarPlano();
3.- Meter en la pila la matriz de modelizacin
glPushMatrix();
4.- Construir la matriz de proyeccin, multiplicar la matriz de modelizacin
por la matriz de proyeccin de la sombra.
Glfloat Matriz[4][4];
ShadowMatrix(&matriz[0][0], LightPosition, groundPlaneEquation);
glHultMatrix(&Matriz[0][0]);
5.- Asignar un valor distinto de 0 al stencil buffer
glEnable(GL_STENCIL_BUFFER);
glStencilFunc(GL_ALWAYS, valor, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
DibujarPlanoASombrear();
GlDisable(GL_STENCIL_TEST);
6.- Deshabilitar la iluminacin
glDisable(GL_LIGHTING);
glEnable(GL_BLEND);
glBlendFunc(GL_DST_COLOR,GL_ZERO);
glColor3f(0.5,0.5,0.5);
glDisable(GL_DEPTH_TEST);
Solo debemos actualizar los pixeles marcados con valor
GlEnable(GL_STENCIL_TEST);
GlStencilFunc(GL_EQUAL, valor, ~0);
GlStencilOp(GL_KEEP, GL_KEEP,GL_ZERO);
DibujarObjeto();
7.- Restaurar los valores
Colores y sombras
75
glDisable(GL_BLEND);
glDisable(GL_STENCIL_TEST);
glEnable(GL_DEPTH_TEST);
glPopMatrix();
7.9.4.4 Buffer de Profundidad o Z buffer
Este buffer se utiliza para el manejo de las coordenadas de profundidad
de la imagen 3D. Esta es una solucin al problema de visibilidad, para detectar
que objetos de una imagen renderizada son visibles y cuales no. Cuando un
objeto es renderizado por una tarjeta grfica 3D, la profundidad de cada pxel
es almacenada en un buffer (z-buffer). Este est normalmente formado por un
array bidimensional con un elemento para cada pxel de la pantalla. Si otro
objeto de la escena tiene q renderizarse en el mismo pxel, la tarjeta grfica
compara las dos profundidades y elige la que est ms cercana al observador.
Entonces la profundidad elegida es almacenada en el z-buffer, reemplazando a
la anterior. Al final este buffer permite a la tarjeta grfica reproducir fielmente la
percepcin de profundidad, un objeto cercano tapa a los de ms lejos. La
granularidad del z-buffer tiene una gran influencia en la calidad de la imagen:
un buffer de 16 bits puede finalizar en conflicto cuando dos objetos estn muy
cercanos. Uno de 24 o 32 se comporta mucho mejor y uno de 8 casi nunca se
usa porque tiene muy poca precisin.
Figura 60 Buffer de profundidad
Colores y sombras
76
7.9.5. Volmenes de sombras
Para construir un volumen de sombras bsicamente se proyecta un rayo
de luz a travs de cada vrtice en la proyeccin de la sombra del objeto hacia
algn punto (normalmente el infinito). El conjunto de estas proyecciones
generan un volumen que engloba todos los puntos que pudieran posiblemente
verse ensombrecidos por un objeto. Cualquier objeto dentro de este volumen
debera ser ensombrecido. El volumen es presentado de tal modo que causa
pxeles ensombrecidos tener valores estarcidos. que difieren de aquellos
pxeles no sombreados.
Para un modelo poligonal, el volumen esta formado normalmente por la
clasificacin de cada cara en el modelo ya sea encarndose hacia la fuente de
luz o en su contra. El conjunto de todos los bordes que conectan la cara hacia
con la cara contra forman la silueta con respecto a la fuente de luz. Los
bordes que forman la silueta son excluidos de la luz para construir las caras del
volumen de sombra. Este volumen debe extenderse sobre el rango total de la
escena visible; a veces las dimensiones del volumen de sombra se extienden
hasta el infinito. Para formar un volumen cerrado, el frente y la trasera de esta
extrusin deben ser cubiertas. Estas cubiertas se llaman caps. Dependiendo
del mtodo usado para el volumen de sombra, el frente puede cubrir al objeto
mismo y la parte trasera puede ser omitida.
Los pasos para formar un volumen de sombras son:
Encontrar todos los bordes de siluetas.
Extender todos los bordes en direccin al foco de luz
Aadir la capa frontal y trasera a cada superficie para formar un
volumen cerrado.
Figura 61 Volumen de sombras
Colores y sombras
77
Determinar y visualizar el volumen ensombrecido es la parte ms
compleja de la tcnica. Aunque se est utilizando un mtodo muy simple para
la creacin de volmenes de sombras de geometra simple en este trabajo no
sera eficiente para el caso de miles de polgonos. Tambin puede ocurrir que
el mtodo cause algunos lugares donde los bordes de las sombras de los
volmenes se encuentren. ( Debido a que hay un nico volumen sombreado
para cada polgono). Esto puede solucionarse visualizando un nico volumen
que rodee el modelo entero en lugar de presentar los distintos volmenes de
cada polgono separados.
Efectos a tener en cuenta son:
Umbra y penumbra para producir una transicin gradual
La forma, tamao y distancia de las fuentes de luz
La iluminacin global
Figura 62 Efecto de la fuente en la sombra
Figura 63 Volumen sombras en un tringulo
Existen 3 tcnicas que usan el stencil buffer para renderizar las sombras
con volmenes de sombras lo suficientemente rpido como para utilizarlas en
aplicaciones de tiempo real, paso de profundidad, fallo en profundidad y OR
exclusivo, pero todos ellos utilizan el mismo proceso:
-renderizar la escena como si estuviera completamente en sombra.
- para cada punto de luz:
-usar la informacin de profundidad de la escena para construir una
mascara en el stencil buffer que tiene huecos solo donde la superficie visible
no es una sombra
-Renderizar la escena de nuevo como si estuviera completamente
iluminada, usando el stencil buffer para la mscara de las reas sombreadas.
Colores y sombras
78
La diferencia entre estos mtodos ocurre en el segundo paso de la
generacin de la mscara. Unos requieren un paso, otros dos y requieren
diferente nivel de precisin para el stencil buffer.
7.9.5.1 Paso de profundidad (Depth pass)
Heidemann propuso que si el frente de las superficies y la trasera de las
sombras eran renderizadas en pasos separados, el nmero de caras frontales
y traseras de un objeto puede ser contado usando el stencil buffer. Si la
superficie de un objeto esta en sombra, habr ms superficies sombreadas
frontalmente entre ella y el ojo que con las superficies traseras sombreadas. Si
su nmero es igual, sin embargo, la superficie del objeto no es una sombra.
7.9.5.2 Error de Profundidad (Depth fail)
Sobre el 200 algunas personas descubrieron que el mtodo de
Heidmann puede trabajar desde cualquier punto de la cmara reinvirtiendo la
profundidad. En vez de contar las caras frontales sombreadas de la superficie
del objeto, las superficies traseras se pueden contar as fcilmente con el
mismo resultado. Esto soluciona el problema de tener el observador en
sombra, pero introduce la condicin de que el extremo posterior del volumen de
sombras debe ser encapsulado o las sombras terminarn perdindose donde
los puntos del volumen van al infinito.
7.9.7.3 OR exclusivo
Las dos tcnicas anteriores pueden aproximarse mediante la variacin
OR exclusivo, que no trata propiamente con la interseccin de los volmenes
de sombras, pero ahorra un paso de renderizacin y solo requiere un bit de
stencil buffer.
7.10 Fusin (Dithering)
Es una tcnica usada para crear la ilusin de profundidad de color en
imgenes con una paleta de colores limitada. En una imagen con fusin los
colores no disponibles en la paleta original son aproximados por una difusin
de los pxel coloreados dentro de la paleta disponible. El ojo humano percibe la
difusin como una mezcla de colores.
Figura 64 Ejemplo fusin
Colores y sombras
79
Esta imagen est formada solo por rojo y azul, pero segn se van
haciendo mas pequeos los pixeles el ojo humano empieza a percibir un nuevo
color mezcla de la aproximacin de los dos presentes, con lo cual se puede
percibir un color morado no presente en la paleta de colores inicial, pero la
imagen sigue estando compuesta solo por rojo y azul.
Figura 65 Imagen sin fusin Figura 66 Imagen con fusin
Se puede obtener una buena calidad de imagen con aproximadamente 8
bits de R,G,B sin utilizar fusin. Slo porque nuestra maquina tenga 24 planos
de color no significa que la fusin no sea deseable. Por ejemplo, si estamos
ejecutando en modo doble buffer, los planos de color pueden ser divididos en 2
conjuntos de 12, as tendremos slo 4 bits para cada componente RGB. Sin
fusin 4 bits por componente ofrecen resultados poco satisfactorios.
Figura 67 Incremento de difusin
Colores y sombras
80
Nota: La fusin al contrario que otras caractersticas est habilitada por
defecto.
Se puede deshabilitar con glDisable(GL_DITHER).
Y habilitar con glEnable( GL_DITHER ).
7.11. Creacin de Paletas de Ventana
Podemos crear una paleta utilizando la funcin CreatePalette() e
identificando la paleta mediante un indicador del tipo HPALETTE:
HPALETTE CreatePalette(
CONST LOGPALETTE *lplgpl // puntero a la paleta
lgica de color
);
Esta paleta utiliza una estructura lgica de paleta (LOGPALETE) que
contiene 256 entradas, especificando los 8 bits para las componentes R,G,B.
7.11.1 Arbitraje de paletas
En la publicidad del sistema Windows se afirma que su sistema
operativo es multitarea, por lo tanto se debe permitir la ejecucin simultanea de
varias aplicaciones. Pero el hardware solo permite 256 colores en la paleta del
sistema que deben ser compartidos por todas las aplicaciones en ejecucin. Si
alguna de las aplicaciones modifica la paleta del sistema puede que se altere la
presentacin de imgenes de otras aplicaciones produciendo efectos no
deseados. Windows proporciona un conjunto de mensajes para arbitrar el uso
de paletas entre varias aplicaciones. Por lo tanto si una aplicacin modifica la
paleta del sistema se notificar este cambio al resto de las aplicaciones en
ejecucin.
Cuando una aplicacin se convierte en la aplicacin activa Windows
enva el mensaje WM_QUERYNEWPALETTE a la ventana principal de la
aplicacin, preguntndole si desea copiar las entradas de su paleta privada en
las entradas del sistema. En caso afirmativo la aplicacin selecciona la paleta
en el contexto de dispositivo para la ventana actualizada y llama despus a
RealizePalette().
Otro mensaje que puede enviar Windows para el arbitraje de las paletas
es WM_PALETTECHANGED que indica a la ventana que puede seleccionar la
paleta, incluso si no es la ventana activa.
En el siguiente ejemplo mostramos la realizacin de este procedimiento:
// Procedimiento de la ventana, gestiona todos los
mensaje de este programa
LRESULT CALLBACK WndProc (HWND hWnd,UINT
message,WPARAM wParam,LPARAM lParam)
... // Windows le dice a la aplicacin que puede
modificar la paleta del sistema.
Colores y sombras
81
// Es decir, este mensaje solicita una nueva paleta a
la aplicacin
case WM_QUERYNEWPALETTE:
// Si la paleta fue creada
if(hPalette)
{
int nRet;
// Selecciona la paleta en el contexto
de dispositivo actual
SelectPalette(hDC, hPalette, FALSE);
//Correspondencia de entradas entre la
paleta actualmente
// seleccionada y la paleta del
sistema. El valor devuelto es
// el nmero de entradas de la paleta
modificada.
nRet = RealizePalette(hDC);
// Al redibujar se fuerza el
replanteado de la paleta
// en la ventana actual
InvalidateRect(hWnd,NULL,FALSE);
return nRet;
}
break;
// Esta ventana puede seleccionar la paleta,
incluso si no
// es la ventana activa.
case WM_PALETTECHANGED:
// No hacer nada si la paleta no existe, o
si esta
// es la ventana que cambio la paleta
if((hPalette != NULL) && ((HWND)wParam !=
hWnd))
{
// Selecciona la paleta en el contexto
de dispositivo
SelectPalette(hDC,hPalette,FALSE);
// Entrada en la paleta del sistema
RealizePalette(hDC);
// Reasigna los colores actuales a la
nueva paleta realizada
UpdateColors(hDC);
return 0;
}
break;}
Colores y sombras
82
7.11.2. Creacin de una paleta.
Determinamos si nuestra aplicacin necesita una paleta llamando a la
funcin DescribePixelFormat() despus de haber definido el formato de pxel.
Se ha de comprobar el valor del miembro dwFlags de la estructura
PXELFORMATDESCRIPTOR devuelto por DescribePixelFormat(),
comprobaremos el valor del bit PFD_NEED_PALETTE, si estuviese activo
tendramos que crear una paleta para uso de la aplicacin.
7.11.3 Estructura de la paleta.
Para crear una paleta reservaremos memoria para la estructura
LOGPALETTE.
typedef struct tagLOGPALETTE { // lgpl
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[1];
} LOGPALETTE;
La estructura se ha de completar con informacin sobre nuestra paleta y
llamar a la funcin CreatePalette() pasndosela como argumento.
Cada entrada en la paleta es una estructura PALETTEENTRY definida
de la forma:
typedef struct tagPALETTEENTRY { // pe
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags;
} PALETTEENTRY;
- peRed, peGreen y peBlue representan las intensidades relativas para las
componentes de 8 bits RGB. As cada una de las 256 entradas de la paleta
contendr una definicin de color de 24 bits.
- PeFlags se utiliza para especificar opciones avanzadas de la paleta.
Normalmente su valor ser NULL.
En el siguiente ejemplo mostramos la creacin, arbitraje y estructura de
una paleta:
// Selecciona el formato de pxel para un contexto de
dispositivo
void SetDCPixelFormat(HDC hDC)
{
int nPixelFormat;
static PIXELFORMATDESCRIPTOR pfd = {
Colores y sombras
83
sizeof(PIXELFORMATDESCRIPTOR), // Tamao de la
estructura
1,
// Version of this structure
PFD_DRAW_TO_WINDOW | // Dibuja en la ventana (No
en el mapa de bits)
PFD_SUPPORT_OPENGL | // Soporta llamada
OpenGL en la ventana
PFD_DOUBLEBUFFER, // Modo de doble Buffer
PFD_TYPE_RGBA, // Modo de color RGBA
24, // Pide
24 bits de color
0,0,0,0,0,0, // No se usa
para seleccionar el modo
0,0, // No se
usa para seleccionar el modo
0,0,0,0,0, // No se
usa para seleccionar el modo
32, // Tamao
del Buffer de Profundidad
0, // No se
usa para seleccionar el modo
0, // No se
usa para seleccionar el modo
PFD_MAIN_PLANE, // Dibuja en el plano
principal
0, // No se
usa para seleccionar el modo
0,0,0 }; // No se usa
para seleccionar el modo
// Escoge el formato de pxel que mejor encaje en los
descrito por pfd
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
// Selecciona el formato de pxel para el contexto de
dispositivo
SetPixelFormat(hDC, nPixelFormat, &pfd);
}
// Si es necesario, crea una paleta 3-3-2 para el contexto
de dispositivo listado
HPALETTE GetOpenGLPalette(HDC hDC)
{
HPALETTE hRetPal = NULL; // Indicador a la paleta que
va a crear
PIXELFORMATDESCRIPTOR pfd; // Descriptor del
formato de pxel
LOGPALETTE *pPal; // Puntero a memoria
para la paleta lgica
Colores y sombras
84
int nPixelFormat; // ndice del formato de
pxel
int nColors; // Numero de entradas en
la paleta
int i; // Variable de
cuenta
BYTE RedRange,GreenRange,BlueRange;
// Rango para cada
entrada de color (7,7,y 3)
//Toma el formato de pxel y recupera la descripcin
del formato de pxel
nPixelFormat = GetPixelFormat(hDC);
DescribePixelFormat(hDC, nPixelFormat,
sizeof(PIXELFORMATDESCRIPTOR), &pfd);
//Necesita una paleta este formato de pxel? Si no,
no crea una paleta
// y devuelve NULL
if(!(pfd.dwFlags & PFD_NEED_PALETTE))
return NULL;
//Numero de entradas en la paleta. 8 bits abarcan 256
entradas
nColors = 1 << pfd.cColorBits;
//Reserva espacio para la estructura de la paleta
lgica mas todas las entradas de paleta
pPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE)
+nColors*sizeof(PALETTEENTRY));
// Completa la cabecera de la paleta
pPal->palVersion = 0x300; // Windows 3.0
pPal->palNumEntries = nColors; // Dimensiones de la
tabla
//Crea una mascara de 1's. esto crea un numero
representado por tener
//activo los bits x de menor orden, donde x =
pfd.cRedBits,
//pfd.cGgreenBits y pfd.cBlueBits.
RedRange = (1 << pfd.cRedBits) -1;
GreenRange = (1 << pfd.cGreenBits) - 1;
BlueRange = (1 << pfd.cBlueBits) -1;
// Bucle a travs de todas las entradas de paleta
for(i = 0; i < nColors; i++)
{
// Completa las equivalencias de 8 bits para cada
componente
Colores y sombras
85
pPal->palPalEntry[i].peRed = (i >> pfd.cRedShift)
& RedRange;
pPal->palPalEntry[i].peRed = (unsigned char)(
(double) pPal->palPalEntry[i].peRed * 255.0
/ RedRange);
pPal->palPalEntry[i].peGreen = (i >>
pfd.cGreenShift) & GreenRange;
pPal->palPalEntry[i].peGreen = (unsigned char)(
(double)pPal->palPalEntry[i].peGreen * 255.0
/ GreenRange);
pPal->palPalEntry[i].peBlue = (i >>
pfd.cBlueShift) & BlueRange;
pPal->palPalEntry[i].peBlue = (unsigned char)(
(double)pPal->palPalEntry[i].peBlue * 255.0
/ BlueRange);
pPal->palPalEntry[i].peFlags = (unsigned char)
NULL;
}
// Crea la paleta
hRetPal = CreatePalette(pPal);
// Avanza, selecciona y realiza la paleta para este
contexto de dispositivo
SelectPalette(hDC,hRetPal,FALSE);
RealizePalette(hDC);
// Libera la memoria usada para la estructura lgica
de paleta
free(pPal);
// Devuelve el indicador a la nueva paleta
return hRetPal;
}
7.11.4 Destruccin de una paleta.
Debemos crear y realizar la paleta antes de crear o activar el contexto de
dispositivo.
En el siguiente ejemplo mostramos las operaciones necesarias para
crear y destruir una ventana teniendo en cuenta la posible existencia de una
paleta
// Procedimiento de la ventana, gestiona todos los mensaje
de este programa
Colores y sombras
86
LRESULT CALLBACK WndProc( HWND hWnd,UINT message,
WPARAM wParam, LPARAM lParam)
{
static HGLRC hRC; // Contexto de
generacin permanente
static HDC hDC; // GDI privado del
contexto de dispositivo
switch (message)
{
// Creacion de ventana para OpenGL
case WM_CREATE:
// Almacena el contexto de dispositivo
hDC = GetDC(hWnd);
// Selecciona el formato de pxel
SetDCPixelFormat(hDC);
// Crea la paleta
hPalette = GetOpenGLPalette(hDC);
// Crea el contexto de generacin y lo
activa
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
// Llamada a la funcin de iniciacin de la
aplicacin
Init();
break;
// Se destruye la aplicacin, hay que
limpiar todo!
case WM_DESTROY:
// Desactiva el contexto de generacin
actual y lo borra
wglMakeCurrent(hDC,NULL);
wglDeleteContext(hRC);
ReleaseDC(hWnd,hDC);
// Borra la paleta si fue creada
if(hPalette != NULL)
DeleteObject(hPalette);
// Le dice a la aplicacin que termine
despus de que
// se cierre la ventana
PostQuitMessage(0); break;
7.12 Conclusin
En este tema hemos aprendido qu es el color y el sombreado, cual es
la naturaleza de la luz, como la percibe el ojo humano y algunos de los
modelos que se utilizan para su representacin.
Hemos visto la necesidad de introducir el sombreado o degradado de
color para obtener un resultado ms realista en nuestras escenas.
Se han introducido todas las funciones necesarias para establecer el
color de un objeto, el color con el que se limpia la pantalla, el modelo con el
que se va a realizar el sombreado, la utilizacin de paletas y su gestin en
OpenGL. Se han proporcionado ejemplos de aplicaciones que hacen uso de
todas para facilitar su comprensin y posterior utilizacin.
7.13 Otras funciones para luces y sombras
glAccum
Propsito: Opera en el buffer de acumulacin para establecer los valores de
pxel.
Fichero de inclusin: <GL/gl.h>
Sintaxis: void glAccum(GLenum func, GLfloat valor);
Descripcin: Esta funcin opera en el buffer de acumulacin. A excepcin de
GL_RETURN, los valores de color se escalan segn el parmetro valor y
se aaden o suman al buffer de acumulacin. En el caso de
GL_RETURN, los valores de color del buffer de acumulacin se escalan
segn el parmetro valor y se almacenan en el buffer de color actual.
Parmetros:
func
GLenum: la funcin de acumulacin aplicada. Las funciones vlidas son las
siguientes:
GL_ACCUM: Aade valores de color escalados al buffer
de acumulacin.
GL_LOAD: Abre valores de color escalados en el buffer
de acumulacin, sustituyendo a los que hubiera antes.
GL_ADD: Aade un color constante a los valores del buffer
de acumulacin.
GL_MULT: Multiplica los valores de color en el buffer
Colores y sombras
88
de acumulacin por un valor constante.
GL_RETURN: Copia el buffer de acumulacin en el buffer
de color principal.
Retornos: Ninguno.
glColorMask
Propsito: Activa o desactiva la modificacin de las componentes de color en
los buffers de color.
Fichero de inclusin: <gl.h>
Sintaxis: void glColorMask(GLboolean bRojo, GLboolean bVerde, GLboolean
bBlue, GLboolean bAlfa);
Descripcin: Esta funcin permite cambios individuales en las componentes
de color en el buffer de color para activarlas o desactivarlas.
Parmetros:
bRojo
Glboolean: especifica cundo se puede modificar la componente roja.
bVerde
Glboolean: especifica cundo se puede modificar la componente verde.
bAzul
Glboolean: especifica cundo se puede modificar la componente azul.
bAlfa
Glboolean: especifica cundo se puede modificar la componente alfa.
Retornos: Ninguno.
glDrawBuffer
Propsito: Selecciona un buffer de color para dibujar.
Fichero de inclusin: <GL/gl.h>
Sintaxis: void glDrawBuffer(GLenum modo);
Descripcin: Esta funcin selecciona un buffer de color para las operaciones
de dibujo siguientes. Normalmente la usaremos para seleccionar el buffer
frontal u oculto en un contexto de dibujo con doble buffer.
Parmetros:
modo
Glenum: una constante que selecciona el buffer de color en el que vamos a
trabajar. Puede ser un valor de la siguiente tabla.
Colores y sombras
89
Retornos: Ninguno.
Valor de modo Descripcin
GL_NONE No se dibuja en ningn buffer de color.
GL_FRONT Dibujamos slo en el buffer de color frontal (visible).
GL_BACK Dibujamos slo en el buffer de color trasero (oculto).
GL_FRONT_AND_BACK Dibujamos en ambos buffers de color.
glFog
Propsito: Especifica los parmetros de niebla.
Fichero de inclusin: <GL/gl.h>
Sintaxis:
void glFogf( GLenum pnombre, GLfloat params);
void glFogfv( GLenum pnombre, GLfloat *params);
void glFogi( GLenum pnombre, GLint params);
void glFogiv( GLenum pnombre, GLint *params);
Descripcin: Define los parmetros de niebla. Para dibujar usando niebla,
debemos hacer una llamada a glEnable(GL_FOG).
Parmetros:
pnombre
Glenum: el parmetro definido. Los nombres vlidos son los siguientes:
GL_FOG_COLOR: Color de la niebla.
GL_FOG_DENSITY: Densidad de la niebla.
GL_FOG_END: Distancia ms alejada a la que se aplica niebla.
GL_FOG_INDEX: El ndice de color usado para niebla si se est
en modo indexado.
GL_FOG_MODE: El tipo de niebla.
GL_FOG_START: La distancia ms cercana a la que se aplica la
niebla.
Retornos: Ninguno.
Colores y sombras
90
glIndexMask
Propsito: Evita la modificacin de bits individuales del buffer de color.
Fichero de inclusin: <gl.h>
Sintaxis: void glIndexMask( GLuint mascara);
Descripcin: Esta funcin permite enmascarar bits individuales en el buffer
de color indexado. Cuando se activa el bit de mscara, los bits son
modificables; cuando son cero, estn protegidos. Esta funcin slo se aplica
al modo de color indexado.
Parmetros:
mascara
GLuint: especifica la mscara binaria que activa o desactiva la escritura en los
bits individuales del buffer de color indexado.
Retornos: Ninguno.
glIsEnabled
Propsito: Verifica si una funcin de OpenGL est activada.
Fichero de inclusin: <GL/gl.h>
Sintaxis: Glboolean glIsEnabled(GLenum caract);
Descripcin: Devuelve GL_TRUE si la funcin especificada ha sido activada,
GL_FALSE en otro caso.
Parmetros:
caract
GLenum: la funcin a verificar (ver glEnable).
Retornos: GLboolean: GL_TRUE si la funcin est activada, GL_FALSE si
no.
glLogicOp
Propsito: Selecciona la operacin lgica para el modo de color indexado.
Fichero de inclusin: <gl.h>
Sintaxis: void glLogicOp( GLenum opcode);
Descripcin: La operacin lgica de pxel define la combinacin de valores
de pxel. Cuando se especifica un nuevo valor de ndice de color para una
Colores y sombras
91
localizacin de pxel, se combina lgicamente con el valor del ndice de color
actual de ese pxel.
Parmetros:
opcode
GLenum: especifica el modo lgico de pxel que hay que usar. Son vlidos:
GL_CLEAR, GL_SET, GL_COPY, GL_COPY_INVERTED, GL_NOOP,
GL_INVERT, GL_AND, GL_NAND, GL_OR, GL_NOR, GL_XOR, GL_ EQUIV,
GL_AND_REVERSE, GL_AND_INVERTED, GL_OR_REVERSE y
GL_OR_INVERTED.
Retornos: Ninguno.
glPolygonMode
Propsito: Selecciona el modo en que se generan los polgonos.
Fichero de inclusin: <gl.h>
Sintaxis: void glPolygonMode(Glenum cara, GLenum modo);
Descripcin: Esta funcin nos permite cambiar la forma en que se generan
los polgonos. Por defecto, los polgonos se rellenan o sombrean con el color
o las propiedades de material actuales. Sin embargo, podemos especificar
que se dibujen slo los perfiles o los vrtices.
Parmetros:
cara
GLenum: especifica a qu cara de los polgonos afecta el cambio de modo:
GL_FRONT, GL_BACK, GL_FRONT_AND_BACK.
modo
GLenum: especifica el nuevo modo de dibujo. El valor por defecto es GL_FILL,
que produce polgonos slidos. GL_LINE produce perfiles de polgonos y
GL_POINT slo traza los puntos de los vrtices. La bandera de borde activada
por glEdgeFlag afecta a las lneas y puntos dibujados con GL_LINE y
GL_POINT.
Retornos: Ninguno.
Colores y sombras
92
7.14 Bibliografia
"Grficas por Computador"
Autor: Hearn, Baker
Ed: Prentice Hall
"Computer Graphics: Systems&Concepts"
Autor: Salmon, Slater
Ed: Addison
"Introduction to the GKS"
Autor: Hopgood, Duce
Ed: Academic Press, 86
Introduction to Computer Graphics
Autor: Foley, Van Dam
Ed: Addison-Wesley
Visual Cues
Autor: Keller
Ed: IEEE, 1993
"Three Dimensional Computer Graphics"
Autor: Watt
Ed: Addison
"Mathematical Elements for Computer Graphics"
Autor: Rogers, Adams
Ed: McGraw
"Curves and Surfaces in Computer Aided Geometric Design"
Autor: Yamaguchi
Ed: Springer
Interactive Computer Graphics: A Top-Down Approach with OpenGL
Autor: Angel
Ed: Addison Wesley, 1997
Computer Graphics 2/e
Autor: Hearn
Ed: Prentice Hall
3D Computer Graphics, 2/e
Autor: Watt
Ed: Addison Wesley
Colores y sombras
93
Introduction to Computer Graphics
Autor: Foley
Ed: Addison Wesley
OpenGL Programming Guide & Reference Manual
Autor: Varios
Ed: Addison Wesley
Inventor Mentor & Toolmaker
Autor: Varios
Ed: Addison Wesley
SIGGRAPH '98 Conference Proceedings
Autor: Varios
Ed: Addison Wesley
Opengl Architecture Review Board, OpenGL Reference Manual, The Official
Reference Document to OpenGL, Version 1.2
Autor: Dave Shreiner
OpenGL SuperBible, Second Edition (SuperBible)
Autor: Richard S. Wright Jr., Richard S., Jr. Wright
OpenGL Programming for the X Window System
Autor: Mark J. Kilgard
Computer Graphics : Principles and Practice, Second Edition in C by
Autor: James D. Foley
OpenGL Architecture Review Board, OpenGL(r) 1.2 Programming Guide
Autor: Mason Woo, Jackie Neider, Tom Davis, Dave Shreiner
OpenGL Architecture Review Board, OpenGL(r) 1.2 Programming Guide
Autor: Mason Woo, Jackie Neider, Tom Davis, Dave Shreiner
"COMPUTER GRAPHICS: An object-oriented approach to the art and science"
Autor: Cornel Pokorny
Ed: Franklin, Beedle & Associates Incorporated
Colores y sombras
94
"COMPUTER GRAPHICS: C version" (2nd. ed. o posterior)
Autores: Donald Hearn and M. Pauline Baker
Ed: Prentice Hall
"COMPUTER GRAPHICS: Principles and practice (C version)"
Autores: J. Foley, A. van Dam, S.K. Feiner and J.F. Hughes
Ed: Addison-Wesley Publishing Company
"COMPUTER GRAPHICS"
Autor: F.S. Hill Jr.
Ed: Macmillan Publishing Co.
"Interactive Computer Graphics: a top-down approach with OpenGL"
Autor: E. Angel
Ed: Addison-Wesley Publishing Company, 1997
"Mathematical Elements for Computer Graphics"
Autores: D.F.Rogers and J.A.Adams
Ed: McGraw Hill, 1.976.
"Principles of Interactive Computer Graphics"
Autores: W. Newman and R. Sproull
Ed: McGraw Hill, 1979.
"Raster Graphics Handbook, Conrac Division, 2nd edition"
Ed: Van Nostrand Reinhold Co., 1.984.
"The Mathematical Structure of Raster Graphics"
Autores: Eugene L. Fiume
Ed: Academic Press, Inc., 1986.
"Windows NT OpenGL: Getting Started."
Autores: Crain, Dennis
Ed: MSDN Library, Technical Articles
OpenGL Programming Guide: The Official Guide to Learning OpenGL, Release 1
Autores: Neider, Jackie, Tom Davis, and Mason Woo
Ed: Addison-Wesley
Principles of Digital Image Synthesis
Autores: Glassner
Ed: Morgan Kaufmann Publisher, 1995.
Colores y sombras
95
Computer Graphics: Principles and Practice (2nd. Ed. in C)
Autores: Foley, van Dam, Feiner, Hughes
Ed: Addison-Wesley Publishing Company, 1993.
Radiosity and Realistic Image Synthesis
Autores: Cohen, Wallace
Ed: Academic Press, 1993.
Computer Graphics Proceedings. Annual Conference Series.
Autores: Varios
Ed: ACM SIGGRAPH (ACM Special Interest Group on Computer Graphics).
Rendering Techniques (Proceedings del EG Workshop on Rendering)
Autores: Varios
Ed: Springer Verlag, aos 1994 hasta 1999
OpenGL Architecture Review Board. OpenGL Reference Manual: The Official
Reference Document for OpenGL, Release 1. Reading, MA
Autores: Varios
Ed: Addison-Wesley, 1992
"Advanced 3-D Graphics for Windows NT 3.5: Introducing the OpenGL Interface, Part
I." Microsoft Systems Journal 9 (October 1994)
Autores: Prosise, Jeff
Ed: MSDN Library Archive Edition, Books and Periodicals)
"Advanced 3-D Graphics for Windows NT 3.5: The OpenGL Interface, Part II."
Microsoft Systems Journal 9 (November 1994)
Autores: Prosise, Jeff
Ed: MSDN Library Archive Edition, Books and Periodicals)
"OpenGL I: Quick Start."
Autores: Rogerson, Dale
Ed: (MSDN Library, Technical Articles)
Colores y sombras
96
"OpenGL II: Windows Palettes in RGBA Mode."
Autores: Rogerson, Dale
Ed: (MSDN Library, Technical Articles)
"OpenGL III: Building an OpenGL C++ Class."
Autores: Rogerson, Dale
Ed: (MSDN Library, Technical Articles)
Using DIBs with Palettes.
Autores: Gery, Ron
Ed: (MSDN Library, Technical Articles)
7.15 Enlaces de inters
http://cannes.itam.mx/Alfredo/Espaniol/Cursos/Grafica/Sombreado.pdf
http://en.wikipedia.org/
http://www.opengl.org/
http://www.dsic.upv.es/users/sig/personales/ramon/esp/GrafInternet.html
http://www.ii.uam.es/~pedro/graficos/teoria/index.html
http://m3d.uib.es/grafica2/Ejemplos.html
http://serdis.dis.ulpgc.es/~atrujill/iga/Practicas2000.htm
http://sgio2.cem.itesm.mx/rudomin/graf99/curso.htm
http://victoryrocio.datablocks.net/i/opengl/
http://www.codexmx.com/macedonia/opengl2.htm
http://www.ldc.usb.ve/~jhony/graficasII/p1/informe1.html
http://www.salleurl.edu/CITeM/grafics/recursos/arxius/cap3.pdf
http://www2.ing.puc.cl/~iic1222/glex
http://giig.ugr.es/~cadii/Doc/Articulo
http://trant.sgi.com/opengl/examples/redbook/redbook.html
Colores y sombras
97
http://www.eecs.tulane.edu/www/graphics/doc/OpenGL-Man-Pages/index.html
http://giig.ugr.es/~curena/doce/docto/
http://odra.dcs.fi.uva.es/area2/opengl/colorysombra.html
http://odra.dcs.fi.uva.es/area2/opengl/refgl.html
http://giig.ugr.es/~curena/doce/vr/transparencias/