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 D. Brogan Univ. of Virginia
Ray Casting Forma mais simples de Ray Tracing Raios através do plano de visualização Plano de visualização Posição do observador D. Brogan Univ. of Virginia
Máquina de ray casting de Durer Albrecht Durer, Século XVI Cluter & Durand, MIT
Máquina de ray casting de Durer Cluter & Durand, MIT
Máquina de ray casting de Durer Cluter & Durand, MIT
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) D. Brogan Univ. of Virginia
Ray Casting Raios através do plano de visualização Posição do olho Amostras no plano de visualização D. Brogan Univ. of Virginia
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; } D. Brogan Univ. of Virginia
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; } D. Brogan Univ. of Virginia
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 D. Brogan Univ. of Virginia
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 ) + ( yp y ) ( 0 P0 D. Brogan Univ. of Virginia
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; } D. Brogan Univ. of Virginia
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)
Interseção Raio-Esfera Raio: P = P 0 + tv Esfera: P - C 2 -r 2 = 0 P P V r P 0 C D. Brogan Univ. of Virginia
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 [ V V ] t + [ 2V ( P C) ] t + ( P C) ( P C) 0 i [ ] 2 r = 0 0 0
Interseção Raio-Esfera 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 i = 0 Solução: b ± b 2 4ac t = 2a i [ ] 2 r = 0 0 P 0 0 V 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 i = min( t 1, t2 ) 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 + t V i P ' = 0 P( t j ) = P + t j V t j = max( t 1, t2)
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 D. Brogan Univ. of Virginia
Interseção Raio-Esfera Ray Tracing seria muito simples se mundo fosse composto apenas por esferas... Cluter & Durand, MIT
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 D. Brogan Univ. of Virginia
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 N A P = P 0 + t i V V Ponto qualquer do plano P 0 D. Brogan Univ. of Virginia
Interseção Raio-Triângulo Verifica se P está dentro do triângulo parametricamente T 3 Computa α, β: P = α (T 2 -T 1 ) + β (T 3 -T 1 ) Checa se ponto está dentro: 0 α 1 e 0 β 1 e α + β 1 T 1 β P V α T 2 P 0 D. Brogan Univ. of Virginia
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 complexot
Ray Casting Iluminação Direta Traça raios primários a partir da câmera Iluminação direta apenas de luzes não-bloqueadas + + + = L L L n S D A A E I S R V K L N K I K I I ) ) ( ) ( ( D. Brogan Univ. of Virginia
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) I = I E + K A I A + L ( K D ( N L) + K S ( V n R) ) S L I L D. Brogan Univ. of Virginia
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 R 3 T 2
Ray Tracing recursivo efeitos de segunda ordem Traça raios secundários a partir das superfícies de interecção Iluminação global (reflexão especular e transparência) D. Brogan Univ. of Virginia 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. D. Brogan Univ. of Virginia Radiância para o raio refletido I = I + K I + ( K ( N L) + K ( V R) ) S I + K I R + K I n Alberto ERaposo APUC-Rio A L D S L L R R T T
Reflexões Especulares M. Gattass, PUC-Rio Raio refletido : p( t) = pi + t rˆ rˆ nˆ θ θ vˆ p i 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 D. Brogan Univ. of Virginia 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 L D S L L R R T T I T
D. Brogan Univ. of Virginia Transparência Coeficiente de transparência é a fração do raio transmitida 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 T I n Alberto ERaposo APUC-Rio A L D S L L R R T T
Cálculo do raio refratado (transparência) Para superfícies muito finas, podepse ignorar mudança de direção do raio Assume que luz atravessa superfície e segue em linha reta N Θ i D. Brogan Univ. of Virginia η i η r T Θr L T Θ i T L
Cálculo do raio refratado (transparência) Para objetos sólidos, aplique Lei de Snell: η sin r Θ r = η sin i Θ i N η i η r Θ i L T Θr D. Brogan Univ. of Virginia T ηi = ( cos Θi cos Θr ) N η r ηi η r L
Exemplo de refração Enright, D., Marschner, S. and Fedkiw, R.
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 aprixmação, para tornar viável computacionalmente a geração das imagens foto-realistas
Resultado de curso Alunos de CGI98 M. Gattass, PUC-Rio
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 ( ( 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 int depth) depth) {{ 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) 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
Exemplos: Ray Tracing http://www.irtc.org/
Exemplos: Ray Tracing http://www.irtc.org/
Exemplos: Ray Tracing http://www.povray.org/
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. Ray tracer padrão não consegue simular a interreflexão da luz entre as superfícies difusas. Imagem gerada por radiosidade. Cluter & Durand, MIT
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
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
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