Está en la página 1de 61

Introduccin a

los grficos 3D
OpenGL
Transparencias adaptadas y traducidas de
E. Angel and D. Shreiner: Interactive Computer Graphics 6E Addison-Wesley 2012
Objetivos
Veamos cmo colorear nuestros modelos
para que se perciban en tres dimensiones
Veamos qu tipos de interaccin existen
entre la luz y nuestros materiales
Construiremos un sistema de reflexin
bsico: El modelo de Phong.
Veremos cmo utilizar OpenGl
2
Entendemos por modelo de iluminacin el clculo
de la intensidad de cada punto de la escena.
En el clculo de la intensidad de un punto
intervienen:
El tipo e intensidad de la fuente de luz tipo e
intensidad de la fuente de luz
El material del objeto
La orientacin del objeto con respecto a la luz
El modelo ms utilizado es el modelo de Phong
Introduccin
Necesitamos sombreado (shading)
Si dibujamos un objeto utilizando nicamente
el color glColor. Veramos algo parecido a:
Pero a nosotros nos gustara algo parecido a:
4
Shading
Qu hace que un objeto real se vea de esta forma?
La combinacin de la luz con un material provoca que cada
punto tenga un color diferente. Hablamos que tiene un
determinado sombreado o en ingls shade.
Tenemos que tener en cuenta:
Fuentes de luz
Las propiedades de los materiales
Situacin de la cmara
Orientacin de la superficie
Etc.
5
Dispersin (Scattering)
Cuando la luz llega a un punto A:
Parte de ella se dispersa
Y otra parte se absorbe
Parte de la luz dispersada, llega al punto B
Una parte se dispersa
Y otra se absorbe
Y volvemos a repetir
6
El cielo tiene color?
7
Dispersin de Rayleigh
8
Ecuaciones de renderizado
Este proceso infinito de dispersin y absorcin se
puede describir mediante ecuaciones que forman
parte de las ecuaciones de renderizado
Son ecuaciones muy complejas y sin una solucin
general
La tcnica de Ray tracing es un caso especial para
superficies de gran reflexin
Las ecuaciones de renderizado son globales e
incluyen:
Sombras
Dispersiones mltiples de un objeto a otro.
9
Efectos globales
10
Superficies translucidas
Sombras
Reflexiones mltiples
Tratamiento global
11
Renderizado local o global?
Un sombreado correcto requiere un clculo
global que tenga en cuenta todos los objetos y
todas las fuentes de luz.
Es incompatible con nuestro sistema de pipeline
que dibuja cada polgono de forma independiente
Por fortuna, nos solemos conformar cuando la
imagen simplemente parece real
Existen muchas tcnicas para simular ese efecto
12
Interaccin luz-material
La luz cuando choca contra un objeto se absorbe
parcialmente, pero otra parte se dispersa (se
refleja)
La cantidad reflejada determina el color y brillo
del objeto.
Una superficie se percibe de color rojo bajo un foco
blanco debido a que refleja la componente roja de la
luz (frecuencias electromagnticas en ese espectro)
El resto de las frecuencias se absorben
La luz se dispersa segn las caractersticas de la
superficie. Depende del pulido, suavidad,
orientacin, etc.
13
Fuentes de luz
En general es complejo tratar con fuentes de
luz reales. Tendramos que tener en cuenta
todos los puntos:
14
Simplificamos las fuentes de luz
La fuente es un punto
Se modela mediante una posicin y un color
Si la fuente est muy distante asumimos que los rayos
son paralelos
Spotlight
La luz procede de un punto nico ideal
La luz ambiente
En toda nuestra escena recibe la misma cantidad de
luz, con independencia de la situacin de punto
Puede aglutinar la combinacin de mltiples fuentes y
tipos de material
15
Tipos de superficie
Las superficies pulidas reflejan mayor cantidad de luz,
creando el efecto de brillo o incluso espejo
Una superficie rugosa refleja la luz en todas las
direcciones.
16
Superficie pulida
Superficie rugosa
Sombreados
17
Dnde est la diferencia entre estas imgenes?
Jugamos a buscar diferencias?
18
Pensemos
De las transparencias anteriores podemos
deducir que:
La forma del objeto influye en el dibujo,
Aunque est formado por tringulos, necesitamos
colorear la forma,
Necesitamos tener en cuenta algo que mida esa
forma
Una idea es tener en cuenta el vector normal a la
superficie.
19
Modelo de Phong
Un modelo muy simple que se puede calcular rpidamente.
Ha sido uno de los primeros y sigue siendo muy utilizado.
Tiene tres componentes:
Luz difusa (Diffuse)
Luz especular (Specular)
Luz ambiente (Ambient)
Utiliza cuatro vectores
Hacia la fuente
Hacia el observador
El vector normal
Reflexin perfecta
20
Modelo de Phong
Tipos de luz
Luz difusa
Luz ambiente
Luz especular
Tipos de luz
Luz Direccional Luz Focal
Luz Puntual
Reflexin ideal
La normal se determina por la orientacin
local del polgono.
El ngulo de incidencia es el ngulo de
reflexin
Los tres vectores son coplanares
24
r = 2 (l n ) n - l
Superficie ideal
Refleja la luz de forma perfecta.
La luz se dispersa idealmente en todas las
direcciones.
La cantidad de luz reflejada es proporcional a
la componente vertical de la luz que incide.
La luz reflejada ~cos u
i
cos u
i
= l n si los vectores estn normalizados
Introducimos tres componentes, k
r
, k
g,
k
b
, que
indican la cantidad de color reflejada.
25
Superficies especulares
La mayora de las superficies no son perfectamente
difusas o perfectamente especulares.
Las superficies pulidas producen una mayor reflexin
en direcciones cercanas al ngulo ideal o de reflecin
perfecta.
26
Reflexin
especular
Modelo de la luz reflejada
Phong propuso un modelo en el que la luz
reflejada pierde intensidad segn el ngulo
formado entre el observador y la direccin de
reflexin ideal.
27
|
I
r
~ k
s
I cos
o
|
Grado de brillo
Coeficiente
de absorcin
Intensidad original
Intensidad
reflejada
El coeficiente de brillo
(Shininess Coefficient)
Valores de o entre 100 y 200 se corresponden con
metales
Valores de entre 5 y 10 generan aspectos similares al
plstico.
28
cos
o
|
|
90
-90
29
Luz ambiente
La luz ambiente es el resultado de aplicar
mltiples interacciones entre numerosas
fuentes de luz y los objetos del entorno.
La intensidad y el color dependen tanto del
color de la luz como del material del que est
hecho el objeto.
Aade k
a
I
a
a la frmula
Coef
Intensidad de la luz ambiental
30
Distancia
La luz pierde intensidad conforme viaja en el
espacio (inversamente al cuadrado de la
distancia)
Podramos aadir el factor 1/(ad + bd +cd
2
)
31
Fuentes de luz
En el modelo de Phong, sumamos la
influencia de cada una de las fuentes de luz
Cada fuente de luz tiene trminos
independientes para los tres trminos:
difusin, especular y ambiente.
Separamos los componentes RGB: red,
green y blue
Por eso, definimos 9 coeficientes para cada
foco de luz
I
dr
, I
dg
, I
db
, I
sr
, I
sg
, I
sb
, I
ar
, I
ag
, I
ab
32
Las propiedades del material
El material tiene propiedades que configuran
al modelo
Nueve parmetros de absorcin
k
dr
, k
dg
, k
db
, k
sr
, k
sg
, k
sb
, k
ar
, k
ag
, k
ab
Un coeficiente de brillo o
33
Sumando todo
Para cada fuente de luz y para cada componente de
corlor, el modelo Phong puede escribirse segn:
I =k
d
I
d
l n + k
s
I
s
(v r )
o
+ k
a
I
a
Para cada componente de
color, aadimos la
influencia de cada fuente
de luz
34
Modelo de Phong Modificado
El trmino especular de Phong resulta
complejo de calcular (requiere el computo de
un nuevo vector de refleccin y un vector de
visin por cada vrtice)
Blinn propone una aproximacin ms eficiente
35
The Halfway Vector
h es un vector normaliza a medio camino
entre l y v
h = ( l + v )/ | l + v |
36
Utilizando el halfway vector
reemplazando (v r )
o
por (n h )
|
| se elige para que represente el brillo
EL modelo resultante se conoce como
modificado de Phong o de Blinn
Se incluye en OpenGL
37
Ejemplo
38
Clculo de vectores
l y v son dados por la aplicacin
Podemos calcular r dados l y n
El problema es determinar n
En general depende del modelo a representar
OpenGL nos deja a nosotros determinar la normal
La normal en un vrtice
Las normales nos permiten aplicar tcnicas de
iluminacin suaves
No tienen que ser la normal de la cara
Se utilizan nicamente para la iluminacin
Es una forma (mejor) de aproximar la superficie
real.
Normales
Las normales:
Se introducen con el modelo
Se calculan usando principios bsicos
Se aproximan interpolando las normales
de los vrtices
41
La importancia de normalizar
El trmino Coseno supone que los vectores estn
normalizado
Utilizando vectores normalizados simplifica los clculos
Tenemos funciones que nos permiten normalizar
nuestros vectores
42
La normal de un tringulo
p
0
p
1
p
2
n
plano n (p - p
0
) = 0
n = (p
2
- p
0
) (p
1
- p
0
)
Normalizado n n/ |n|
p
43
Recordando el concepto de Normal
Ecuacin de un plano: ax+by+cz+d = 0
Un plano se determina por tres puntos p
0
, p
2
,
p
3
o por un punto n y su normal p
0
La normal se puede obtener
n = (p
2
-p
0
) (p
1
-p
0
)
44
La normal en una esfera
Dada una funcin f(x,y.z)=0
La normal viene dada por su gradiente
En la espera f(p)=pp-1
n = [f/x, f/y, f/z]
T
=p
45
Forma paramtrica
Para la esfera
El plano tangente viene dado por
Y la normal por el producto
x=x(u,v)=cos u sin v
y=y(u,v)=cos u cos v
z= z(u,v)=sin u
p/u = [x/u, y/u, z/u]T
p/v = [x/v, y/v, z/v]T
n = p/u p/v
46
Cmo funciona OpenGL
Ahora veremos el funcionamiento de OpenGL
Cmo elegir entre sombreado por vrtice o por
fragmento.
Modelos de sombreado
Plano (Flat)
Suave (Smooth)
Gouraud
Modelos de sombreado
Flat Shading
Se calcula una nica vez para todo el polgono.
Gouraud Shading
Se calcula para cada vrtice y despues
interpolamos
Phong Shading
Interpolamos la normal y para cada pixel se
calcula la iluminacin
Sombreado de Gouraud
Es el ms comn de los mtodos
Realiza la iluminacin de Phong en los vrtices
Realiza una interpolacin linear
A lo largo de los vrtices
A lo largo de las lneas
C
1
C
2
C
3
c
1
+ t
1
(c
2
-c
1
)
c
1
+ t
2
(c
3
-c
1
)
c
1
+ t
1
(c
2
-c
1
) + t
3
(c
1
+ t
2
(c
3
-c
1
)- c
1
+ t
1
(c
2
-c
1
))
Sombreado de Gouraud
Ventajas e inconvenientes:
Es rpido y sencillo en calcular
Es un modelo inexacto y puede generar efectos
extraos
Sombreado de Phong
Utiliza el modelo de iluminacin de Phong (no
confundir uno con otro) pero realiza una
interpolacin lineal entre las normales de los
vrtices.
Aplica el modelo de iluminacin de Phong en
cada pixel.
Utiliza los mismos parmetros que el modelo de Gouraud
En general genera resultados ms
Suaves pero es ms lento.
Sombreado de Phong
Interpola las normales (en lugar del color)
Calcula la iluminacin en cada pixel
N
1
N
2
N
3
N
4
( ) ( )

=
|
.
|

\
|
+ + =
lights
i
n
i s i d i ambient a total
shiny
R V k L N k I I k I
#
1

Recuerda que las normales
se utilizan para los
trminos de luz difusa y
especular.
52
Sombreado en OpenGL
Necesitamos especificar
Normales
Propiedades del material
Luces
53
Definiendo un foco de luz
Por cada punto de luz, podemos definir el RGBA de los
componentes difuso, especular y ambiente
Adems damos la posicin.
vec4 diffuse0 =vec4(1.0, 0.0, 0.0, 1.0);
vec4 ambient0 = vec4(1.0, 0.0, 0.0, 1.0);
vec4 specular0 = vec4(1.0, 0.0, 0.0, 1.0);
vec4 light0_pos =vec4(1.0, 2.0, 3,0, 1.0);
54
Spotlights
Funcionan parecido a los
puntos de luz pero damos:
Direccin
Umbral de corte (Cutoff)
Atenuacin Proporcional a cos
o
|
u
u
|
55
Luz ambiente
Depende del color de la luz
Una luz roja tie de color rojo todo lo que ilumina
Suele sernos til al principio para probar
56
Propiedades del material
Tienen que estar conforme con el modelo de
iluminacin
La componente w nos puede indicar el grado de
transparencia (opacidad)
vec4 ambient = vec4(0.2, 0.2, 0.2, 1.0);
vec4 diffuse = vec4(1.0, 0.8, 0.0, 1.0);
vec4 specular = vec4(1.0, 1.0, 1.0, 1.0);
GLfloat shine = 100.0
Fuentes de luz
GLfloat light_ambient[]={0.0, 0.0, 0.0, 1.0};
GLfloat light_diffuse[]={1.0, 1.0, 1.0, 1.0};
GLfloat light_specular[]={1.0, 1.0, 1.0, 1.0};
GLfloat light_position[]={1.0, 1.0, 1.0, 0.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHT0);
spotlight blanca atenuada
GLfloat light1_ambient[ ]={0.2, 0.2, 0.2, 1.0};
GLfloat light1_diffuse[ ]={1.0, 1.0, 1.0, 1.0};
GLfloat light1_specular[ ]={1.0, 1.0, 1.0, 1.0};
GLfloat light1_position[ ]={-2.0, 2.0, 1.0, 1.0};
GLfloat spot_direction[ ]={-1.0, -1.0, 0.0};
glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5);
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5);
glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2);
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0);
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spot_direction);
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
glEnable(GL_LIGHT1);
Jugando
Jugando
Jugando