Algoritmo de Rastreamento de Raios MGattass Perspectiva e tamanhos relativos MGattass Perspectiva e tamanhos relativos MGattass Iluminação e posição O que está na frente? A que distância do apoio? MGattass Sombra MGattass Oclusão MGattass Gradiente de textura Proposto no século XX! MGattass Efeitos Passivos – Inerentes a aparência do mundo externo – Independem dos nossos olhos – Fotografias parecem 3D MGattass Camera obscura Plymouth, UK Camera Obscura - San Francisco The Camera Obscura at the Cliff House is one of several remaining camera obscuras in the world. The device is an ancient precursor to modern photography, and well worth a visit, especially if you haven't previously visited a camera obscura. MGattass Pintores Canaletto (Giovanni Antonio Canal) (1697-1768). Dois enfoques: Raios ye Traçado de Raios ze xe zo Para cada pixel da tela xo Defina um raio Para cada objeto da cena Calcule o objeto visível Para cada luz da cena Lance um raio Para cada objeto da cena Teste se o objeto faz sombra Calcule sua iluminação yo Complexidade maior que O(num. de pixels num. de objetos2) Dois enfoques: ZBuffer Calcule a cor de cada vertice Projete cada triângulo Projete os vértices no plano de projeção Rasterize o triângulo gerandoo os fragmentos que vão para cada pixel Aqueles fragmentos que estiverem a frente dos framentos já depositados recebem nova cor e a profundidade do pixel é atualizada. A Câmara “Pinhole” e seu modelo centro de projeção plano de projeção eixo óptico raios MGattass eixos do plano de projeção Traçado de Raios Luz ye ze eye Câmara Objetos xe yo xo zo MGattass Iluminação Pixel (RGB) Algoritmo básico Luz ye ze Câmara xe Iluminação Objetos Para cada pixel da tela; Lance uma raio; Para cada objeto da cena Calcule a interseção do raio com este o objeto; Armazene a interseção mais próxima; Se o raio interceptou algum objeto Calcule a contribuição das luzes neste ponto; Pinte o pixel com esta cor; MGattass Definição de uma câmera Projeção cônica plano de projeção centro de projeção centro óptico o janela hp (pixels) h (metros) eixo eye óptico centro de projeção janela o wp (pixels) w (metros* ) w MGattass (*) metros ou outra unidade de comprimento wp hp h Abertura de uma câmera fovy1 fovy2 h df1 MGattass df2 fovy h tan 2d f 2 fovy h 2d f tan 2 Eixos de uma câmera v ye eixo vertical eixo óptico eye ye janela xe l (left) eixo horizontal hp (pixels) h u t (top) r (right) ze o b (bottom) MGattass wp (pixels) w xe Parâmetros de funções do OpenGL void glPerspective(GLdouble fovy,GLdouble aspect,GLdouble near_,GLdouble far_); w ye ze aspect = w/h fovy h xe ze f (far) void glViewport(GLint x0, GLint y0, GLsizei width, GLsizei height ); v height n (near) MGattass ye y0 o1 width x0 u Parâmetros intrínsecos (do OpenGL) parte 2 – Câmera mais geral void glFrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near_, GLdouble far_ ); ye v ze near far xe near xe left right ze MGattass u Parâmetros internos ou intrínsecos Primários: n = plano próximo df n f = plano distante fovy h 2d f tan 2 wp hp pixels fovy = campo de visão MGattass Derivados: w wp hp h Posicionamento da câmera (parâmetros externos ou extrínsecos) eye = centro óptico center = ponto de visada, up = direção para cima y0 vista lateral up eye center up eye fovy center x0 z0 Coordenadas dos Objetos near far MGattass Calculo do sistema do olho - xe ye ze up eye dados: eye, center, up view = center - eye ze y0 center 1 e ye ce nte r e ye ce nte r up x0 eye z0 view y0 center x0 z0 MGattass ze Calculo do sistema do olho - xe ye ze vup xe eye ze xe 1 up z e up z e view y0 center ye up x0 xe eye z0 xe view ye y0 center ze up x0 eye z0 MGattass center ze y e z e xe Um modelo de câmera d raio : p(t ) o td yo xo zo MGattass o eye d p xy eye Lançamento de Raios h pixels na altura v x u( x ) w wp y v( y ) h hp h-1 pxy y p xy o1 u( x)uˆ v( y)vˆ 2 1 o10 1 2 3 x w-1 u w pixels na base MGattass x y p xy o1 w xˆ e h yˆ e wp hp Canto inferior esquerdo da janela no plano near (ou far) ye xe eye ze h w o1 eye d f zˆ e yˆ e xˆ e 2 2 plano near a yˆ e 2 o1 y0 canto inferior esquerdo x y p xy o1 w xˆ e h yˆ e wp hp x0 z0 y 1 x 1 d d f zˆ e h yˆ e w xˆ e h w 2 2 p p MGattass Resultando d raio : p(t ) o td yo o eye xo zo MGattass y 1 x 1 d d f zˆ e h yˆ e w xˆ e h w 2 2 p p Tipo Abstrato de Dados: Camera em C struct _Camera { /* Definição da câmera */ Vector eye, center, up; float fovy; float n,f; int wp,hp; /* Parametros derivados */ float df; float w,h; Vector xe,ye,ze; }; typedef struct _Camera Camera; Camera* camCreate( Vector eye, Vector at, Vector up, double fovy, double _near, double _far, int wp, int hp ); Ray camGetRay( Camera camera, double x, double y ); MGattass Objeto câmera Inicialização (pré-processamento): Dados: fovy, wp, hp, n, f, eye, center, up df n ze fovy h 2d f tan 2 1 e ye ce nte r e ye ce nte r xe w wp hp h 1 up z e up z e y e z e xe Lançamento de raios: o + td Dados: x, y o eye MGattass y 1 x 1 d d f zˆ e h yˆ e w xˆ e h w 2 2 p p Modelagem dos Objetos Implícita: Por fronteira: p p c r p3 dados: centro c raio r MGattass p2 p1 Superfícies implícitas em grades Cartesianas • Seja f(x,y,z), uma função amostrada em R3 y f(x,y,z) R a x Objetivo: – Visualizar z uma isosuperfície f(x,y,z) = a. S definida por Classificação do Voxel Voxel opacidade 1.0 Branco (1,1,1) Osso Músculo Vermelho (1,0,0) Gordura Amarelo (1,1,0) ar cor 0 valor 1.0 Interseção de um raio com uma esfera Raio: p(t ) o td Esfera : o d p(ti ) c r 2 2 o ti d c r 2 ti 2 o c tid o c tid r 2 d d ti2 2d (o c) ti o c o c r 2 0 a ti2 b ti c 0 MGattass b b 2 4ac t 2a Objeto esfera: métodos (dados o, d, c, r ) Interseção: a d d se ti > 0 : b 2d (o c) c o c o c r 2 se b2 4ac 0 pi p(ti ) o tid Normal: pi b t1 2a b t2 2a MGattass ti min(t1 , t2 ) nˆ i c 1 pi c nˆ i pi c Interseção com o plano do triângulo Raio: p(t ) o td Plano: p(ti ) p1 n 0 o tid p1 n 0 tid n o p1 n 0 ti MGattass nˆ o p1 o n dn p 2 p1 p 3 p 2 p 2 p1 p 3 p 2 p3 n d p(ti ) p1 pi p(ti ) o tid p2 Ponto interno a triângulo p3 n v12 v 23 v23 v31 p2 int pi v12 p1 MGattass p iext n v12 (pint p1 ) 0 i n v12 (piext p1 ) 0 Coordenadas baricêntricas A1 nˆ v 23 (pi p 2 ) / 2 A2 nˆ v 31 (pi p3 ) / 2 nˆ unitv12 v31 A3 nˆ v12 (pi p1 ) / 2 p3 AT A1 A2 A3 v31 nˆ A1 A2 p L1 A1 / AT v23 int i L2 A2 / AT A3 p1 L3 A3 / AT v12 p MGattass ext i p2 pi é interior se L1, L2 e L3 [0..1] Coordenadas baricêntricas como funções interpolantes xi x1 x2 x3 yi L1 y1 L2 y2 L3 y3 z z z z i 1 2 3 p3 A2 p1 A1 pi L1 A3 1 p2 L3 MGattass L1 L2 L3 1 L2 1 1 Interpolação de cor e coordenada de textura através das coordenadas baricêntricas c3 u3 p3 A2 p1 c1 u1 ri r1 r2 r3 gi L1 g1 L2 g 2 L3 g 3 b b b b i 1 2 3 A1 pi ou: A3 p2 c2 u2 MGattass ui u3 u1 u2 L1 L2 L3 v1 v2 vi v3 Forma otimizada de calculo o p i o ti d pi L1p1 L2p2 L3p3 d p3 n p(ti ) p1 pi o tid (1 L2 L3 )1p1 L2p2 L3p3 Tomas Möller, Ben Trumbore Fast, Minimum Storage Ray/Triangle Intersection MGattass p2 Forma otimizada de cálculo o d p3 n p(ti ) p1 o tid (1 L2 L3 )1 p1 L2p2 L3p3 tid L2 (p2 p1 ) L3 (p3 p1 ) o p1 ti d (p 2 p1 ) (p 3 p1 ) L2 o p1 L 3 Ax b MGattass p2 Caixa alinhada com os eixos d=(dx, dy, dz) o ti (xmin, ymin, zmin) y z (xmax, ymax, zmax) x d x 0 x xmin d y 0 y ymax d z 0 z zmax MGattass Motivação: Uma cena simples Camera: eye = (100,40,40), center = (0,0,0), up=(0,1,0), fov=90º, near = 30, far=230, w=230, h=230. Esfera: c = (0,20,0), r = 25, cor azul = (0,0,1) Caixas alinhadas com os eixos: p0 = (-80,-50,-50), p1 = (50,-45,50) e cor amarela = (0.7,0.7,0) p0 = (-80,-50,-60), p1 = (50,50,-50) e cor amarela = (0.7,0.7,0) Luz Pontual: Posição=(60,120,40) e intensidade RGB l=(0.8,0.8,0.8) MGattass O que conseguiriamos se simplesmente atribuissemos aos pixels a cor dos objetos? MGattass Área aparente energia luminosa I 2 i lumens / m A I (lumens) A energia luminosa I (lumens) A A cos ' MGattass I 2 i ' cos lumens / m A Modelo de reflexão de superfíces Lambertianas luz incidente luz incidente luz incidente 1. Reflete igualmente em todas as direções 2. A intensidade é proporcional ao co-seno MGattass Componente de reflexão difusa cos 1 nˆ Lˆ - /2 pi I r l r k dr cos I g l g k dg cos I l k cos b b db MGattass 0 /2 a Outras maneiras de se escrever: I r l r k dr cos I g l g k dg cos I l k cos b b db I r lr k dr I g l g k dg I l k b b db nˆ Lˆ l k l ˆ ˆ nˆ L l k nˆ L l l nˆ Lˆ l k r dr g dg b db k dr ˆ ˆ g k dg n L k b db r Eq. 1 I, l, k [0 ,1 ] MGattass Luz difusa mais ambiente: I r lr k dr I g l g k dg nˆ Lˆ I l k b b db I r I ar k dr lr k dr I g I ag k dg l g k dg nˆ Lˆ I I k l k b ab db b db MGattass Componente de reflexão especular rˆ nˆ Lˆ a vˆ Brilho rˆ vˆ n n=1 n=4 n=8 -1 MGattass -0,5 n I l k cos a r r sr n l g k sg cosa Ig n I l k cos a b especular b sb 0 0,5 1 a Eq.2 I, l, k [0 ,1 ] Reflexão especular I r I ar k dr l r k dr l r k sr n ˆ ˆ ˆ ˆ I I k l k n L l k r v g ag dg g dg g sg I I k l k l k b ab db b db b sb MGattass Reflexão especular nˆ rˆ a vˆ Lˆ pi MGattass luz refletida Cálculo da reflexão de um vetor sobre outros h Lˆ nˆ ˆ nˆ )nˆ Ln (L h Ln rˆ h Ln L rˆ Ln h ˆ n ˆ ˆ n ˆ L rˆ 2 L MGattass Distribuição da luz direta sobre um ponto Lˆ rˆ nˆ vˆ pi Ambient Diffuse C Camb Cluz k dif MGattass Specular n ˆ nˆ L Cluz k s rˆ vˆ Modelo de várias luzes lr k dr I r I ar k dr lr k sr n ˆ l k rˆ vˆ I g I ag k dg l g k dg nˆ L g sg luzes l k I I k l k b ab db b sb b db ˆ nˆ )nˆ L ˆ rˆ 2(L para cada fonte de luz rˆr 2( vˆ nˆ )nˆ vˆ uma reflexão apenas l r k dr I r I ar k dr l r k sr ˆ ˆ I g I ag k dg l g k dg nˆ L l g k sg rˆr L I I k luzes l k l k b db b ab db b sb MGattass n Sombra Raio de sombra: p(t ) pi t rˆs rˆs pi A luz não chega a superfíce MGattass Modelo de várias luzes e sombra l r k dr I r I ar k dr lr k sr ˆ ˆ I g I ag k dg f s l g k dg nˆ L l g k sg rˆr L I I k luzes l k l k b ab db b sb b db se sombra 0 fs 1 caso contrário MGattass n Fontes de luz especiais: Onidirecional MGattass Fonte: Mauricio Hofmam Fontes de luz especiais: Direcional MGattass Fonte: Mauricio Hofmam Fontes de luz especiais: Farolete MGattass Fonte: Mauricio Hofmam Uma revisão MGattass Reflexão de outros objetos Raio refletido: p(t ) pi t rˆr nˆ rˆr vˆ pi Superfície especular MGattass Transparência Raio refratado: p(t ) pi t rˆt nˆ h1 rˆt MGattass vˆ 1 Objeto transparente pi 2 h2 lei de Snell h1 sin 2 h 2 sin 1 Cálculo do Raio Refratado vt ( vˆ nˆ )nˆ vˆ nˆ vˆ sin i vt vt i v n tˆ pi t nˆ hi sin t sin i ht cos t 1 sin 2 t rˆt ˆt 1 v t vt rt sin t tˆ cost (nˆ ) MGattass Raio refratado: p(t ) pi t rˆt Advertência: Refração não é simples! MGattass Iluminação considerando superfícies refletoras e objetos transparentes lr k dr I r (rr ) I r I ar k dr lr k sr I r (rt ) n ˆ ˆ I g I ag k dg f s l g k dg nˆ L l g k sg rˆr L k I g (rr ) (1 o) I g (rt ) I (r ) I I k luzes l k l k I (r ) b db b sb b ab db b t b r redução da reflexão MGattass redução da transparência Natureza recursiva do algoritmo de Rastreamento de Raios R2 R1 L2 T1 L1 L3 T2 R3 L1 R1 L2 T1 L3 R2 MGattass R3 T2 Resultado de curso MGattass Alunos de CGI98 Algoritmo de traçado de raios selecione o centro de projeção(eye) e uma janela no plano de projeção for (cada pixel da tela) { determine o raio ray que vai do centro de projeção ao pixel; pixel = trace ( ray, 1); } } Color trace (Scene scene, Vector3d eye, Vector3d ray, int depth) { determine a interseção mais próxima com um objeto if (intercepta objeto) { calcule a normal no ponto de interseção return ( shade ( scene, object, ray, point, normal, depth)); } return BACKGROUND; } MGattass Color shade (Scene scene, Object object, Vector3D ray, Vector3D point, Vector3D normal, int depth) { color = termo ambiente do material do objeto ; for (cada luz) { L = vetor unitário na direção de point para a posição da luz; if (L • normal>0) { if (a luz não for bloqueada no ponto) { color += componente difusa (Eq.1) + componente especular (Eq.2) } } if (depth >= maxDepth) return color; if (objeto é refletor) { rRay = raio na direção de reflexão; rColor = trace(scene, point, rRay, depth+1); reduza rColor pelo coeficente de reflexão especular e some a color; } return color; } Texturas v v v 1.0 1.0 1.0 0 1.0 u 0 1.0 u 0 1.0 u Texturas 2D = Imagens onde o domínio é u, v [0,1]×[0,1] R2 MGattass Sistemas de coordenada de textura na caixa face x=xmax (0,0) v u (1,1) (0,0) u y ymin ymax ymin z z min v z max z min u y MGattass (0,0) v v z u x Sistema de coordenada de textura na esfera z cos x sin cos y sin sin z y tan x u 1 v 1 MGattass tan y / x x2 y2 z i i v(h 1) j u( w 1) j Sistema de coordenada de textura no triângulo v 3 (u3,v3) v3 2 v1 = v2 1 (u1,v1) u1= u3 MGattass u2 u (u2,v2) Textura no triângulo e coordenadas baricêntricas p3 A3 nˆ v12 (pi p1 ) / 2 v31 nˆ A2 p1 A1 nˆ v 23 (pi p 2 ) / 2 A2 nˆ v 31 (pi p3 ) / 2 A1 v23 L1 A1 / AT L2 A2 / AT L3 A3 / AT p int i A3 L3 1 ( L1 L2 ) v12 p2 ui u3 u1 u2 L L L 1 2 3 v1 v2 vi v3 MGattass AT A1 A2 A3 Textura MGattass Texturas de rugosidade (bump textures) e Texturas de deslocamentos (displacement mapping) nˆ nˆ ' nˆ ( , ) MGattass Pertubar aleatóriamente as normais dos objetos Pertubar aleatóriamente as posições dos pontos z=x z x (1,1) y v (0,0) MGattass u z=-x y=x y=-x Textura ambiente (environment maps) face dos raios x>y e x>z yx u 2x zx v 2x Tratamento anti-alias a dxdy sub-pixels pixel dx, dy = variáveis randômicas MGattass •Lance um raio para cada sub-pixel •Faça uma média dos valores obtidos Anti-alias pixel (a) original MGattass pixel (b) uniforme pixel (c) “jittered” Refinamento Progresivo MGattass amostragem inicial primeira subdivisão segunda subdivisão subdivisão final pixels sendo visitados pixels já visitados Radiosidade e Ray Tracing standard raytracing global illumination MGattass Klaus Mueller, Stony Brook University, Computer Science (CSE 564) Todays State of the Art - Some Snapshots Feb 3rd, 2003 Afrigraph 2003 Aceleracao do RT • Cálculos mais eficientes • Uso de uma Kd Tree MGattass Classificação do Voxel Voxel opacidade 1.0 Branco (1,1,1) Osso Músculo Vermelho (1,0,0) Gordura Amarelo (1,1,0) ar cor 0 valor 1.0 Lançamento dos Raios plano de visualização y volume dos raios x z volume dos slices raio Partição dos Raios x ta z voxel tb y amostra t=min(x,y,z) Iluminação de um voxel ˆ C Camb Cluz kdif nˆ L N Gel A Gel B L N V (X ) Estimativa do vetor normal f x, y, z N f x, y, z f xi 1 , y j , zk f xi 1 , y j , zk / 2x , f xi , y j , zk f xi , y j 1 , zk f xi , y j 1 , zk / 2y , f x , y , z f x , y , z / 2 z , i j k 1 i j k 1 1a ordem 2a ordem Influência de um Voxel r=0 g=0 b=0 r0 g0 b0 r1 g1 b1 a0 a1 a0 r = a 0 r0 g = a0 g0 b = a0 b0 a a0 r = a0 r0+1a0 a1 r1 g = a0 g0+1a0 a1 g1 b = a0 b0+1a0 a1 b1 a a0 +1a0 a1 Composição no raio a out a in (1 a in )a C out C (1 a )a C in in ray Cin C C out a out Cout Interpolação x,i (xa, ya, za) x i a Dx y j a Dy za k Dz z,k y,j xa % Dx x Dx ya % Dy y Dy za % Dz z Dz Interpolação no voxel v( x, y, z ) 1 x 1 y 1 z vi , j ,k vi +1,j,k +1 vi,j,k +1 vi+1,j+1,k+1 vi,j +1,k +1 vi+1,j,k y x vi,j,k v z vi+1,j+1,k vi,j+1,k x 1 y 1 z vi1, j ,k 1 x y 1 z vi, j 1,k x y 1 z vi1, j 1,k 1 x 1 y z vi, j ,k 1 x 1 y z vi1, j ,k 1 1 x y z vi, j 1,k 1 x y z vi1, j 1,k 1 Etapa de Composição • Para cada raio: gera amostras de cor C (pi) e opacidades a(pi) • reamostragem dos dados dos voxels, em k amostras igualmente espaçadas • Processo de acumulação I= t Ib +(1-t)I0 I0 = cor do objeto Ib = cor do fundo I = cor resultante t = coeficiente de transparência ezy= (y)z +(-z)y +cyz Tripod z exy exz ezy y exy= (y)x + (-x)y +cxy (x0+x,y0 +y,z0 +z) (x0,y0,z0) x exz= (z)x + (-x)z +cxz + + - - + - Valor inicial e incremento (1/2,1/2,1/2) x++ exy= (y)x + (-x)y +cxy (y-x)/2 y exz= (z)x + (-x)z +cxz (z-x)/2 z ezy= (y)z +(-z)y +cyz (y-z)/2 y++ z++ x x z y Caminhamento discreto Bresenham Cohen Efeito da amostragem Bresenham Tripod Partição celular Volume de dados Voxel Partição uma amostra no meio da partição marcador da partição Partição na grade nx (ib ia ) 1 z n y ( jb ja ) 1 (ia ,ja ,0) nz (kb ka ) 1 tzi= ta tyi t x (t xf t xi ) nx t y (t yf t yi ) n y tyf=tb tzf (ib ,Ny ,kb) t z (t zf t zi ) nz y Partição celular: algoritmo Dados: txi,tyi,tzi, txf,tyf,tzf, nx,ny,nz dtx = txf/nx; dty = tyf/ny; dtz = tzf/nz; tx=txi; ty=tyi; tz=tzi; t1 = min(tx,ty,tz) e w é o eixo do mínimo n=nx+ny+nz; while ( n > 0 ) tw += dtw; n--; t2 = min(tx,ty,tz) e w é o eixo do mínimo Sample ((t1+t2)/2); t1=t2; Otimizações • Velocidade – Refinamento progressivo – Terminação adaptativa do raio – Estruturas Hieráquicas • Qualidade da imagem – aumento do número de amostra no raio – lançamento de mais raios – melhora esquema de interpolação Refinamento Progresivo amostragem inicial primeira subdivisão segunda subdivisão subdivisão final pixels sendo visitados pixels já visitados Refinamento Progressivo: Exemplo 2x2 4x4 8x8 16x16 32x32 64x64 128x128 256x256