04 OpenGL Color Iluminacion

61
Introducción a los gráficos 3D OpenGL Transparencias adaptadas y traducidas de E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Transcript of 04 OpenGL Color Iluminacion

Page 1: 04 OpenGL Color Iluminacion

Introducción a los gráficos 3D

OpenGL

Transparencias adaptadas y traducidas de

E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley 2012

Page 2: 04 OpenGL Color Iluminacion

Objetivos

• Veamos cómo colorear nuestros modelos para que se perciban en tres dimensiones

• Veamos qué tipos de interacción existen entre la luz y nuestros materiales

• Construiremos un sistema de reflexión básico: El modelo de Phong.

• Veremos cómo utilizar OpenGl

2

Page 3: 04 OpenGL Color Iluminacion

• Entendemos por modelo de iluminación el cálculo de la intensidad de cada punto de la escena.

• En el cálculo 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 orientación del objeto con respecto a la luz

• El modelo más utilizado es el modelo de Phong

Introducción

Page 4: 04 OpenGL Color Iluminacion

Necesitamos sombreado (shading)

• Si dibujamos un objeto utilizando únicamente el color glColor. Veríamos algo parecido a:

• Pero a nosotros nos gustaría algo parecido a:

4

Page 5: 04 OpenGL Color Iluminacion

Shading

• ¿Qué hace que un objeto real se vea de esta forma?

• La combinación de la luz con un material provoca que cada punto tenga un color diferente. Hablamos que tiene un determinado sombreado o en inglés “shade”.

• Tenemos que tener en cuenta:– Fuentes de luz– Las propiedades de los materiales– Situación de la cámara– Orientación de la superficie– Etc.

5

Page 6: 04 OpenGL Color Iluminacion

Dispersión (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

Page 7: 04 OpenGL Color Iluminacion

¿El cielo tiene color?

7

Page 8: 04 OpenGL Color Iluminacion

Dispersión de Rayleigh

8

Page 9: 04 OpenGL Color Iluminacion

Ecuaciones de renderizado

• Este proceso infinito de dispersión y absorción se puede describir mediante ecuaciones que forman parte de las ecuaciones de renderizado– Son ecuaciones muy complejas y sin una solución

general– La técnica de “Ray tracing” es un caso especial para

superficies de gran reflexión

• Las ecuaciones de renderizado son globales e incluyen:– Sombras– Dispersiones múltiples de un objeto a otro.

9

Page 10: 04 OpenGL Color Iluminacion

Efectos globales

10

Superficies translucidas

Sombras

Reflexiones múltiples

Page 11: 04 OpenGL Color Iluminacion

Tratamiento global

11

Page 12: 04 OpenGL Color Iluminacion

¿Renderizado local o global?

• Un sombreado correcto requiere un cálculo global que tenga en cuenta todos los objetos y todas las fuentes de luz.– Es incompatible con nuestro sistema de pipeline

que dibuja cada polígono de forma independiente

• Por fortuna, nos solemos conformar cuando la imagen simplemente “parece real”– Existen muchas técnicas para simular ese efecto

12

Page 13: 04 OpenGL Color Iluminacion

Interacción 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 electromagnéticas en ese espectro)

– El resto de las frecuencias se absorben

• La luz se dispersa según las características de la superficie. Depende del pulido, suavidad, orientación, etc.

13

Page 14: 04 OpenGL Color Iluminacion

Fuentes de luz

En general es complejo tratar con fuentes de luz reales. Tendríamos que tener en cuenta todos los puntos:

14

Page 15: 04 OpenGL Color Iluminacion

Simplificamos las fuentes de luz

• La fuente es un punto– Se modela mediante una posición 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 situación de punto– Puede aglutinar la combinación de múltiples fuentes y

tipos de material

15

Page 16: 04 OpenGL Color Iluminacion

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

Page 17: 04 OpenGL Color Iluminacion

Sombreados

17

¿Dónde está la diferencia entre estas imágenes?

Page 18: 04 OpenGL Color Iluminacion

¿Jugamos a buscar diferencias?

18

Page 19: 04 OpenGL Color Iluminacion

Pensemos

• De las transparencias anteriores podemos deducir que:

– La forma del objeto influye en el dibujo,

– Aunque esté formado por triángulos, 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

Page 20: 04 OpenGL Color Iluminacion

Modelo de Phong

• Un modelo muy simple que se puede calcular rápidamente. • 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– Reflexión perfecta

20

Page 21: 04 OpenGL Color Iluminacion

Modelo de Phong

Page 22: 04 OpenGL Color Iluminacion

Tipos de luz

Luz difusa

Luz ambienteLuz especular

Page 23: 04 OpenGL Color Iluminacion

Tipos de luz

Luz Direccional Luz Focal Luz Puntual

Page 24: 04 OpenGL Color Iluminacion

Reflexión ideal

• La normal se determina por la orientación local del polígono.

• El ángulo de incidencia es el ángulo de reflexión

• Los tres vectores son coplanares

24

r = 2 (l · n ) n - l

Page 25: 04 OpenGL Color Iluminacion

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 i

– cos i = l · n si los vectores están normalizados

– Introducimos tres componentes, kr, kg, kb, que indican la cantidad de color reflejada.

25

Page 26: 04 OpenGL Color Iluminacion

Superficies especulares

• La mayoría de las superficies no son perfectamente difusas o perfectamente especulares.

• Las superficies pulidas producen una mayor reflexión en direcciones cercanas al ángulo ideal o de refleción perfecta.

26

Reflexión

especular

Page 27: 04 OpenGL Color Iluminacion

Modelo de la luz reflejadaPhong propuso un modelo en el que la luz reflejada pierde intensidad según el ángulo formado entre el observador y la dirección de reflexión ideal.

27

Ir ~ ks I cos

Grado de brillo

Coeficiente

de absorción

Intensidad originalIntensidad

reflejada

Page 28: 04 OpenGL Color Iluminacion

El coeficiente de brillo(Shininess Coefficient)

• Valores de entre 100 y 200 se corresponden con metales

• Valores de entre 5 y 10 generan aspectos similares al plástico.

28

cos

90-90

Page 29: 04 OpenGL Color Iluminacion

29

Luz ambiente

• La luz ambiente es el resultado de aplicar múltiples 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.

• Añade ka Ia a la fórmula

Coef Intensidad de la luz ambiental

Page 30: 04 OpenGL Color Iluminacion

30

Distancia

• La luz pierde intensidad conforme viaja en el espacio (inversamente al cuadrado de la distancia)

• Podríamos añadir el factor 1/(ad + bd +cd2)

Page 31: 04 OpenGL Color Iluminacion

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 términos independientes para los tres términos: difusión, especular y ambiente.

• Separamos los componentes RGB: red, green y blue

• Por eso, definimos 9 coeficientes para cada foco de luz– Idr, Idg, Idb, Isr, Isg, Isb, Iar, Iag, Iab

Page 32: 04 OpenGL Color Iluminacion

32

Las propiedades del material

• El material tiene propiedades que configuran al modelo

– Nueve parámetros de absorción

• kdr, kdg, kdb, ksr, ksg, ksb, kar, kag, kab

– Un coeficiente de brillo

Page 33: 04 OpenGL Color Iluminacion

33

Sumando todo

Para cada fuente de luz y para cada componente de corlor, el modelo Phong puede escribirse según:

I =kd Id l · n + ks Is (v · r )+ ka Ia

Para cada componente decolor, añadimos la influencia de cada fuente de luz

Page 34: 04 OpenGL Color Iluminacion

34

Modelo de Phong Modificado

• El término especular de Phong resulta complejo de calcular (requiere el computo de un nuevo vector de reflección y un vector de visión por cada vértice)

• Blinn propone una aproximación más eficiente

Page 35: 04 OpenGL Color Iluminacion

35

The Halfway Vector

• h es un vector normaliza a medio camino entre l y v

h = ( l + v )/ | l + v |

Page 36: 04 OpenGL Color Iluminacion

36

Utilizando el “halfway vector”

• reemplazando (v · r )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

Page 37: 04 OpenGL Color Iluminacion

37

Ejemplo

Page 38: 04 OpenGL Color Iluminacion

38

Cálculo de vectores

• l y v son dados por la aplicación

• 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

Page 39: 04 OpenGL Color Iluminacion

La normal en un vértice

Las normales nos permiten aplicar técnicas de iluminación suaves

No tienen que ser la normal de la cara

Se utilizan únicamente para la iluminación

Es una forma (mejor) de aproximar la superficie real.

Page 40: 04 OpenGL Color Iluminacion

Normales

Las normales:

Se introducen con el modelo

Se calculan usando principios básicos

Se aproximan interpolando las normales de los vértices

Page 41: 04 OpenGL Color Iluminacion

41

La importancia de normalizar

• El término Coseno supone que los vectores están normalizado

• Utilizando vectores normalizados simplifica los cálculos

• Tenemos funciones que nos permiten normalizar nuestros vectores

Page 42: 04 OpenGL Color Iluminacion

42

La normal de un triángulo

p0

p

1

p

2

n

plano n ·(p - p0 ) = 0

n = (p2 - p0 ) ×(p1 - p0 )

Normalizado n n/ |n|

p

Page 43: 04 OpenGL Color Iluminacion

43

Recordando el concepto de Normal

• Ecuación de un plano: ax+by+cz+d = 0

• Un plano se determina por tres puntos p0, p2, p3 o por un punto n y su normal p0

• La normal se puede obtener

n = (p2-p0) × (p1-p0)

Page 44: 04 OpenGL Color Iluminacion

44

La normal en una esfera

• Dada una función f(x,y.z)=0

• La normal viene dada por su gradiente

• En la espera f(p)=p·p-1

• n = [∂f/∂x, ∂f/∂y, ∂f/∂z]T=p

Page 45: 04 OpenGL Color Iluminacion

45

Forma paramétrica

• 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

Page 46: 04 OpenGL Color Iluminacion

46

Cómo funciona OpenGL

• Ahora veremos el funcionamiento de OpenGL

– Cómo elegir entre sombreado por vértice o por fragmento.

• Modelos de sombreado

– Plano (Flat)

– Suave (Smooth)

– Gouraud

Page 47: 04 OpenGL Color Iluminacion

Modelos de sombreado

Flat Shading

• Se calcula una única vez para todo el polígono.

Gouraud Shading

• Se calcula para cada vértice y despues interpolamos

Phong Shading

• Interpolamos la normal y para cada pixel se calcula la iluminación

Page 48: 04 OpenGL Color Iluminacion

Sombreado de Gouraud

Es el más común de los métodosRealiza la iluminación de Phong en los vértices

Realiza una interpolación linear

A lo largo de los vértices

A lo largo de las líneas C1

C2

C3

c1 + t1(c2-c1)

c1 + t2(c3-c1)c1 + t1(c2-c1) + t3(c1 + t2(c3-c1)- c1 + t1(c2-c1))

Page 49: 04 OpenGL Color Iluminacion

Sombreado de Gouraud

Ventajas e inconvenientes:

• Es rápido y sencillo en calcular

• Es un modelo inexacto y puede generar efectos extraños

Page 50: 04 OpenGL Color Iluminacion

Sombreado de Phong

• Utiliza el modelo de iluminación de Phong (no confundir uno con otro) pero realiza una interpolación lineal entre las normales de los vértices.

• Aplica el modelo de iluminación de Phong en cada pixel.

Utiliza los mismos parámetros que el modelo de Gouraud

En general genera resultados más

Suaves pero es más lento.

Page 51: 04 OpenGL Color Iluminacion

Sombreado de Phong

Interpola las normales (en lugar del color)

Calcula la iluminación en cada pixel

N1

N2

N3

N4

lights

i

n

isidiambientatotal

shiny

RVkLNkIIkI#

1

ˆˆˆˆ

Recuerda que las normales

se utilizan para los

términos de luz difusa y

especular.

Page 52: 04 OpenGL Color Iluminacion

52

Sombreado en OpenGL

• Necesitamos especificar

– Normales

– Propiedades del material

– Luces

Page 53: 04 OpenGL Color Iluminacion

53

Definiendo un foco de luz

• Por cada punto de luz, podemos definir el RGBA de los componentes difuso, especular y ambiente

• Además damos la posición.

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);

Page 54: 04 OpenGL Color Iluminacion

54

Spotlights

• Funcionan parecido a los puntos de luz pero damos:

– Dirección

– Umbral de corte (Cutoff)

– Atenuación Proporcional a cos

Page 55: 04 OpenGL Color Iluminacion

55

Luz ambiente

• Depende del color de la luz

– Una luz roja tiñe de color rojo todo lo que ilumina

• Suele sernos útil al principio para probar

Page 56: 04 OpenGL Color Iluminacion

56

Propiedades del material

• Tienen que estar conforme con el modelo de iluminación

• 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

Page 57: 04 OpenGL Color Iluminacion

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);

Page 58: 04 OpenGL Color Iluminacion

“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);

Page 59: 04 OpenGL Color Iluminacion

Jugando

Page 60: 04 OpenGL Color Iluminacion

Jugando

Page 61: 04 OpenGL Color Iluminacion

Jugando