Está en la página 1de 97

Universidad & Salamanca

Ingeniera Superior Informtica.





TEMA 7
Colores y Sombras

Informtica Grfica




Jos Mara Corral Martn
lvaro F. Garca Snchez


Colores y sombras
2
7.1. Introduccin................................................................................................. 4
7.2. Qu es el color?........................................................................................ 4
7.2.1. La luz como Onda................................................................................. 5
7.2.2. La luz como partcula............................................................................ 6
7.2.3. Dualidad onda - partcula...................................................................... 6
7.3. Percepcin del color.................................................................................... 6
7.3.1. Caractersticas psicolgicas del color ................................................... 7
7.4. Dispositivos de visualizacin....................................................................... 9
7.4.1. TRC ...................................................................................................... 9
7.4.1.1. Anlisis de los tiempos involucrados............................................ 10
7.4.1.2. Exploracin de lnea..................................................................... 10
7.4.1.3. Sincronizaciones horizontales y verticales................................... 11
7.4.2. LCD..................................................................................................... 12
7.4.2.1. Funcionamiento............................................................................ 14
7.4.2.2 LCD de texto ................................................................................. 14
7.4.2.3. TFT............................................................................................... 14
7.4.3. Pantalla de plasma ............................................................................. 15
7.5. El monitor vs. El ojo................................................................................... 16
7.6. Profundidad del color ................................................................................ 16
7.6.1. Color de 1-bit ...................................................................................... 16
7.6.2. Color de 4-bits .................................................................................... 17
7.6.3. Color de 8-bits .................................................................................... 18
7.6.4. Color de 24-bits .................................................................................. 18
7.7. Modelos de color ....................................................................................... 19
7.7.1. Modelo de color XYZ .......................................................................... 19
7.7.1.1. Espacio de color CIE.................................................................... 19
7.7.1.1.1. Diagrama de cromaticidad CIE.............................................. 20
7.7.1.1.2. Gama de colores ................................................................... 20
7.7.2. El modelo de color RGB ..................................................................... 21
7.7.3. El modelo de color CMY (Cyan, Magenta, Amarillo)........................... 23
7.7.4. El modelo de color YUV...................................................................... 24
7.7.5. El modelo de color YIQ....................................................................... 24
7.7.6. El modelo de color HSI ....................................................................... 25
7.7.7. El sistema HLS (Hue, Saturation and Luminance).............................. 26
7.7.8. Modelo HSV........................................................................................ 26
7.8. Colores en OpenGL .................................................................................. 28
7.8.1. Utilizacin de colores con OpenGL..................................................... 28
7.8.2. Modelo de color RGBA....................................................................... 30
7.8.3. Modelo de color indexado................................................................... 36
7.8.4. Modelo de color RGBA vs. Modelo de color Indexado........................ 48
7.8.5. Ocultaciones....................................................................................... 49
7.8.5.1. Algoritmo de las caras de detrs.................................................. 49
7.8.5.2 Algoritmo del Z-buffer.................................................................... 50
7.8.5.3. Combinando ambos algoritmos.................................................... 51
7.8.6. El color de los materiales.................................................................... 52
7.9. Sombras.................................................................................................... 58
7.9.1 Efecto falloff (Distance falloff) .............................................................. 60
7.9.2 Sombreado .......................................................................................... 61
7.9.3 Tipos de sombreado............................................................................ 62
7.9.3.1 Sombreado plano (Flat Shading)................................................... 62
Colores y sombras
3
7.9.3.2 Sombreado de Gouraud................................................................ 63
7.9.3.3 Sombreado de Phong ................................................................... 65
7.9.3.4 Sombreado BlinnPhong .............................................................. 67
7.9.4 Sombreado en OpenGL....................................................................... 68
7.9.4.1 Sombreado Plano (Flat) ................................................................ 68
7.9.4.2 Sombreado Interpolativo y Gouraud.............................................. 70
7.9.4.3 Stencil Buffer................................................................................. 71
7.9.4.4 Buffer de Profundidad o Z buffer ................................................... 75
7.9.5. Volmenes de sombras ...................................................................... 76
7.9.5.1 Paso de profundidad (Depth pass)................................................ 78
7.9.5.2 Error de Profundidad (Depth fail)................................................... 78
7.9.7.3 OR exclusivo ................................................................................ 78
7.10 Fusin (Dithering)..................................................................................... 78
7.11. Creacin de Paletas de Ventana............................................................. 80
7.11.1 Arbitraje de paletas............................................................................ 80
7.11.2. Creacin de una paleta..................................................................... 82
7.11.3 Estructura de la paleta. ...................................................................... 82
7.11.4 Destruccin de una paleta. ............................................................... 85
7.12 Conclusin................................................................................................ 87
7.13 Otras funciones para luces y sombras ..................................................... 87
glAccum........................................................................................................ 87
glColorMask.................................................................................................. 88
glDrawBuffer ................................................................................................. 88
glFog............................................................................................................. 89
glIndexMask.................................................................................................. 90
glIsEnabled................................................................................................... 90
glLogicOp...................................................................................................... 90
glPolygonMode............................................................................................. 91
7.14 Bibliografia................................................................................................ 92
7.15 Enlaces de inters.................................................................................... 96

Colores y sombras
4
7.1. Introduccin

Los despliegues realistas de objetos se obtienen generando
proyecciones en perspectiva con superficies ocultas eliminadas y despus
aplicando modelos de sombreado y color a las superficies visibles. Un modelo
de sombreado se utiliza para calcular la intensidad de luz que debe observarse
cuando se visualiza una superficie. Estos clculos de intensidad se basan en
las propiedades pticas de las superficies, las posiciones relativas de las
superficies y su orientacin con respecto a las fuentes de luz.

En este tema se introducirn los conceptos de color y sombreado,
algunos de los modelos ms utilizados actualmente para su representacin
para posteriormente mostrar todo lo necesario para la utilizacin del color y del
sombreado en escenas con OpenGL con multitud de ejemplos sencillos.

7.2. Qu es el color?

El color de un objeto percibido por la vista se debe a las propiedades
inherentes al mismo, de reflejar, seleccionar y absorber determinados rayos de
los que integran la luz blanca. La luz solar es un fenmeno vibratorio de
innumerables variaciones en cuanto a longitud de onda. Al pasar la luz por un
prisma se ve que est compuesta por un sinnmero de colores; los
fundamentales son: violeta (que corresponde a la vibracin ms pequea y
simple), ail, azul, verde, amarilla, naranja y rojo. El color negro resulta de la
ausencia de toda impresin luminosa.

Diccionario Enciclopdico Abreviado Espasa-Calpe.S.A

Segn la definicin el color de un objeto se debe a la combinacin de las
distintas longitudes de onda que el objeto refleja, as por ejemplo un objeto rojo
sera aquel que absorbiese todos los rayos que componen la luz blanca menos
el de menor longitud de onda (el rojo).

El color en las artes es el medio ms valioso para que una obra
transmita las mismas sensaciones que el artista experimenta frente a la escena
o motivo original; utilizando el color adecuadamente y con conocimiento de su
naturaleza y efectos ser posible expresar la alegra o tristeza, la luminosidad u
oscuridad, tranquilidad o la exaltacin, etc.

El color en la informtica grfica se desenvuelve de la misma manera
que en el arte de la pintura, aunque en su actuacin va mucho mas all porque
su fin es especialmente especifico, puede servir para favorecer, destacar,
disimular y an ocultar, para crear una sensacin excitante o tranquila, para
denotar temperatura, tamao, profundidad o peso y como la msica, puede ser
utilizada deliberadamente para despertar un sentimiento.

El color tiene su propia tcnica y est sometido a ciertas leyes,
conocindolas ser posible dominar el arte de la armonizacin, conocer los
medios tiles que sirven para evitar la monotona en una combinacin
Colores y sombras
5
cromtica, estimular la facultad del gusto selectivo y afirmar la sensibilidad,
desconocindolas es posible trastornar y anular las percepciones deseadas.

7.2.1. La luz como Onda

Lo que percibimos como color es una banda de frecuencias del espectro
electromagntico, otras bandas de frecuencias incluidas en el espectro son las
ondas de radio, infrarrojos, etc. Cada
frecuencia contenida en el espectro
visible se corresponde con un color
distinto.

El espectro visible abarca
desde los 4.3*10
14
Hz (rojo) hasta los
7.5 * 10
14
Hz (violeta). En este
intervalo de frecuencias el ojo humano distingue aproximadamente unos
400.000 colores diferentes (esta gama se extiende desde el rojo pasando por el
anaranjado y amarillo en el extremo de las bajas frecuencias hasta los azules y
violetas de las altas frecuencias).


Figura 2 - Espectro Electromagntico


Lo que se designa como luz blanca es la impresin creada por el
conjunto de radiaciones que son visibles por nuestro ojo; la luz blanca cuando
es descompuesta produce el fenmeno de arco iris, estos son los que
llamamos colores, el conjunto de estos, o franja continua de longitudes de onda
creada por la luz al descomponerse, constituye el espectro.

Describimos los colores en funcin de su frecuencia o de su longitud de
onda dado que la luz es una onda electromagntica (C = *f). La longitud de
onda en el espectro visible vara desde los 720 nanmetros del rojo a los 390
nanmetros del violeta.

Cualquier fuente de luz (sol, foco de luz ...) emite todas las
frecuencias en el intervalo visible para producir la luz blanca.

Figura 1 - Estructura de una onda
Colores y sombras
6
Un objeto sobre el que incide luz blanca absorber algunas frecuencias
y reflejar otras. La combinacin de stas ltimas determinar el color del
objeto. Describimos el objeto como violeta si predominan las altas frecuencias
en la luz reflejada, es decir, la luz tiene una frecuencia dominante o longitud
de onda dominante en el extremo violeta del espectro. La frecuencia
dominante se denomina color o matiz de la luz.

7.2.2. La luz como partcula

La luz puede ser descrita como una onda oscilante, pero tambin puede
ser considerada como un haz de partculas viajando a altas velocidades (3,0 x
10
8
m/s). Los haces de luz estn compuestos por partculas denominadas
fotones.

A nivel fsico, los llamados colores compuestos, estn hechos de
diversas cantidades de de colores puros encontrados en el espectro.

Al iluminar cualquier objeto dado con una fuente de luz es golpeado por
billones y billones de fotones, o pequeas partculas de luz, algunos de ellos
sern absorbidos y otros reflejados. La reflexin de la luz sobre un objeto
depende del tipo, distribucin y cantidad de tomos que contenga.

Cada uno de esos fotones es tambin una onda, con su correspondiente
longitud de onda y por tanto un color especfico en el espectro.

7.2.3. Dualidad onda - partcula

La frecuencia () de la teora de las ondas se puede relacionar con la
teora del fotn (E) de la teora de la partcula a travs de la ecuacin de
Planck:
E = h
donde h es la constante de planck (factor de proporcionalidad = 6,63 x
10
-34
(Js)).

La frecuencia () de una determinada onda es inversamente
proporcional a su longitud de onda.



7.3. Percepcin del color

El color es la impresin producida al incidir en la retina los rayos
luminosos difundidos o reflejados por los cuerpos. El ojo humano es capaz de
captar las variaciones de la longitud de onda del espectro electromagntico
visualizndolo como diferentes colores, desde el violeta hasta el rojo.

Colores y sombras
7
Este fenmeno se debe al aspecto fsico de la radiacin, el ojo humano
que acta como sensor y el cerebro que es capaz de percibir, diferenciar e
interpretar las imgenes que
conforman este espectro.

La retina del ojo, a
travs de una estructura
formada por unos elementos
denominados bastones
(concentrados en los lados de
la retina) y conos
(concentrados en el centro),
tiene la capacidad para
discernir los colores, la
forma, los detalles y la
posicin de los objetos.

Los conos estn especializados en la visin del color, as unos ven
solamente el azul y el violeta, otros el verde y el amarillo y otros el rojo y el
naranja. Adems, es capaz de adaptarse a las diferentes cantidades de luz y al
brillo de las escenas y discernir e identificar los diferentes colores.

Los bastones al contrario que los conos requieren muy poca luz, lo que
los hace muy adecuados para la visin nocturna, sin embargo, no son capaces
de discernir los colores.

Los fotones penetran en nuestro ojo enfocndose en la retina, sta acta
como una pelcula fotogrfica. Las clulas de la retina son excitadas por los
fotones, lo cual provoca un estmulo que es transmitido por las neuronas al
cerebro.

El cerebro interpreta esta informacin como luz y color. El nivel de
excitacin es proporcional al nmero de fotones que llegan a la retina.

7.3.1. Caractersticas psicolgicas del color

Necesitamos otras propiedades, adems de la frecuencia, para
caracterizar nuestra percepcin de la luz.

La cromaticidad hace referencia al conjunto de variables del color que
se utilizan normalmente para describir las diferentes propiedades de una fuente
de luz.

- El matiz es el croma de un color y depende de la longitud de onda
dominante. Es la cualidad que permite clasificar a los colores como
amarillo, rojo, violeta, etc. El matiz se mide de acuerdo con la proximidad
que tiene un color con relacin a otro que se halle prximo en el crculo
cromtico; por ejemplo: verde amarillento, naranja rojizo, azul violceo,
etctera

Figura 3 - Seccin de un ojo humano
Colores y sombras
8

Figura 4 Matiz

- Valor o luminosidad indica las luminancias de un color; es decir, el
grado de claridad u oscuridad que posee como cualidad intrnseca.
Dentro del crculo cromtico, el amarillo es el color de mayor luminancia
y el violeta el de menor. Independientemente de los valores propios de
los colores, stos se pueden alterar mediante la adicin de blanco que
lleva el color a claves o valores de luminancia ms altos, o de negro que
los disminuye.

- El tono es la resultante de la mezcla de los colores con blanco o
negro y tiene referencia de valor y de matiz. Por ejemplo, el amarillo
mezclado con negro modifica su matiz hacia el verde y se oscurece.


Figura 5 - Tono

- La saturacin se refiere al grado de pureza de un color y se mide
con relacin al gris. Los colores muy saturados poseen mayor grado de
pureza y se presentan con ms intensidad luminosa en relacin con su
valor. Los colores con menor saturacin se muestran ms agrisados,
con mayor cantidad de impurezas y con menor intensidad luminosa.


Figura 6 - Saturacin

Se utilizan modelos de color con combinaciones de luz en trminos de
frecuencia dominante haciendo uso de 3 colores para obtener una gama amplia
de colores. Esto se suele denominar gama de color del modelo. Los tres
colores utilizados en el modelo se denominan colores primarios.

Ningn conjunto de colores primarios describe todas las frecuencias del
espectro visible. Agregando colores primarios aumentamos el nmero de
posibles colores pero haran falta un nmero infinito de colores para poder
representar todos los posibles colores. Para muchos fines con los tres colores
Colores y sombras
9
primarios es suficiente, sino se puede representar un color concreto se pueden
utilizar mtodos extendidos.

Cuando se proyectan juntas luces rojas, verdes y azules, obtenemos el
blanco.

Los colores secundarios se obtienen de la mezcla de los colores
primarios.

Figura 8 - Colores Secundarios

7.4. Dispositivos de visualizacin

7.4.1. TRC

Un monitor para mostrar una imagen utiliza un tubo de rayos catdicos
(TRC) cuyo frente se "ilumina" con un can de electrones localizado en la
parte posterior del tubo, el cual dispara un haz de electrones muy concentrado
que al impactar con el material sensible del frente del tubo lo excita iluminando
los puntos que componen la imagen.

La forma en
que el haz "barre" la
pantalla para
desplegar una
imagen se denomina
deflexin. sta se
realiza excitando
convenientemente un
juego de bobinas
(def. Horizontal y def.
Vertical) que estn
colocadas de forma
muy precisa en el
cuello del TRC. El
campo magntico que
generan al ser
excitadas desva el haz para conseguir que apunten al frente del tubo a la
posicin deseada.

Un monitor no forma la imagen, sta se procesa y forma en la placa de
video del ordenador. Despus se almacena en la memoria de video y se enva
esta informacin (seales de video y sincronizacin) al monitor. ste la toma y
la ordena para poder mostrarla, para ello se utilizan dos seales de
Figura 7 - Colores Primarios
Figura 9 - Tubo de rayos catdicos
Colores y sombras
10
sincronizacin de eventos consiguiendo que la imagen se muestre de forma
coherente y ordenada. La seales de sincronismo horizontal y vertical se
generan en la placa de video y sus caractersticas dependen del modo de video
elegido (resolucin).

7.4.1.1. Anlisis de los tiempos involucrados

Tiempo activo horizontal

Para desplegar una imagen, el haz apunta a la esquina superior-
izquierda de la pantalla y se mueve horizontalmente hasta el derecho de la
misma. El tiempo que emplea el haz para desplazarse del lado izquierdo al
derecho se denomina "tiempo activo horizontal".

Retardo Horizontal o tiempo de borrado

Es el tiempo utilizado en el regreso del haz a la izquierda de la pantalla
cuando ste ha alcanzado el lado derecho de la misma.

Tiempo Total horizontal

El haz cumple un ciclo horizontal completo cuando, empezando en el
borde izquierdo de la pantalla va hacia el lado derecho, y regresa atrs de
nuevo. Este tiempo total horizontal se obtiene sumando los tiempos de
Retardo Horizontal y Activo Horizontal

Velocidad de Refresco Horizontal

Dependiendo de la velocidad con la que el monitor puede trabajar,
pueden ocurrir cada segundo unos 20.000 a 80.000 ciclos horizontales . El
nmero de ciclos horizontales por segundo es denominado Refresco Horizontal
y normalmente est en KHz.

Tiempo Total Horizontal

Cuando trabajamos con la velocidad horizontal de un monitor
generalmente utilizamos el Refresco Horizontal. Sin embargo, al tratar con los
ciclos horizontales de un monitor especfico, normalmente utilizaremos el
tiempo real de cada ciclo horizontal. El ciclo horizontal de un monitor es la
suma de los tiempos real horizontal y tiempo de borrado o retrazo.

7.4.1.2. Exploracin de lnea

Para desplegar una imagen completa no slo hay que desplegar el haz
de izquierda a derecha de la pantalla, es decir, horizontalmente, sino tambin
de arriba abajo, es decir, verticalmente. Cada recorrido horizontal del haz se
llama exploracin de lnea "scanline.



Colores y sombras
11
Tiempo activo vertical

Es el tiempo total que necesita el monitor para desplegar todas las lneas
horizontales. Dependiendo de la resolucin vertical de un monitor, una imagen
en la pantalla puede componerse de 320 a 1600 lneas horizontales.

Retrazo o borrado vertical o tiempo de retardo

Es el tiempo que necesita el haz para una vez que ha alcanzado la
esquina inferior derecha de la pantalla retornar rpidamente a la parte superior
izquierda de la misma.

Tiempo Total Vertical

Es el tiempo que utiliza el haz para "barrer" desde la parte superior hasta
la inferior de la pantalla y volver a la esquina superior-izquierda.
Tiempo Total Vertical = Tiempo activo Vertical + Tiempo de Retrazo
Vertical

Velocidad de Refresco Vertical o refresco vertical de un monitor

Es el nmero de ciclos verticales completados por segundo medido en
Hz.
Raster: Es el ciclo completo de formacin de un cuadro de imagen

7.4.1.3. Sincronizaciones horizontales y verticales

Seal de sincronizacin vertical

Utilizando esta seal el monitor controla el regreso del haz desde la
esquina inferior-derecha a la esquina superior-izquierda

Seal de sincronizacin Horizontal

Con esta seal el monitor controla el regreso del haz desde el lado
derecho al izquierdo

Pulso de Sincronizacin horizontal y posicin de la imagen

Durante el tiempo de retardo horizontal el monitor recibe el pulso de
sincronizacin horizontal. El tiempo entre el extremo del tiempo activo
horizontal y la salida del pulso de la sincronizacin horizontal se denomina el
Porche Delantero Horizontal.

El tiempo durante el cual el pulso de sincronizacin horizontal
permanece activo, se denomina Ancho de Sincronizacin Horizontal.
Despus de recibir el pulso de la sincronizacin horizontal, el monitor
devuelve el haz al lado izquierdo de la pantalla. El periodo de tiempo entre el
extremo del pulso de la Sincronizacin Horizontal y el comienzo del prximo
tiempo activo horizontal es denominado Porche Trasero Horizontal.
Colores y sombras
12

Modificando la posicin del pulso de la sincronizacin horizontal respecto
al tiempo de retrazo horizontal se ajusta la posicin de la imagen en la pantalla
a la derecha o izquierda.

Figura 10 - Pulso de sincronizacin horizontal
Pulso de Sincronizacin vertical y posicin de imagen

Durante el tiempo de retrazo vertical el monitor recibe el pulso de la
sincronizacin vertical. El tiempo entre el extremo del tiempo activo vertical y la
salida del pulso de la sincronizacin vertical se llama el Porche Delantero
Vertical.

El tiempo durante el cual el pulso de la sincronizacin vertical
permanece activo se denomina la Anchura de la Sincronizacin Vertical.
Despus de recibir el pulso de la sincronizacin vertical, el monitor devuelve el
haz al tope de la pantalla.

El periodo de tiempo entre el extremo del pulso de la Sincronizacin
Vertical y la salida del prximo tiempo activo vertical es el Porche Trasero
Vertical.

Modificando la posicin del pulso de la sincronizacin vertical respecto al
tiempo de retardo vertical se ajusta la situacin de la imagen en la pantalla
arriba o abajo.

7.4.2. LCD

LCD (Liquid Crystal Display) son las siglas en ingls de Pantalla de
Cristal Lquido, dispositivo inventado por Jack Janning, quien fue empleado de
NCR.
Se trata de un sistema elctrico de presentacin de datos formado por 2
capas conductoras transparentes y en medio un material especial cristalino
(cristal lquido) que tienen la capacidad de orientar la luz a su paso.

Colores y sombras
13
Cuando la
corriente circula
entre los
electrodos
transparentes con
la forma a
representar (por
ejemplo, un
segmento de un
nmero) el
material cristalino
se reorienta
alterando su
transparencia.

El material base de un LCD lo constituye el cristal lquido, el cual exhibe
un comportamiento similar al de los lquidos y unas propiedades fsicas
anisotrpicas similares a las de los slidos cristalinos. Las molculas de cristal
lquido poseen una forma alargada y son ms o menos paralelas entre s en la
fase cristalina. Segn la disposicin molecular y su ordenamiento, se clasifican
en tres tipos: nemticos, esmticos y colestricos. La mayora de cristales
responden con facilidad a los campos elctricos, exhibiendo distintas
propiedades pticas en presencia o ausencia del campo. El tipo ms comn de
visualizador LCD es, con mucho, el denominado nemtico de torsin, trmino
que indica que sus molculas en su estado desactivado presentan una
disposicin en espiral. La polarizacin o no de la luz que circula por el interior
de la estructura, mediante la aplicacin o no de un campo elctrico exterior,
permite la activacin de una serie de segmentos transparentes, los cuales
rodean al cristal lquido. Segn sus caractersticas pticas, pueden tambin
clasificarse como: reflectivos, transmisivos y transreflectivos.

Las pantallas LCD se encuentran en multitud de dispositivos industriales
y de consumo: mquinas expendedoras, electrodomsticos, equipos de
telecomunicaciones, computadoras, etc. Todos estos dispositivos utilizan
pantallas fabricadas por terceros de una manera ms o menos estandarizada.
Cada LCD se compone de una pequea placa integrada que consta de:

La propia pantalla LCD.
Un microchip controlador.
Una pequea memoria que contiene una tabla de caracteres.
Un interfaz de contactos elctricos, para conexin externa.
Opcionalmente, una luz trasera para iluminar la pantalla.

El controlador simplifica el uso del LCD proporcionando una serie de
funciones bsicas que se invocan mediante el interfaz elctrico, destacando:

La escritura de caracteres en la pantalla.
El posicionado de un cursor parpadeante, si se desea.
El desplazamiento horizontal de los caracteres de la pantalla
(scrolling).
Figura 11 - LCD
Colores y sombras
14
La memoria implementa un mapa de bits para cada carcter de un juego
de caracteres, es decir, cada octeto de esta memoria describe los puntitos o
pxel que deben iluminarse para representar un carcter en la pantalla.
Generalmente, se pueden definir caracteres a medida modificando el contenido
de esta memoria. As, es posible mostrar smbolos que no estn originalmente
contemplados en el juego de caracteres.

El interfaz de contactos elctricos suele ser de tipo paralelo, donde
varias seales elctricas simultneas indican la funcin que debe ejecutar el
controlador junto con sus parmetros. Por tanto, se requiere cierta
sincronizacin entre estas seales elctricas.

La luz trasera facilita la lectura de la pantalla LCD en cualquier condicin
de iluminacin ambiental.

Existen dos tipos de pantallas LCD en el mercado: pantallas de texto y
pantallas grficas.

7.4.2.1. Funcionamiento

El funcionamiento de estas pantallas se fundamenta en sustancias que
comparten las propiedades de slidos y lquidos a la vez. Cuando un rayo de
luz atraviesa una partcula de estas sustancias tiene necesariamente que
seguir el espacio vaco que hay entre sus molculas como lo hara atravesar un
cristal slido pero a cada una de estas partculas se le puede aplicar una
corriente elctrica que cambie su polarizacin dejando pasar a la luz o no.

Una pantalla LCD esta formada por 2 filtros polarizados colocados
perpendicularmente de manera que al aplicar una corriente elctrica al segundo
de ellos dejaremos pasar o no la luz que ha atravesado el primero de ellos.
Para conseguir el color es necesario aplicar tres filtros ms para cada uno de
los colores bsicos rojo, verde y azul y para la reproduccin de varias
tonalidades de color se deben aplicar diferentes niveles de brillo intermedios
entre luz y no luz lo, cual consigue con variaciones en el voltaje que se aplicaba
los filtros.

7.4.2.2 LCD de texto

Los LCD de texto son los ms baratos y simples de utilizar. Solamente
permiten visualizar mensajes cortos de texto. Existen algunos modelos
estandarizados en la industria, en funcin de su tamao medido en nmero de
lneas y columnas de texto. Existen modelos de una, dos y cuatro filas
nicamente. El nmero de columnas tpico es de ocho, diecisis, veinte y
cuarenta caracteres.

7.4.2.3. TFT

TFT o Thin Film Transistor (Transistor de Pelcula Fina) es un tipo
especial de transistor de efecto campo construido depositando finas pelculas
sobre contactos metlicos, capa activa semiconductora y capa dielctrica.
Colores y sombras
15

La aplicacin ms conocida de los TFT son las pantallas de visualizacin
planas de LCD, en las cuales cada pxel se controla mediante uno a cuatro
transistores. La tecnologa de TFT proporciona la mejor resolucin de todas las
tcnicas flat-panel, pero es tambin la ms costosa. Las pantallas de TFT a
veces se llaman LCDs de matriz activa.

Opera de forma individual con cada pxel, es decir, es direccionamiento
directo o de matriz activa. esto se consigue mediante una delgada capa de
transistores que controlan de forma individual cada pxel obteniendo mejores
tiempos de respuesta al no ser necesario el barrido completo de la pantalla ya
que el tiempo de de excitacin de un pxel es menor que el tiempo de barrido
de la pantalla consiguiendo imgenes ms ntidas y sin parpadeos.

7.4.3. Pantalla de plasma

Una pantalla de plasma es una pantalla plana en la cual la luz se crea
por la excitacin de sustancias
fosforecentes mediante una
descarga de plasma entre dos
pantallas planas de vidrio. La
descarga de gas no contiene
mercurio (como en la luz de fondo
de las pantallas de LCD); una
mezcla de gases nobles (nen y
xenn) es utilizada en su lugar. Esta
mezcla de gas es inerte y totalmente
inofensiva.

La pantalla de plasma fue
inventada en la Universidad de Illinois
en Urbana-Champaign por Donald L.
Bitzer y H. Gene Slottow en 1964 para
el sistema informtico PLATO. Los paneles originales eran monocromticos.

Desde 1975, Larry Weber, de la Universidad de Illinois en Urbana-
Champaign, intent crear una pantalla de plasma de color, consiguindolo
finalmente en 1995.

El mayor brillo y ngulo de visin de las pantallas de plasma actuales ha
provocado que estas pantallas sean cada vez ms populares.

El plasma consiste en una sustancia elctrica neutra con una lata de
ionizacin compuesta por iones, electrones y partculas neutras. Bsicamente
el plasma es un mar de electrones e iones que conduce de manera excelente
la electricidad. Si se aplica suficiente calor los electrones se separan de sus
ncleos.

Figura 12 Funcionamiento de una
pantalla de plasma
Colores y sombras
16
Una pantalla de plasma se compone de una matriz de celdas conocidas
como pxeles, que se componen a su vez de tres sub-pxeles, que
corresponden a los colores rojo, verde y azul.

El gas en estado de plasma reacciona con el fsforo de cada sub-pxel
para producir luz coloreada (roja, verde o azul). Estos fsforos son los mismos
que se utilizan en los tubos de rayos catdicos de los televisores y monitores
convencionales. Cada sub-pxel est controlado individualmente por un
procesador y se pueden producir ms de 16 millones de colores diferentes.
Imgenes perfectas en un display de profundidad mnima.

7.5. El monitor vs. El ojo

El ojo no es como una cmara de televisin, la cmara produce una
imagen como la superposicin de una serie de puntos brillantes y oscuros
obtenidos cuando los electrones acelerados por el can del televisor a lo largo
del tubo que se halla en el interior impactan contra una pantalla de material
fluorescente: este material absorbe la energa del choque, se excita y
posteriormente se des-excita emitiendo luz... el puntito brillante que vemos!

Para una televisin en color, esos puntos brillantes corresponden cada
uno a un color primario, emitido en funcin de la energa que ha cedido el
electrn acelerado en el choque. Adems existe una conexin uno-a-uno entre
cada punto del objeto y su imagen final, la cual se mantiene a travs del
proceso por el que la cmara lo produce. Por lo tanto se puede interrumpir el
proceso en cualquiera de sus fases y se puede establecer que esa seal
electrnica proviene de ese punto en particular del objeto.

En el cerebro, las cosas son muy distintas! Una parte de la corteza
visual que es la que procesa la seal, puede conectarse a muchas partes
diferentes de la retina de modo que el proceso de ver se hace muy complejo.
Se cree que ciertas partes de la corteza son muy buenas en el reconocimiento
de lneas horizontales y otras lo son en el reconocimiento de las verticales,
otras reconocen mejor el contorno de los objetos, etc... Esta compleja
arquitectura es la que hace que el cerebro sea mucho mejor en procesar la
informacin visual que incluso el ms moderno de los ordenadores, el cual,
como una cmara de televisin, trabaja la informacin sobre la base de uno-a-
uno (1:1).

7.6. Profundidad del color

La calidad de la imagen se puede mejorar incrementando la resolucin
de la pantalla, el nmero de pxeles del dibujo o tambin incrementando el
nmero de colores disponibles.

7.6.1. Color de 1-bit

No existe un nombre que se utilice habitualmente para denominar este
simple modo de color. La denominacin de blanco y negro ha sido utilizada
Colores y sombras
17
incorrectamente para referirnos a la escala de grises cuando en realidad slo
se pueden representar 2 colores.

Este modo de video permite 2 colores ya que se utiliza 1 bit dedicado a
la informacin de color por cada pxel (2
1
).

Cuando hablamos de color de 1 bit nos
referimos a blanco o negro; algunas veces los 2 colores
no son blanco y negro, hubo terminales que utilizaron 2
tipos de verdes: claro y oscuro. El siguiente dibujo es
un ejemplo de una imagen de 1 bit de profundidad, slo
utiliza el blanco y el negro.

El color de 1-bit se utiliz en dispositivos
de texto, hubo excepciones, los Macintosh (que
no tenan este modo de texto) y los originales IBM
MGA (Monochome Graphics Adapter, que tena
un modo grafico adicional al modo de texto).

7.6.2. Color de 4-bits

Fue utilizado por los dispositivos IBM EGA (Enhanced Graphics
Adapter), tambin por el Commodore 64 y 128 y otros muchos.

BLACK DARK GREY BLUE LIGHT BLUE
GREEN LIGHT GREEN CYAN LIGHT CYAN
RED LIGHT RED PURPLE LIGHT PURPLE
YELLOW LIGHT YELLOW LIGHT GREY
WHITE

Este modo de video permite 16 colores ya que se utilizan 4 bits
dedicados a la informacin de color por cada pxel (2
4
)

El Commodore Amiga e IBM VGA (Vdeo Graphics Adapter) permitan
indexacin. Slo se poda disponer de 16 colores de manera simultnea, pero
los 16 colores se pueden elegir de una amplia paleta y cada paleta puede
redefinir sus colores. As un programa puede utilizar una escala de 16 grises,
los 16 colores originales de EGA, o elegir cualquier combinacin de colores de
la amplia paleta de colores disponible. La nica restriccin es la utilizacin de
16 colores de forma simultnea.
Figura 13 - Imagen con
1 bit de profundidad
Colores y sombras
18
7.6.3. Color de 8-bits

Este modo de video permite 256 colores
en pantalla ya que se utilizan 8 bits dedicados a
la informacin de color por cada pxel (2
8
). Con
estos bits se hace referencia al ndice de la
paleta de color. La paleta nos permite
seleccionar entre 16 millones de colores. Cada
color de la paleta se selecciona especificando 8
bits para cada intensidad de rojo, verde y azul
(la intensidad de cada componente puede tener
una valor entre 0 y 255)

Este modo de color combinado con la fusin
permite obtener resultados aceptables para
ciertas aplicaciones. Tambin se pueden utilizar
los 8 bits para imgenes de un tono continuo en
blanco y negro con 256 matices de color, vemos
un ejemplo de imagen de tono continuo.


7.6.4. Color de 24-bits

Este modo de video permite 16.777.216 colores en pantalla ya que se
utilizan 24 bits dedicados a la informacin de color por cada pxel (2
24
). Este
modo de color mantiene 8 bits de color para componente de color rojo, verde y
azul. Disponemos de los ms de 16 millones de colores en cada pxel de la
pantalla.


Figura 15 - Imagen con 24 bits de profundidad

El inconveniente de la utilizacin de este modo es la utilizacin de
memoria que se necesita para pantallas de alta resolucin (2MB para
1024x768). Tambin es ms lento mover grandes cantidades de memoria para
realizar una animacin o simplemente dibujar en pantalla. Aunque las tarjetas
aceleradoras estn optimizadas para este tipo de operaciones.
Figura 14 - Imagen byn
con 256 matices de color
Colores y sombras
19
7.7. Modelos de color

El propsito de un modelo de color es facilitar la especificacin de
colores en algn formato estndar. Un modelo de color es una especificacin
de un modelo de coordenadas 3-D y un subespacio dentro de ese sistema
donde cada color se representa por un punto nico.

La mayora de los modelos de color que se utilizan estn orientados
hacia el hardware como monitores o impresoras o aplicaciones de
manipulacin de color. El modelo orientado al hardware ms comn es el RGB
(red-green-blue), el modelo CMY (cyan-magenta-yellow) para impresoras en
color y el YIQ que es el estndar para la difusin de TV ( Y = luminancia, I y Q
son dos componentes cromticas). Para la manipulacin del color se suelen
utilizar los modelos HSI (matiz, saturacin e intensidad) y HSV (matiz,
saturacin y valor).

Los modelos ms utilizados en el procesamiento de imgenes son RGB,
YIQ y HSI.

7.7.1. Modelo de color XYZ

En los aos 30, la Commission Internationale de l'Eclairage (CIE) defini
un espacio de color estndar, una manera de definir colores en trminos
matemticos, para facilitar la comunicacin de la informacin de color. Este
espacio de color est basado en la investigacin sobre la naturaleza de la
percepcin del color.

7.7.1.1. Espacio de color CIE

En el intento de lograr una representacin que utilice solamente
coeficientes de mezcla positivos, el CIE ("d'Eclairage de Internationale de la
Comisin") defini tres nuevas fuentes de luz hipotticas, x, y, y z, resultando
curvas positivas:

Figura 16 - representacin de las fuentes de luz x, y, z
Dado un espectro y un deseamos encontrar los valores correspondientes
de X, de Y, y de Z, lo podemos lograr integrando el producto de la energa
Colores y sombras
20
espectral con cada una de las tres curvas sobre todas las longitudes de onda.
Los pesos de X, Y y Z se toman del espacio tridimensional del CIE XYZ, segn
lo mostrado arriba.
Esto es logrado proyectando el espacio de color 3D sobre el plano
X+Y+Z=1, resultando un diagrama de la cromaticidad del CIE.

Se define la proyeccin como:

Resultando el diagrama de cromaticidad CIE

7.7.1.1.1. Diagrama de cromaticidad CIE

El diagrama de cromaticidad CIE es un
modelo de dos dimensiones de visin del color.
El arco alrededor de la parte superior de la
herradura incluye los colores espectrales puros
desde el violeta azulado hasta el rojo.

Mezclando dos colores espectrales puros
en diferentes proporciones es posible crear
todos los colores que se encuentran en la lnea
recta dibujada entre ellos en el diagrama. Es
posible crear el mismo tono de gris mezclando el
verde azulado y el rojo o mezclando el verde
amarillento y el violeta azulado. Esto es
posible debido a un fenmeno peculiar
de la visin del color llamado
metamerismo. Los colores prpura, que
no existen en el espectro de la luz pura, se encuentran en la parte inferior del
diagrama. Los prpuras son mezclas de rojo y azul, los extremos opuestos del
espectro.

El diagrama de cromaticidad CIE refleja el tono y la saturacin, pero es
necesario un modelo tridimensional para aadir el componente del brillo.
Muchas aplicaciones informticas incluyen cuadros de dilogo en los que es
posible seleccionar colores manipulando el tono, la saturacin y el brillo. Por
ejemplo, Adobe Photoshop utiliza un cuadro Selector de Color que puede
configurarse segn las preferencias personales.

7.7.1.1.2. Gama de colores

El diagrama de cromaticidad se puede utilizar para comparar las
"gamas" de varios dispositivos de salida posibles (es decir, los monitores e
impresoras). Note que una impresora de color no puede reproducir todos los
colores visibles en un monitor de color.
Figura 17 - Diagrama de cromaticidad
CIE
Colores y sombras
21

Figura 18 - Comparacin de gamas de colores

7.7.2. El modelo de color RGB

El modelo aditivo de color utilizado para los grficos de computadora es
representado por el cubo del color del RGB, donde R, G, y B representan los
colores producidos por los fsforos rojos, verdes y azules, cubo del color de
respectivamente. El cubo se proyecta dentro del espacio de color del CIE XYZ
Nuestros ojos perciben el color a travs de la simulacin de tres
pigmentos visuales en los conos de la retina. Estos pigmentos tienen una
sensibilidad pico en las longitudes de onda 630 nm (rojo), 530 nm (verde), y
430 nm (azul). Comparando las intensidades en una fuente de luz, se percibe
el color de la luz. Esta teora es la base para desplegar la salida de color en un
monitor de video mediante el uso de los tres colores primarios, conocido como
modelo de color RGB.

Cada color aparece en sus componentes primarias espectrales rojo,
verde y azul. El modelo est basado en un sistema de coordenadas cartesiano.
El subespacio de inters es el cubo que se muestra en la figura 19.

Todos los colores han sido normalizados de
forma que el cubo es unitario, es decir, se supone
que todos los valores de rojo, verde y azul estn
en el rango [0, 1].

Este esquema de color es un modelo
aditivo: las intensidades de los colores primarios
se suman para producir otros colores. Cada punto
de color contenido en los lmites del cubo puede
representarse como la trada (R,G,B), donde los
valores de R,G,B se asignan en el intervalo de 0 a
1. Por ejemplo, el vrtice magenta se obtiene
sumando el rojo y el azul para producir la trada
(1,0,1) y el blanco en (1,1,1) es la suma de los
vrtices rojo, verde y azul. Las sombras de gris se representan a lo largo de la
diagonal principal del cubo del origen (negro) al vrtice blanco. Cada punto
situado en esta diagonal tiene una contribucin igual de cada color primario, de
manera que una sombra de gris en medio del negro y el blanco se representan
como (0.5, 0.5, 0.5).
Figura 19 - Cubo RGB
Colores y sombras
22
Las imgenes en el modelo de color RGB estn formadas por tres
planos de imgenes independientes, cada una de los colores primarios.
Cuando se introducen en un monitor RGB, las tres imgenes se combinan en la
pantalla de fsforo para producir una imagen de color compuesta. Por tanto, se
utiliza el modelo RGB para el procesamiento de imgenes si las imgenes se
expresan en trminos de los tres planos de colores. La mayora de las cmaras
en color que se usan para adquirir imgenes digitales utilizan el formato RGB.

Uno de los mejores ejemplos de la utilidad del modelo RGB es el
procesamiento de imgenes areas y de satlites multiespectrales. Estas
imgenes se obtienen para diferentes rangos espectrales. Por ejemplo, las
imgenes LANDSAT se obtienen como mnimo en cuatro ventanas espectrales
distintas de la misma escena. Dos ventanas estarn alojadas en el espectro
visible y se corresponden aproximadamente con verde y rojo; las otras dos se
encontrarn en el infrarrojo. As pues cada plano de la imagen tiene sentido
fsico y la combinacin de color utilizando el modelo RGB para procesamiento y
visualizacin tiene sentido cuando se ve en una pantalla en color.

A continuacin se muestra una imagen en color de verduras y frutas
junto con sus tres bandas de color rojo, verde y azul. El mayor nivel de gris en
cada banda corresponde con el color predominante en cada objeto (fruta o
verdura).

Figura 20 - (a) Imagen original en color. (b) Plano de rojo. (c) Plano verde. (d)
Plano azul
Sin embargo este modelo de color no siempre es el mejor para el
procesamiento de imgenes, por ejemplo para realizar una imagen en color con
sombra de una cara humana. Este problema puede resolverse mediante la
igualacin del histograma. Al tener tres bandas y puesto que el histograma
trabaja slo con las intensidades, cuando igualemos el histograma en cada
Colores y sombras
23
banda, en cada una de ellas tendremos mejora, sin embargo, el resultado
global, (cuando se combinen las tres bandas), ser impredecible.

A pesar de todo este modelo es la eleccin ms corriente para grficos
por ordenador ya que los CRT usan fsforo rojo, verde y azul para crear el
color deseado. Sin embargo, este modelo no describe de forma eficiente las
tres componentes de color (R,G,B). El igual ancho de banda da lugar a la
misma profundidad del pxel y resolucin del dispositivo para cada
componente. Sin embargo, la sensibilidad de la componente de color del ojo
humano es menor que la de la luminancia.

Por estas razones, muchos mtodos de codificacin de imgenes y
sistemas de transmisin utilizan la luminancia y dos diferencias de colores.
Estos son los formatos YUV, YIQ, Y C
b
C
r
.

7.7.3. El modelo de color CMY (Cyan, Magenta, Amarillo)

Un modelo de color definido con los colores primarios cyan, magenta y
amarillo (CMY) es til para describir la salida de color de los dispositivos de
copia hardware. A diferencia de los monitores de video, que producen un
modelo de color combinando luz de los fsforos de la pantalla, los dispositivos
hardware como las impresoras producen una imagen de color cubriendo un
papel con pigmentos de color. Se obtienen los colores por luz reflejada, lo cual
es un proceso sustractivo.

Por ejemplo, el cyan (azul-verde) puede formase combinando luz verde
con luz azul, por tanto cuando se refleja luz blanca sobre un objeto que es
verde-azul la luz reflejada no debe tener componente roja, es decir, la luz roja
es absorbida, o sustrada por el objeto. De forma anloga para obtener el
magenta se resta la componente verde de la luz incidente y el amarillo sustrae
la componente azul.

En el modelo CMY, el
punto (1,1,1) representa el
negro, ya que todas las
componentes de la luz incidente
se sustraen. El origen representa
la luz blanca. Cantidades iguales
de cada uno de los colores
primarios producen grises a lo
largo de la diagonal principal del
cubo.

Como ya sabemos el cyan, magenta y amarillo son los colores
secundarios. Para convertir los colores primarios en secundarios hemos de
realizar la siguiente transformacin:
Cyan (Verde-Azul)
Azul
Magenta
Rojo
Amarillo Verde
Blanco
Negro
Figura 21 - Cubo de Color
Colores y sombras
24

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/

También podría gustarte