Shading
Computação Gráfica - LM
Iluminação, Sombras, Shading
e Textura
•
•
•
•
Iluminação
Sombreamento
Remoção de faces ocultas
Textura
Shading
• Dada uma equação para calcular a radiância da
superfície, ainda é necessário aplicá-la ao modelo
real.

I d a  ka I a  f att I light kd cos  ks (cos )
nsh in y

• Pode-se determinar ela em alguns pixels e
interpolar ou espalhar para aos outros (Shading)
– shading é geralmente executado durante a
rasterização
– há modelos eficientes para fazer isso (Flat,
Gouraud, Phong shading)
More Common Shading Styles
• Faceted shading: no interpolation
– color constant within polygon
– least expensive
• Gouraud shading: interpolate colors
– shade each vertex
– linearly interpolate color across polygon
– cost: three integer adds per pixel
• Phong shading: interpolate normals
–
–
–
–
calculate vertex normals
linearly interpolate normals across polygon
use interpolated normal to shade each pixel (expensive!)
cost: tens of floating point computations per pixel
• Texture Mapping: interpolate texture coordinates
– use those coordinates to do texture lookup for each pixel
Faceted (Flat) Shading
• Calcula valor da normal e determina o
valor de de iluminação (shading) para o
centro do polígono (I(x,y)=…) que será o
mesmo para todos os pixels dentro do
polígono
Gouraud Shading
• Especificar um valor de sombra diferente para cada
vértice de polígono (polígonos adjacentes com o mesmo
valor na borda em comum)
• Interpolar na hora de fazer o rendering
• Pode também ser usado para obscurecer regiões
distantes do observador, fazendo a cena parecer mais
real
Gouraud
P1,S1
P3,S3
P2,S2
Rasterizando
• Calcular o valor de iluminação
(sombreamento) em A e B, interpolando
os valores de S1, S2, e S3
– Seja u1 = d(P1,A)/d(P1,P3)
– Seja u2 = d(P1,B)/d(P1,P2)
– As = u1S3 + (1-u1)S1
– Bs = u2S2 + (1-u2)S1
• Obs: para calcular o valor exato de
sombreamento em C:
– Cs = As + (1-frac(Ax))*Gradient
Rasterizando
• Calcular o gradiente de sombreamento ao longo
da linha:
– Gradient = (Bs - As) / d(A,B)
– Obs: d(A,B) = (Bx-Ax), onde Ax,Bx = valor da
coordenada em X de A,B
• Calcular o valor de cada pixel e pintar tela:
• Shade = Cs
• loop X from Cx to Dx
•
plot pixel at (X,Y) with colour Shade
•
Shade = Shade + Gradient
• End of X loop
Gouraud Shading
• We can do shading during scan conversion
• How? Simply adjust the fill color on a pixel-by-pixel basis
•
Compute illumination at each of the vertices
•
Linearly interpolate vertex colors to get colors along each
edge
•
Interpolate edge colors to get pixel colors along each span
• Much faster than computing illumination at each pixel.
• A great trick!
• Pronounced goo-ro’
There is an Ambiguity
• This only happens for quadrilaterals and higher, but…
• When a square rotates on screen, the scan lines cross it
differently.
• That means the X interpolation connects two different Y
interpolation points.
• That means the color at a given pixel changes!
• (A good reason for preferring triangles).
• Barycentric coords (coming soon) don’t have this
problem.
C
C is blue
C
C is red
Phong Shading
• Calcular normal em cada vértice
• Para determinar cor de cada pixel:
– Interpolar normais linearmente, usando
mesma idéia acima
– Calcular valor de shading usando normal
interpolada (usando equação de shading)
– Resultado é melhor que interpolar shading
diretamente
Shading Stytes
•
Faceted
Gouraud
Phong
Shading Styles
• Gouraud and Phong are examples of smooth
shading
– trick to make polygon meshes look smooth
• Keep in mind that this is not physically
correct!
– Why?
– 1. How should the color vary over a plane under
diffuse illumination?
– 2. Normal interpolation does not make sense for
a polygon!
• But it works great in practice
Shading Styles
• What is the advantage of Phong over
Gouraud?
– specular highlights look much better
• Phong shading is NOT the same as Phong
Illumination!
– Phong illumination tells you how to compute
radiance given normal
– Phong shading is a trick for interpolating normals
in image space
• OpenGL does Gouraud shading (or flat
shading)
Sombras
• Sombras ocorrem quando objetos são
protegidos da luz
– objeto não influi na iluminação da cena (não
há reflexão direta da luz do objeto ao
observador)
• Calcular o que está oculto é um problema
de visibilidade
– a luz consegue ver o objeto?
Sombras
– Pode-se usar um algoritmo z-buffer para
sombreamento
• executar o algoritmo do ponto de visualização da
fonte de luz
• salvar o z-buffer como shadow-buffer
• executar o algoritmo z-buffer real, mapeando cada
ponto nas coordenadas da fonte de luz e
comparando o valor contra o shadow-buffer
• (OK, felizmente já estudamos z-buffer :-)...
Shadow-buffer
Download

shading.ptt