Computação Gráfica I
CRAb – Grupo de Computação Gráfica
Departamento de ComputaçãoUFC
2
Objetivos
• Estudar – equipamentos, técnicas de
programação e conceitos matemáticos
• Para– representação, manipulação e
projeção de objetos bi- e tridimensionais
– aplicar a problemas específicos
3
Sumário do Curso
• Sistemas Gráficos e Modelos• Programação Gráfica• Input e Interação• Objetos Geométricos e
Transformações• Visualização• Pintura• Técnicas Discretas• Implementação de um Renderizador
Pintura (Shading)
5
6.1 Luz e Matéria
• Superfície pode ser
– Emissora de luz
• Superfície de uma lâmpada
– Refletora de luz
– Emissora e refletora de luz
• Ferro em brasa
6
6.1 Luz e Matéria
• Luz chegando a uma superfície é resultado de múltiplas interações
7
6.1 Luz e Matéria
• Equação de renderização
– i(p, p’): intensidade sai de p’ chega a p• (p,p’): parte emitida diretamente por p’• i(p’, p”): intensidade de p” chegando a p’• (p, p’, p”): função de reflexão de p’
– (p, p’): função de oclusão• = 0 se objeto opaco estiver no caminho• = 1/r2 fator de atenuação da distância
"
")",'()",',()',()',()',(P
PpppppppppppS
dSii
8
6.1 Luz e Matéria
• Classificação da interação luz/material– Superfícies especulares
– Superfícies difusas
– Superfícies translúcidas
9
6.2 Fonte Luminosa (A25)
6.2.0 Introdução– Função de iluminação: I(x, y, z, , , )
•x, y, z: posição da fonte• (, ): direção de emissão• : comprimento de onda emitido
– Contribuição total da fonte para iluminação da superfície
10
6.2 Fonte Luminosa (A25)
– Tipos de fontes
•Luz ambiente
•Luz pontual
•Luz spot
•Luz distante
11
6.2 Fonte Luminosa (A25)
6.2.1 Fontes de cores– Modelo do sistema visual humano
• Modelo tricromático (R, G, B)
– Utilizar a função de luminância
b
g
r
I
I
I
I
12
6.2 Fonte Luminosa (A25)
6.2.2 Luz ambiente– Representa a iluminação uniforme
do ambiente • Cozinhas, salas de aula, dias nublados
– Utilizar a intensidade
ab
ag
ar
a
I
I
I
I
13
6.2 Fonte Luminosa
6.2.3 Fonte pontual– Emite luz uniformemente em todas
as direções– Tem Intensidade e localização
02
0
0
0
0
0
0
1),(
I
I
I
pIpp
ppi
p
p
p
pI
b
g
r
14
6.2 Fonte Luminosa
6.2.3 Fonte pontual ...– Gera sombras duras– Fonte de tamanho finito gera regiões
de penumbra e umbra
15
6.2 Fonte Luminosa
6.2.3 Fonte pontual ...– Atenuar efeito de iluminação com a
distância• Utilizar fator
1/(a + b*d + c*d2)
16
6.2 Fonte Luminosa (A25)
6.2.4 Spotlights– Uniforme: Não há diferença de
intensidade na área iluminada• Exceto pela distância do ponto iluminado
à fonte (d1 e d2)
17
6.2 Fonte Luminosa
6.2.4 Spotlights– Não-uniforme: Intensidade concentra
na direção l e decai com o afastamento angular dessa direção• I = (cos )e = (l . s) e
l s
18
6.2 Fonte Luminosa (A25)
6.2.5 Fontes luminosas distantes– Importa apenas a direção de
iluminação e intensidade de iluminação D
D
D
D
DI
b
g
r
I
I
I
19
6.3 O Modelo de Reflexão de Phong
6.3.0 Introdução– Modelo simplificado
• Eficiência computacional• Bom realismo sob
– Condições de iluminação variadas– Materiais diferentes
• Usa 4 vetores unitários– n: normal à superfície– l: do ponto iluminado à fonte– r: reflexão de l (Euclides)– v: do ponto iluminado ao observador
20
6.3 O Modelo de Reflexão de Phong
• Suporta os 3 tipos de interação luz/material– Ambiente– Difusa– Especular
• Cada fonte i contém as 3 intensidades
ibsigsirs
ibdigdird
ibaigaira
i
LLL
LLL
LLL
L
21
6.3 O Modelo de Reflexão de Phong
• As reflectividades do material j para cada um dos 3 tipos de interação– Representam quanto de uma dada
componente é refletida
jbsjgsjrs
jbdjgdjrd
jbajgajra
j
RRR
RRR
RRR
R
22
6.3 O Modelo de Reflexão de Phong
• Considerando o operador matricial @ tal que
– C = A @ B Cij = Aij Bij (não há
somatório)
– I = Ia + Id + Is = La@Ra + Ld@Rd + Ls@Rs
23
6.3 O Modelo de Reflexão de Phong
6.3.1 Reflexão ambiente– Ia = Ra La = ka La
– 0 ka 1
– ka = (kar, kag, kab)
kar= 1.0kag= 0.0kab= 0.0
Lar= 1.0Lag= 1.0Lab= 1.0
Iar= 1.0Iag= 0.0Iab= 0.0
24
6.3 O Modelo de Reflexão de Phong
6.3.2 Reflexão difusa– Superfícies Lambertianas
Superfície rugosa
25
6.3 O Modelo de Reflexão de Phong
– Lei de Lambert• Rd cos
€
cosφ = l ⋅n
Id = kd l ⋅n( )Ld
Id =kd
a+ bpq0 + c pq0
2 l ⋅n( )Ld
q0
q0
p p
26
6.3 O Modelo de Reflexão de Phong
6.3.3 Reflexão especular– Intensidade na direção do
observador• Decai quando cresce:
Is = ks Ls (cos )m
Is = ks Ls (r · v)m r
v
l
27
6.3 O Modelo de Reflexão de Phong
6.3.4 Modelo completo
aa
N
iisisidid
ii
aia
fontes
cbaLkvrLknlLk
pqpqLkI @@@
1@
1
m
2
= m
28
6.4 Cálculo dos Vetores
6.4.1 Vetores normais– Dada a equação do plano
222
222222222,,
unitário):( 1 onde
0...
CBA
Dd
CBA
Cn
CBA
Bn
CBA
An
dznynxn
DzCyBxA
zyx
zyx
nn
29
6.4 Cálculo dos Vetores
– Dados 3 pontos em um plano
0201 ppppn
p0
p2
p1
n
Observação: O vetor obtido precisa ser normalizado
30
6.4 Cálculo dos Vetores
– Dada a equação implícita da superfície
Observação: O vetor obtido pelo gradiente da função precisa ser normalizado
)(2
)(2
)(2
0)()()(),,(0),,( 2222
c
c
c
ccc
zz
yy
xx
z
fy
fx
f
f
rzzyyxxzyxf
z
fy
fx
f
f
zyxf
nn
Esfera em (xc,yc,zc)
31
6.4 Cálculo dos Vetores
– Dada a equação paramétrica da superfície
vu
v
vufv
vufv
vuf
v
u
vufu
vufu
vuf
uvuf
vuf
vuf
z
y
x
vu
z
y
x
z
y
x
z
y
x
ppn
pp
fp
),(
),(
),(
e ,
),(
),(
),(
),(
),(
),(
),(
Observação: O vetor n precisa ser normalizado
32
6.4 Cálculo dos Vetores
– Equação paramétrica da esfera de r=1 centrada na origem• -/2 < u < /2• - < v <
z
y
x
uv
p
pnp
ppn
ppp
)cos(coscos
cos
)cos(
cos
coscos
cos
0
cos
coscos
e ,
cos
coscoscos
cos
2
2
u
usen
vu
vsenu
u
uusen
vu
vsenu
vu
vsenu
vu
vu
vusen
vsenusen
uusen
vu
vsenu
z
y
x
normalizado
33
6.4 Cálculo dos Vetores
– Especificação de um vetor normal em OpenGL• GLfloat n[3];• glNormal3f(n[0], n[1], n[2]); // nx, ny, nzou• glNormal3fv(n); // ponteiro para of vetor
n
34
6.4 Cálculo dos Vetores
6.4.2 Ângulo de reflexão
l r
n
(l . n)
(l . n)
2(l . n)
€
r + l = 2 l ⋅n( )( )n⇒
⇒ r = 2 l ⋅n( )( )n− l 7 multiplicações5 adições
35
6.4 Cálculo dos Vetores
6.4.3 Uso do vetor h (Halfway)– Usado em vez de r no cálculo da
reflexão especular
vl
vlh
3 multiplicações5 adições1 raiz quadrada3 divisões
l
n h
r
v
36
6.4 Cálculo dos Vetores
6.4.3 Uso do vetor h (Halfway)– Só vale a pena se a fonte estiver longe
e o observador estiver longe • h é o mesmo para todo ponto do cenário• r não é o mesmo para todo ponto do cenário
– Se o observador estiver no mesmo plano que contém l e n: 2 = • Utilizando n·h em vez de r·v com o mesmo
expoente m produz um specular hilight menor
• Modificar o expoente m para m’
37
6.4 Cálculo dos Vetores
6.4.4 Luz transmitida– Lei de Snell
– Obter t comot = a (-l) + b (-n)t = – a l – b n
||t|| = 1
i meio no luz da velocidade
vácuono luz da velocidade
sen
sen
i
l
t
t
l
ln
-n t
l
t
a
b
Meio l
Meio t
38
6.4 Cálculo dos Vetores
nlnlnlt
ln
ln
2
2
2
2
2
2
2
2
2
-11
-11cos
cos-11sen1sen1cos
coscos1cos
sen
sensen1sen
t
l
t
l
t
l
t
lt
lt
ll
t
ltt
t
lttl
t
l
l
ttl
bba
aa
39
6.5 Coloração de polígonos
6.5.0 Introdução– Três maneiras de atribuir cor ponto a
ponto • Flat shading• Gouraud shading• Phong shading
– Exemplo: Colorir a malha poligonal
40
6.5 Coloração de polígonos
6.5.1 Coloração homogênea:Flat Shading
– Modelo de Phong retorna mesma intensidade para qualquer ponto• v=constante: observador no infinito• l=constante: fonte de luz no infinito• n=constante: polígono plano
– No OpenGL• glShadeModel(GL_FLAT);
41
6.5 Coloração de polígonos
– Inibição lateral• Propriedade do sistema visual humano• Percebe pequenas diferenças em
intensidade luminosa• Bordas fictícias são criadas: Mach bands
42
6.5 Coloração de polígonos
6.5.2 Coloração por interpolação e de Gouraud
– Intensidade calculada pelo modelo de iluminação de Phong nos vértices do polígono
– Depois de projetados os polígonos• Pontos interiores são coloridos por
interpolação das intensidades dos vértices
– No OpenGL• glShadeModel(GL_SMOOTH);
43
6.5 Coloração de polígonos
– Cálculo das normais em um vértice da malha
4321
4321
nnnn
nnnnn
44
6.5 Coloração de polígonos
6.5.3 Coloração de Phong– Normais são calculadas nos vértices– Polígono é projetado– Normais nos pontos interiores são
interpoladas a partir das normais nos vértices
– Intensidade é calculada ponto a ponto com as normais interpoladas
45
6.5 Coloração de polígonos
– Utilizar interpolação bilinear
DC
BA
nnn
nnn
1,
1
46
6.6 Aproximação de uma esfera por subdivisão
recursiva• Processo recursivo
– Construir tetraedro•Quatro faces triangulares ligando 4
vértices em uma superfície esférica
– Calcular ponto central de cada face– Normalizar pontos centrais
•Pontos irão para a superfície esférica
– Criar três novos triângulos ligando vértices do triângulo ao seu ponto central
47
6.6 Aproximação de uma esfera por subdivisão
recursiva• Processo recursivo
Código FonteCódigo Fonte Código ExecCódigo Exec
B C
A A
B C
AB
BC
AC
48
6.6 Aproximação de uma esfera por subdivisão
recursiva• Processo recursivo
B C
A A
B C
D
49
6.7 Fontes Luminosas no OpenGL
• Tipos de fontes– Ambiente– Direcional (localizada no infinito)
• (xd, yd, zd, 0)
– Pontual •Localizada em um ponto próximo: (xp,yp,zp,wp)• Irradia em todas as direções
– Spot•Localizad em um ponto próximo: (xs, ys, zs, ws)•Apontada em uma direção principal•Limitada lateralmente por um cone
50
6.7 Fontes Luminosas no OpenGL
• Número de fontes em um programa– Limitado em oito fontes
•GL_LIGHT0•GL_LIGHT1•GL_LIGHT2•…•GL_LIGHT7
51
6.7 Fontes Luminosas no OpenGL
• Definir uma fonte de luz (ex: luz 1)– Habilitar iluminação
• glEnable(GL_LIGHTING);
– Especificar os valores das propriedades• GLfloat L1_ambiente[] ={0.3, 0.3, 0.3, 1.0};• GLfloat L1_difusa[] ={1.0, 1.0, 1.0, 1.0};• GLfloat L1_especular[] ={1.0, 1.0, 1.0, 1.0};• GLfoat L1_posicao[] ={-2.0, 2.0, 1.0, 1.0};• GLfloat spot_dir [] ={-1.0, -1.0, 0.0};
– Utilizar os comandos do OpenGL para associar essas propriedades à GL_LIGHT1
52
glLightfv(GL_LIGHT1, GL_AMBIENT, L1_ambiente);glLightfv(GL_LIGHT1, GL_DIFFUSE, L1_difusa);glLightfv(GL_LIGHT1, GL_SPECULAR, L1_especular);
glLightfv(GL_LIGHT1, GL_POSITION, L1_posicao);
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_dir);glLightf (GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
glEnable (GL_LIGHT1);
6.7 Fontes Luminosas no OpenGL
53
6.7 Fontes Luminosas no OpenGL
• Estabelecer um modelo de iluminação– Três componentes
• Intensidade da iluminação ambiente global
•Considerar o observador próximo ao cenário ou no infinito?
•Cálculo da iluminação deve ser diferente para os dois lados de uma face?
– Usar o comando glLightModel*();
54
6.7 Fontes Luminosas no OpenGL
• Estabelecer um modelo de iluminação– Iluminação ambiente global
GLfloat luz_ambiente_global[]={0.2, 0.2, 0.2, 1.0);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, luz_ambiente_global);
– Observador local ou no infinito glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,
GL_TRUE);Default: GL_FALSE (Observador no infinito)
55
6.7 Fontes Luminosas no OpenGL
• Estabelecer um modelo de iluminação– Iluminação em dois lados
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
Default: GL_FALSE (Somente uma face é iluminada)
56
[Default]
6.8 Especificação de Materiais/OpenGL
•Utilizar o comando glMaterial*()void glMaterial{if}[v]( GLenum face, GLenum pname, TYPE param);
face: GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
pname: GL_AMBIENT param: (0.2, 0.2, 0.2,
1.0)GL_DIFFUSE (0.8, 0.8, 0.8, 1.0)GL_AMBIENT_AND_DIFFUSEGL_SPECULAR (0.0, 0.0, 0.0, 1.0)GL_SHININESS 0.0GL_EMISSION (0.0, 0.0, 0.0, 1.0)GL_COLOR_INDEX (0, 1, 1)
57
6.8 Especificação de Materiais/OpenGL
•Definir as propriedades do material iglFloat ka_i[]={0.2, 0.2, 0.2, 1.0};glFloat kd_i[]={1.0, 0.8, 0.0, 1.0};glFloat ks_i[]={1.0, 1.0, 1.0, 1.0};
•Utilizar o comando glMaterial*()glMaterialfv(GL_FRONT, GL_AMBIENT, ka_i);glMaterialfv(GL_FRONT, GL_DIFFUSE, kd_i);glMaterialfv(GL_FRONT, GL_SPECULAR, ks_i);glMaterialf (GL_FRONT, GL_SHININESS, 100.0);
58
6.8 Especificação de Materiais/OpenGL
•Para superfícies emissoras de luzglFloat emissao[]={0.0, 0.3, 0.3, 1.0};glMaterialfv(GL_FRONT, GL_EMISSION, emissao);
59
6.8 Especificação de Materiais/OpenGL
• Aspectos de programação– Toda mudança de material implica em um
grande número de chamadas a glMaterial– Melhor escrever a seguinte função para trocar
o materialvoid materials(materialStruct *materials){
glMaterialfv(GL_FRONT, GL_AMBIENT, materials->ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, materials->diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, materials->specular);glMaterialf (GL_FRONT, GL_SHININESS, materials->shininess);
}
60
6.8 Especificação de Materiais/OpenGL
• Aspectos de programaçãotypedef struct
{ GLfloat ambient[4];GLfloat diffuse[4];GLfloat specular[4];GLfloat shininess[4];
} materialStruct;
61
6.8 Especificação de Materiais/OpenGL
• Aspectos de programação– Bronze e Ouro
materialStruct brassMaterial = { 0.33, 0.22, 0.03, 1.0,0.78, 0.57, 0.11, 1.0,0.99, 0.94, 0.81, 1.0,27.89};
materialStruct goldMaterial = {0.25, 0.20, 0.07, 1.0,0.75, 0.61, 0.23, 1.0,0.63, 0.56, 0.37, 1.0,51.2};
62
6.9 Coloração do Modelo da Esfera
• Habilitação de propriedades e testesglEnable (GL_LIGHTING);glEnable (GL_LIGHT0);glEnable (GL_DEPTH_TEST);glPolygonMode(GL_FRONT, GL_FILL);
• Atribuição do material ouro• Definição da fonte de luz• Desenho da esfera
Código FonteCódigo Fonte
Código ExecCódigo Exec
63
6.10 Coloração Global
• Modelo de iluminação local– Colore-se cada objeto
independentemente•Fonte de luz + objeto + observador
Iluminação local
Iluminação global
64
6.10 Coloração Global
• Modelo de iluminação global– Luz que chega ao olho do observador
é oriunda de múltiplas reflexões e refrações
– Ray-tracing: segue raio caminho inverso
65
6.10 Coloração Global
• Modelo de iluminação global– Radiosidade: balanço de energia no
ambiente define a energia em cada superfície
Fim do capítulo 6