PSI5789 - Conceitos Avançados de Síntese de Imagens Marcio Lobo Netto Ray Tracing Técnica e Implementação Alice Shimada Bacic 3o período de 2002 Introdução Computação gráfica: Grande diversidade de aplicações Demanda por imagens realistas Complexidade do mundo real Abstrações do mundo real Modelos limitados Objetivo da sínteze de imagens: produção de imagens que não possam ser distinguidas de uma fotografia Abordagens Na tentativa de alcançar o realismo desejado utiliza-se conceitos de física e óptica; Iluminação global: Uma vista de uma cena é dada pelo processamento da luz refletida por um ponto considerando toda a iluminação que chega a este ponto; Iluminação direta + indireta Algoritmos Os algoritmos mais populares para iluminação global são: Radiosity: trabalha com a interação difusa; Ray tracing: trabalha com a interação especular ; Ambos algoritmos simulam parte da interação global da iluminação; Ray Tracing -Propósito Gerar imagens 3D realistas em uma tela 2D de computado: Simulação do comportamento físico dos raios de luz em um ambiente 3D. Calculo das cores de cada pixel de imagem considerando a interseção dos raios com os objetos da cena; Reflexão dos raios recursivamente. Ray tracing – Histórico A técnica foi inicialmente desenvolvida por Appel (1968), Goldstain (1968) e Nagel (1971); Appel: usou uma grade (grid) de raios para determinar o preenchimento (shading) dos objetos de uma cena e calcular quando um ponto estaria dentro de uma sobra Nagel e Goldstain: inicialmente criaram um algoritmo em balística para simular a trajetória de projéteis e para calcular a trajetória de partículas nucleares. Mais tarde aplicaram o algoritmo criado em computação gráfica Ray tracing – Histórico (continuação) Whitted e Kay estenderam a técnica inicial para simular a refração e a reflexão especular. O algoritmo proposto por Whitted é um algoritmo de iluminação global parcial, que combina: a remoção de superfícies escondidas; o preenchimento produzido pela iluminação direta; a reflexão de objetos entre si e a refração da luz através de objetos transparentes; a computação de sombras bem definidas Ray tracing – Visão geral Considera que uma fonte de luz emite photons que colidem com objetos repetidamente: Parte da energia é absorvida e parte refletida pelo objeto; Ao contrário do mundo real, a abstração do algoritmo considera que os raios de luz partem do observador e são refletidos repetidamente gerando o preenchimento final do objetos processados na cena; O termo ray tracing recursivo é geralmente usado para referenciar o processo do algoritmo que considera a cadeia de reflexões dentro da cena Ray Tracing - Cenário Observador (eye): ponto no espaço onde o ray tracing observa a cena através da viewplane; Viewplane: janela retangular onde é projetada a cena. Cada ponto da janela corresponde a um pixel da tela do computador; Modelo (model): uma coleção de objetos 3D; Fonte de luz (light source): fonte de iluminação, que irradia luz uniformemente em todas as direções; Cena (scene): o conjunto do modelo mais a fonte de luz formam uma cena Ray Tracing – Cenário (ilustração) Ray Tracing – Premissas Os raios de luz viajam em linha reta Raios de luz não causam interferência entre si caso se cruzem. Raios de luz partem da fonte de iluminação para os olhos, porém pelo princípio da reciprocidade (The Principle of Reciprocity), podemos assumir que o inverso produz o mesmo resultado para efeitos de calculo Ray Tracing – Reflexão e transmissão Reflexão Transmissão A reflexão: é o fenômeno físico onde a luz atinge uma superfície e é refletida. A transmissão ocorre quando a luz atinge uma superfície transparente ou translúcida e passa através da superfície. A reflexão ou transmissão da luz podem ser especular o difusas. Ray Tracing – Reflexão e transmissão Especular Difusa Quando a propagação da luz após atingir o objeto é perfeita, isto é, a luz é refletida ou transmitida em apenas uma direção com toda a intensidade inicial temos a reflexão ou transmissão especular. Quando a luz abandona o objeto em todas as direções com intensidade igual, temos a reflexão ou transmissão difusas. Ray Tracing – Tipos de algoritmo Forward ray tracing: as partículas de luz (photons) são seguidas desde a fonte de luz até o objeto; Desperdício, pois nem todo raio de luz que partiu de uma fonte deverá alcançar o observador; Ineficiente, pois gasta-se processamento com raios de luz não aproveitados. Ray Tracing – Tipos de algoritmo Backward ray tracing: Foi desenvolvido para melhorar o desempenho da técnica; Neste caso um raio de luz é criado no observador e sua trajetória é traçada passando pelo viewplane até o primeiro objeto da cena alcançado; A trajetória do raio é calculada através de recursivas reflexões; Ray Tracing – Tipos de algoritmo Backward forward Ray Tracing – Modelo OO Ray Tracing – Modelo OO Visualização dos componentes da técnica; Interação entre componentes; Objetivo: Extensibilidade; Opção por tipo de algoritmo; Definir a estrutura de dados e a interação entre os componentes da técnica; Ray Tracing – Algoritmo de Whitted Fatores trabalhados pelo algoritmo: As superfícies escondidas; O preenchimento devido à iluminação direta; A reflexão e a refração; As sobras desde que bem definidas, isto é, geométricas e com bordas bem definidas Ray Tracing – Algoritmo de Whitted Raios de luz são traçados através da cena: interseção com os objetos: testar a interseção de cada raio com cada objeto da cena; Cada interseção entre raio e objeto gera dois novos raios, um refletido e outro transmitido; interações especulares; Ray Tracing – Algoritmo de Whitted Ao traçarmos raios recursivamente, devemos adotar critérios de parada: A recursividade sempre termina quando o raio intercepta uma superfície difusa; Ou quando um número pré-determinado de níveis de recursão é atingido; Ou quando a energia de um raio se torna menor que um determinado valor. Ray Tracing – Algoritmo de Whitted Componentes da luz: Para cada ponto P de um objeto atingido por um raio: dois novos raios, um refletido e outro transmitido. A intensidade de P: Componente local; Contribuição global do raio refletido; Contribuição global do raio refratado seguido. Sombras: Se um raio refletido atinge um segundo objeto o ponto que gerou o raio está na sombra; Remoção de superfícies escondidas: Lista de raios gerados com a respectivas distâncias entre ponto e observador; Ray Tracing – Algoritmo de Whitted Equação da iluminação: I(P) = Ilocal(P) + Iglobal(P) = Ilocal(P) + Krg * I(Pr) + Ktg * I(Pt) Onde: P: ponto atingido; Pr: Ponto atingido através do traçado de um raio refletido; Pt: Ponto atingido através do traçado de um raio transmitido; Krg: Coeficiente global de reflexão; Ktg: Coeficiente global de transmissão. Ray Tracing – Algoritmo de Whitted Corpo básico: Recursão; Um raio é particionado em dois • um raio refletido • outro transmitido Duas chamadas a si raio particionado. mesmo, uma para cada Ray Tracing – Algoritmo de Whitted Informação contida em um raio: Origem do raio; Direção; Ponto de interseção; Cor atual no ponto de interseção; Atenuação atual; Distância do ponto de interseção à origem do raio; O índice de refração que o raio possui atualmente; A nível de traçado atual; O número atual de objetos a que o raio é interno; Ray Tracing – Algoritmo de Whitted // a notação usada considera o uso de uma linguagem orientada a objetos ShotRay(ray) { object := objectCollection.getCurrentObject(); if (ray.intersepts (object)) { ray.getNormalAtInterseptionPoint(object); iLocal := ray.calculateIntensity(object); ray.decrementTraceDepth(); if (ray.getTraceDepth() > 0) { // Calcula e traça o raio refletido if (ray.isReflected(object)) { rayr := ray.evalReflection(object); rayr.setOrigin(ray.getIntersectionPoint(object); // Multiplica o valor de Krg pelo valor // da chamada anterior rayr.attenuate(Krg); rayCollection.add(rayr); ShotRay(rayr); } if (rayr.interseptsAnObject(objectCollection)) { // Considera o Krg I e o Ilocal rayr.combineColours(); } Ray Tracing – Algoritmo de Whitted // Calcula e traça o raio refratado if (object.isRefracting()) { if (ray.isEntering(object)) { ray.acumulateRefrativeIndex(); // Incrementa o número de objetos em que // o raio se encontra ray.incrementObjectNumber(); rayt := ray.evalRefraction(object); refractedRayCollection.add(rayr); } Ray Tracing – Algoritmo de Whitted else { ray.deacumulateRefrativeIndex(); // Decrementa o número de objetos em que // o raio se encontra ray.decrementObjectNumber(); rayt := ray.evalRefraction(object); refractedRayCollection.add(rayr); } rayt.setOrigin(ray.getIntersectionPoint(object); rayr.attenuate(Ktg); if (rayt.interseptsAnObject(objectCollection)) { // Considera o Ktg I e o Ilocal rayt.combineColours(); } } } } } Ray Tracing – Algoritmo de Whitted Complexidade do Algoritmo e Desempenho: qr = 2 * 2 (n-1), onde qr é a quantidade de raios gerados e n o número de iterações desejado. Simplificando a expressão: qr = 2n qc = 4 * 2(n-1), onde qr é a quantidade de chamadas recursivas geradas e n o número de iterações do raio. Simplificando a expressão: qc = 22 * 2(n-1) = 2(n - 1 + 2) = 2(n+1) O desempenho do algoritmos cai em progressão geométrica Depende do número de iterações que configuradas. Conclusão O ray tracing é uma boa opção quando se deseja gerar imagens que computem a iluminação global obtendo-se efeitos como reflexão, transparência e sombras bem definidas, porém o algoritmo apresenta um custo computacional alto. Adaptações ao algoritmo, mais a constante evolução do hardware são fatores que atenuam o custo computacional da técnica maior expansão do uso do algoritmo. Ao optarmos pela técnica em questão, devemos considerar o resultado final esperado e o custo para determinar se a solução é adequada. Bibliografia [1] “Introduction to Computer Graphics”; James D. Foley; Andries van Dan; Steven K. Feiner; John F. Hughes; Richard L. Phillips; Addison-Wesley Publishing Company; May 1997. [2] “3D Computer Graphics”; Alan Watt; Addison-Wesley; 3o edition; 2000. [3] “Design and Implementation of an Interactive Ray Tracer”; Maria E. Jump; University of Maryland; September 1998; http://www.cs.umd.edu/~mount/Indep/MJump/report.html. [4] ”1997 Sophomore College Ray Tracing Site”; Charity Lu; Alex Roetter; Amy Schultz; http://cse.stanford.edu/class/sophomorecollege/projects-97/ray-tracing/index.html. [5] “Pratical Ray Tracing in C”; Craig A. Lindley; Wiley; 1992.