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