INF 1366 Computação Gráfica Interativa Ray Tracing (Traçado de Raios) Alberto B. Raposo abraposo@tecgraf.puc-rio.br http://www.tecgraf.puc-rio.br/~abraposo/inf1366/index.htm Ray Tracing / Ray Casting Como computar a irradiação de um raio de luz? Angel Figure 6.2 1
Ray Casting Forma mais simples de Ray Tracing Raios através do plano de visualização Plano de visualização Posição do observador Máquina de ray casting de Durer Albrecht Durer, Século XVI Cluter & Durand, MIT 2
Máquina de ray casting de Durer Cluter & Durand, MIT Máquina de ray casting de Durer Cluter & Durand, MIT 3
Ray Casting Para cada amostra (pixel) Construa raio da posição do observador através do plano de visualização feito no sentido contrário: do olho para fonte de luz. Assim, só calculamos os raios que geram alguma coisa visível Encontre a primeira superfície que o raio intercepta Calcule a cor baseada no modelo de iluminação (ex., Phong) Ray Casting Raios através do plano de visualização Posição do olho Amostras no plano de visualização 4
Ray Casting Implementação Simples: Image RayCast(Camera camera, Scene scene, int width, int height) { Image image = new Image(width, height); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { Ray ray = ConstructRayThroughPixel(camera, i, j); Intersection hit = FindIntersection(ray, scene); image[i][j] = GetColor(hit); return image; Ray Casting Implementação Simples: Image RayCast(Camera camera, Scene scene, int width, int height) { Image image = new Image(width, height); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { Ray ray = ConstructRayThroughPixel(camera, i, j); Intersection hit = FindIntersection(ray, scene); image[i][j] = GetColor(hit); return image; 5
Construindo Raio Através de um Pixel Up direction Plano de visualização back towards P 0 right V Ray: P = P 0 + tv P Construindo Raio Através de um Pixel Exemplo 2D Θ = meio ângulo do frustum d = distância ao plano de visualização right = towards x up P1 = P 0 + d*towards d*tan(θ)*right P2 = P 0 + d*towards + d*tan(θ)*right P 0 P = P1 + (i/width + 0.5) * (P2 - P1) = P1 + (i/width + 0.5) * 2*d*tan (Θ)*right V = (P - P 0 ) / P - P 0 right Θ towards d V P1 P P2 Raio: P = P 0 + tv 2*d*tan(Θ) P P 2 2 0 = dist( P, P0 ) = ( xp xp ) + ( y ) 0 P yp 0 6
Ray Casting Implementação Simples: Image RayCast(Camera camera, Scene scene, int width, int height) { Image image = new Image(width, height); for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { Ray ray = ConstructRayThroughPixel(camera, i, j); Intersection hit = FindIntersection(ray, scene); image[i][j] = GetColor(hit); return image; Interseção do raio com a cena É o que consome a maior parte do algoritmo de ray trace. Interseções com diferentes primitivas geométricas Esfera Triângulo Grupos de primitivas (cena) 7
Interseção Raio-Esfera Raio: P = P 0 + tv Esfera: P - C 2 - r 2 = 0 P P V r P 0 C Interseção Raio-Esfera Raio: P = P 0 + tv Esfera: P C 2 = r 2 Substituindo P: P 0 + tv - C 2 = r 2 ( C) + t V ) ( P C) 2 ( + t V ) P = 0 0 r P 0 V P r C P 2 [ r ] = 0 2 [ V V ] t + [ 2V ( P C) ] t + ( P C) ( P C) 0 0 0 8
Interseção Raio-Esfera 2 [ r ] = 0 2 [ V V ] t + [ 2V ( P C) ] t + ( P C) ( P C) Equação do 2 o grau: a t 2 i 0 + b t + c = 0 Solução: b ± b 2 4ac t = 2a i i 0 0 V P 0 P r C P Onde: a = V 2 = 1 b = 2 V (P 0 - C) c = P 0 C 2 - r 2 Se a direção do raio estiver normalizada! Interseção Raio-Esfera se = b 2 4ac > 0 : t t 1 2 b = 2a b + = 2a t min( t, t i = 1 2) P 0 V P r C P se t i > 0 : (se t 1 e t 2 < 0, raio não intercepta esfera) P = 0 P( ti ) = P + tiv P ' = 0 P( t j ) = P + t jv t j = max( t 1, t2) 9
Interseção Raio-Esfera Precisa do vetor normal no ponto de interseção P para cálculo da iluminação N = (P - C) / P - C N P 0 V P r C Interseção Raio-Esfera Ray Tracing seria muito simples se mundo fosse composto apenas por esferas... Cluter & Durand, MIT 10
Interseção Raio-Triângulo Primeiro, ache a interseção do raio com o plano do triângulo Depois verifique se o ponto de interseção está dentro do triângulo P V P 0 Interseção Raio-Plano Raio: P = P 0 + tv Plano: (P A) N = 0 Substituindo P: (P 0 + tv - A) N = 0 Solução: t i = (A - P 0 ) N / (V N) P = P 0 + t i V V P N A Ponto qualquer do plano P 0 11
Interseção Raio-Triângulo Verifica se P está dentro do triângulo parametricamente Computa α, β: P = α (T 2 -T 1 ) + β (T 3 -T 1 ) T 3 Checa se ponto está dentro: 0 α 1 e 0 β 1 e α + β 1 T 1 β P V α T 2 P 0 Outras Interseções Cone, cilindro, elipsóide: Similar à esfera Box Procura interseção com 3 faces (planos) frontais e retorna o mais próximo do observador Polígono convexo Similar ao triângulo (verifica algebricamente se ponto de interseção com plano está dentro do polígono) Polígono côncavo Interseção com plano igual, mas o teste para saber se ponto está dentro do polígono é bem mais complexo 12
Otimizações no processo de cálculo das interseções Tenta-se diminuir os polígonos a serem testados para interseção: Bounding volumes (caixas ou esferas) Divisão hierárquica do espaço Uniforme Não-uniforme (quadtree, octree) Ray Casting Iluminação Direta Traça raios primários a partir da câmera Iluminação direta apenas de luzes não-bloqueadas I = ) n I E + K AI A + ( K + L D ( N L) K S ( V R) SLI L 13
Sombras Termo de sombra (S i ) diz se fontes de luz estão bloqueadas Trace o raio da interseção com o objeto até cada fonte L i S i = 0 se raio está bloqueado, S i = 1 caso contrário 0 < S i < 1 soft shadows (truque) E A A n I = I + K I + ( K ( N L) + K ( V R) ) S I L D S L L Traçado de Raios Recursivo M. Gattass, PUC-Rio R 2 L 2 R 1 T1 L 1 L 3 T 2 R 3 L 1 R 1 L 2 T 1 L 3 R 2 R3 T 2 14
Ray Tracing recursivo efeitos de segunda ordem Traça raios secundários a partir das superfícies de intersecção Iluminação global (reflexão especular e transparência) I = I + K I + ( K ( N L) + K ( V R) ) S I + K I + K I n Alberto ERaposo APUC-Rio A L D S L L R R T T Reflexões Especulares Traça raio secundário na direção da reflexão Avalia radiância ao longo do raio secundário e a inclui no modelo de iluminação. Radiância para o raio refletido I = I + K I + ( K ( N L) + K ( V R) ) S I + K I + K I n Alberto ERaposo APUC-Rio A D S L L RI L R T T 15
Reflexões Especulares M. Gattass, PUC-Rio Raio refletido : p( t) = p + t rˆ i nˆ rˆ θ θ p i vˆ Superfície especular Transparência Traça raio secundário na direção da refração Avalia radiância ao longo do raio secundário e a inclui no modelo de iluminação Radiância do raio refratado I = I + K I + ( K ( N L) + K ( V R) ) S I + K I + K I n Alberto ERaposo APUC-Rio A D S L L R R T I L T 16
Transparência Coeficiente de transparência é a fração do raio transmitido K T = 1 para objeto transparente, K T = 0 para opaco 0 < K T < 1 para objeto semi-transparente Coefiente de transparência I = I + K I + ( K ( N L) + K ( V R) ) S I + K I + K I n Alberto ERaposo APUC-Rio A D S L L R R K L T T Cálculo do raio refratado (transparência) Para superfícies muito finas, pode-se ignorar mudança de direção do raio Assume que luz atravessa superfície e segue em linha reta N Θ i η i η r T Θr L T Θ i T L 17
Cálculo do raio refratado (transparência) Para objetos sólidos, aplique Lei de Snell: η sin Θ r r = η sin Θ i η i η r i T Θr N Θ i L T ηi = ( cos Θi cos Θr ) N η r ηi L η r Exemplo de refração Enright, D., Marschner, S. and Fedkiw, R. 18
Resumo Ray casting (iluminação direta) Geralmente usa simplificações analíticas para a emissão das fontes de luz e para a reflectância das superfícies Ray tracing recursivo (iluminação global) Incorpora sombras, reflexões especulares, e refrações Tudo isso é uma aproxmação, para tornar viável computacionalmente a geração das imagens foto-realistas Resultado de curso Alunos de CGI98 M. Gattass, PUC-Rio 19
Resultado de curso Alunos de CGI2004.2 A. Raposo, PUC-Rio Resultado de curso Alunos de FCG2005.2 M. Gattass, PUC-Rio 20
Algoritmo de traçado de raios selecione selecione o o centro centro de de projeção(eye) projeção(eye) e e uma uma janela janela no no plano plano de de projeção projeção for for (cada (cada pixel pixel da da tela) tela) { { determine determine o o raio raio ray ray que que vai vai do do centro centro de de projeção projeção ao ao pixel; pixel; pixel pixel = = trace trace ( ( scene, scene, eye, eye, ray, ray, 1); 1); M. Gattass, PUC-Rio Color Color trace trace (Scene (Scene scene, scene, Vector3d Vector3d eye, eye, Vector3d Vector3d ray, ray, int int depth) depth) { { determine determine a a interseção interseção mais mais próxima próxima com com um um objeto objeto if if (intercepta (intercepta objeto) objeto) { { calcule calcule a a normal normal no no ponto ponto de de interseção interseção return return ( ( shade shade ( ( scene, scene, object, object, ray, ray, point, point, normal, normal, depth)); depth)); return return BACKGROUND; BACKGROUND; Color Color shade shade (Scene (Scene scene, scene, Object Object object, object, Vector3D Vector3D ray, ray, Vector3D Vector3D point, point, Vector3D Vector3D normal, normal, int intdepth) {{ color color = termo termoambiente ambientedo do material material do do objeto objeto ;; for for (cada (cadaluz) luz) {{ L = vetor vetorunitário unitáriona nadireção direçãode de point point para paraa a posição posiçãoda daluz; if if (L (L normal>0) normal>0) {{ if if (a (a luz luznão nãofor for bloqueada bloqueadano no ponto) ponto) {{ color color += += componente componentedifusa (Eq.difusa) (Eq.difusa) + componente componenteespecular especular (Eq. (Eq. especular) especular) if if (depth (depth >= >= maxdepth) maxdepth) return return color; color; if if (objeto (objetoé érefletor) {{ rray rray = raio raiona nadireção direçãode de reflexão; reflexão; rcolor rcolor = trace(scene, trace(scene, point, point, rray, rray, depth+1); depth+1); reduza reduzarcolor rcolorpelo pelocoeficente coeficentede de reflexão reflexãoespecular especulare e some some a a color; color; return return color; color; M. Gattass, PUC-Rio 21
Para o trabalho http://www.tecgraf.puc-rio.br/cd/ Outra opção http://www.tecgraf.puc-rio.br/im/ 22
Exemplos: Ray Tracing "Warm Up" Norbert Kern (2001) Exemplos: Ray Tracing http://www.irtc.org/ 23
Exemplos: Ray Tracing http://www.irtc.org/ Exemplos: Ray Tracing http://www.povray.org/ 24
Radiosidade fotografia: Escultura de J. Ferren Painéis difusos diagrama: observador Cluter & Durand, MIT Radiosidade vs. Ray Tracing Escultura original de John Ferren iluminada por trás pela luz do dia. Imagem gerada por ray tracing. Imagem gerada por Ray tracer padrão não radiosidade. consegue simular a interreflexão da luz entre as superfícies difusas. Cluter & Durand, MIT 25
Radiosidade vs. Ray Tracing Ray tracing é algoritmo no espaço da imagem Se câmera se move, precisa recomeçar cálculo Radiosidade é computada no espaço de objeto View-independent (só não pode mover as fontes de luz) Pode pré-computar iluminação complexa Cluter & Durand, MIT Radiosidade Assume-se que superfícies são lambertianas ideiais (difusas) refletem luz incidente igualmente em todas as direções Cena é dividida em conjunto depequenas áreas (patches). A radiosidade, B i, do patch i é a taxa total de energia que sai da superfície. A radiosidade sobre um patch é constante. ω' x' Cluter & Durand, MIT 26
Equação de Radiosidade L(x',ω') = E(x',ω') + ρ x' (ω,ω')l(x,ω)g(x,x')v(x,x') da Superfícies perfeitamente difusas (não direcionais): B x' = E x' + ρ x' B x G(x,x')V(x,x') Cluter & Durand, MIT Exemplos: Radiosidade Lightscape http://www.lightscape.com 27
Exemplos: Radiosidade Program of Computer Graphics, Cornell University. Note a iluminação indireta do teto. Informações Adicionais Peter Shirley. Fundamentals of Computer Graphics, A K Peters, Ltd., Natick, MA, USA, 2002. Foley, J. D., Van Dam, A., Feiner, S. K., e Huhes, J. F., Phlips, L. R., Introduction to Computer Graphics, Addison-Wesley, 1995. Rogers, D. F., Procedural Elements for Computer Graphics. McGraw-Hill, 1985 Marcelo Gattass: notas de aula. http://www.tecgraf.pucrio.br/~mgattass/cg.html Refs. online (ray tracing): http://www.irtc.org/ http://www.acm.org/tog/resources/rtnews/html/ http://www.povray.org/ http://www.siggraph.org/education/materials/hypergraph/raytrace/rtrace0.htm http://www.siggraph.org/education/materials/hypergraph/raytrace/rt_java/raytr ace.html 28