Pontifícia Universidade Católica do Rio de Janeiro PUC-RJ Fundamentos da Computação Gráfica Prof. Marcelo Gattass Aluno: Bruno Rodrigues Froz Terceiro Trabalho Ray Tracing Rio de Janeiro 2014
Sumário 1. INTRODUÇÃO... 3 2. PERCEPÇÃO DA IMAGEM E DA COR... 4 1. Imagem... 4 2. Cor... 5 3. RAY TRACING... 6 3.1. Sombra... 7 3.2. Luz... 8 3.2.1 Luz Ambiente... 8 3.2.2 Difusa... 9 3.2.3 Luz Especular... 10 3.2.4 Modelo de Iluminação de Phong... 10 3.2.5 Reflexão... 11 3.3. Objetos... 12 3.4.1 Esfera... 12 3.4.2 Triângulo... 14 4. ESTUDO DE CASO... 16 4.1. O primeiro raio... 16 4.2. Iluminação ambiente... 17 4.3. Iluminação difusa... 17 4.4. Iluminação Especular... 18 4.5. Modelo de Phong... 18 4.6. Triângulos... 19 4.7. Cenário... 20 4.8. Sombra... 20 4.9. Reflexão... 21 4.10. Cena completa... 22 4.11. Profundidade... 23 CONCLUSÃO... 25
1. INTRODUÇÃO O avanço da tecnologia e da ciência ao longo dos anos foi em grande parte responsabilidade da evolução da Ciência da Computação. Um dos motivos disso é a necessidade humana de reduzir o esforço de suas ações o máximo possível, automatizando processos do dia-a-dia. Uma forma de automatizar é prevendo o que acontecerá em uma situação antes que ela aconteça. Uma das áreas da Ciência da Computação que auxilia no desenvolvimento de formas de simulação e predição de situações reais em um espaço simulado é a Computação Gráfica. Além dessa função, a Computação Gráfica é bastante difundida no mundo do entretenimento, como em filmes e em jogos. A Computação Gráfica nada mais é do que uma forma de representar e estudar a geração de imagens a partir de dados. A geração das imagens e possivelmente, de cenas contendo-as é um dos problemas mais explorados da Ciência da Computação. Diversas técnicas de criação de imagens em ambientes 2D e 3D foram desenvolvidos, porém, ainda não há uma técnica perfeitamente genérica. A representação de uma imagem que corresponda a um ambiente 3D pode ser feita de diversas formas. Uma das técnicas de geração de imagens é o Ray Tracing. O Ray Tracing é um algoritmo que simula o caminho inverso da chegada da luz refletida dos objetos até os olhos do observador, gerando uma imagem 2D do objeto e do ambiente ao redor. A grande desvantagem desta técnica é sua performance. Porém principal vantagem do Ray Tracing é que ele pode gerar imagens com características muito realistas. A independência de cada raio lançado para gerar a imagem também é uma vantagem, por que facilita na paralelização do algoritmo, para melhora de performance. O objetivo deste trabalho é desenvolver um Ray Tracing simples, que mostre a geração das imagens e alguns efeitos básicos do algoritmo. O trabalho é dividido em 4 Seções. A primeira explica sucintamente a formação das imagens e das cores. A segunda mostra todo o conhecimento necessário para construir um Ray Tracing bem simples. A terceira Seção mostra o Ray Tracing básico construído e alguns objetos e cenas para exemplificar. Por fim, uma conclusão sobre o trabalho e alguns pontos que foram descobertos ao longo do desenvolvimento.
2. PERCEPÇÃO DA IMAGEM E DA COR Para entender como funciona o Ray Tracing, é necessário entender como é gerada uma imagem no ambiente real. 1. Imagem Ibn al-haytham (c. 965-1039) foi o primeiro a perceber que nós enxergamos os objetos. Ele observou que através de partículas que viajam do sol até os objetos, refletem nos objetos e chegam aos nossos olhos, nos permitindo vê-los. A Figura 1 mostra como seria esse modelo. Figura 1 Modelo de Haytham para a geração de imagens Sabemos atualmente que essas partículas se chamam Fótons []. O modelo de Haytham não está errado, porém, não é tão simples assim. Na verdade, vários fótons atingem o mesmo objeto e os mesmos pontos, e grupos vão ser refletido direções diferentes. A
probabilidade de um deles alcançar os olhos humanos é alta somente por que estão em uma quantidade bem grande, no mundo real. A Figura 2 mostra como a situação real acontece. Figura 2 Fótons atingindo a superfície do objeto. Além desse comportamento dos fótons, dependendo do material do objeto, eles podem ter três comportamentos distintos: O fóton pode ser transmitido, refratado ou refletido. 2. Cor A cor do objeto depende basicamente do material do objeto e da cor da fonte de luz transmitida. Quando um fóton de luz atinge a superfície do objeto, ele pode ser absorvido ou refletido pelo material. A combinação desses fótons refletidos e alcançando o olho humano que será a cor do ponto do objeto. Exemplificando, uma fonte de luz branca iluminando um objeto vermelho. Os fótons de cores vermelhas serão refletidos e os demais absorvidos pelo objeto. Os fótons vermelhos alcançarão os o observador, e o objeto será percebido pela cor vermelha.
Com essas informações, concluímos que se não há luz em um ambiente, não enxergamos. Assim como se não há objetos no ambiente, não enxergamos a luz. 3. RAY TRACING O Ray Tracing é um algoritmo de renderização de objetos 3D descritos, representados em um plano 2D. A ideia por trás dessa técnica é simular a trajetória contrária dos raios de luz, enviando um raio na direção do objeto e descobrindo a direção da luz incidente logo em seguida. A Figura 3 mostra a trajetória do raio lançado pelo observador. Figura 3 Demonstração do caminho oposto do raio de luz. De forma bem sucinta, a principal vantagem dessa técnica é que não é necessário calcular todas as direções do raio de luz para poder demonstrar os objetos, somente uma quantidade limitada por um plano 2D e um ponto de origem. A Figura 4 mostra os principais componentes desse algoritmo.
Figura 4 Ray Tracing detalhado. Um ponto de origem define o raio de origem (Ray Origin). Desse ponto, é definido um escopo de câmera (Virtual Camera), que limita o campo de visão do ponto de origem a um tamanho específico. Cada unidade desse tamanho será representada por um pixel de uma imagem. Tendo o campo de visão e o ponto de origem, um raio é atirado (Primary Ray), até interceptar um objeto. Ao intercepta-lo, o segundo raio é traçado a partir do ponto interceptado e com direção à fonte de luz (Secundary Ray). Caso não haja nenhum obstáculo entre o ponto interceptado e a luz, as características do objeto são representadas na imagem. Alguns elementos são necessários para adicionar realismo nos objetos, para representar o mundo real de forma mais efetiva. Alguns desses elementos são a iluminação global (fonte de luz), iluminação ambiente, difusa, especular, reflexão, refração e outros. 3.1. Sombra Onde há luz, há sombra, no mundo real. De forma semelhante, as sombras das cenas devem ser representadas no ambiente 3D. Uma forma de fazer isso no ray tracing é utilizar um segundo raio, chamado de raio de sombra (Shadow Ray), ou raio secundário (Secundary Ray), que traça a trajetória do ponto que houve interseção com um objeto até a fonte de luz. Caso haja uma interseção com outro objeto nessa trajetória, ali há sombra. A Figura 5 ilustra essa situação.
Figura 5 Shadow Ray. 3.2. Luz Como discutido na Seção 2, quando não há luz, não enxergamos a cena. A luz é a componente principal para mostrar um objeto em uma cena e definir todos os outros elementos de um ambiente 3D. A luz pode ser tratada em uma cena como um objeto, sendo definida então uma posição no espaço. Assim como pode ser tratada como um elemento abstrato, ou a combinação dos dois. A luz influencia também na cor dos objetos. Uma luz de cor branca é responsável apenas por mostrar as características descritas de um objeto. Porém, se a cor da luz for diferente, o objeto será mostrado com uma cor diferente. Há formas abstratas de luz ou seja, que influenciam na cena, mesmo não sendo um objeto explícito - em uma cena. Três formas abstratas são a luz ambiente, difusa e especular. 3.2.1 Luz Ambiente A luz ambiente é uma forma de compensar a falta de iluminação em certas partes da cena. Assim, um os objetos sempre serão visíveis, mesmo não havendo incidência direta de luz nele. É o modelo mais simples de calcular luz indireta. A luz ambiente é calculada através da Equação 1.
I A = I a K a (Equação 1) Onde I A é a luz ambiente incidida no objeto I a é a intensidade de luz ambiente, uma constante que influencia em todos os objetos da cena e é definida pelo usuário. O termo K a é o coeficiente de reflexão ambiente do objeto, que abrange um valor entre 0 e 1 e corresponde ao material do objeto. 3.2.2 Difusa A iluminação difusa coloca em prática um efeito que ilumina com mais intensidade as partes de um objeto que estão mais próximas em outras palavras, mais visíveis da fonte de luz. De forma mais algébrica, os pontos da superfície do objeto em que seus vetores Normal têm os menores ângulos com o vetor da direção da luz, ou seja, perto de 0º, são mais iluminados, e os que tem os maiores ângulos são menos iluminados, ou não iluminados (próximo de 90º). A Figura 6 demonstra a teoria da difusa. Figura 6 Teoria da iluminação difusa. No Case 1, o ângulo entre a normal e o raio incidente é grande, havendo menos iluminação. No Case 2, há mais iluminação que no Case 1, por que o ângulo foi diminuído. No Case 3, a iluminação é quase perfeita, e mais evidente do que nos outros Cases. A iluminação difusa é calculada através da Equação 2. I D = I L K d cos(θ) = I L K d N. L (Equação 2) Onde I D é a Iluminação Difusa, I L é a iluminação da fonte de luz, K d é a constante de reflexão difusa, um número entre 0 e 1 e que depende do material do objeto. Note que o cos(θ), onde θ é o ângulo entre a normal e o raio de luz, pode ser representado pelo produto escalar entre a Normal N e o raio de luz L. Se o produto escalar der um valor negativo, a fonte de luz está atrás do ponto que está sendo analisado, então o valor usado na equação deve ser 0.
3.2.3 Luz Especular A iluminação especular representa a reflexão da luz no objeto difuso. Esse efeito é observado no mundo real em objetos com material liso, que refletem em parte a luz incidida sobre ele nos pontos onde a direção da luz é mais próxima da normal. A Figura 7 mostra os vetores desse modelo de reflexão de luz. Figura 7 Vetores da iluminação especular. L é o raio da fonte de luz, R é o raio refletido. V é o raio traçado pelo observador, onde α é o ângulo entre V e o raio refletido. N é a normal. Na prática, a especular mostra a direção da luz incidida sobre o objeto na própria superfície do objeto. A Equação 3 mostra como calcular essa iluminação especular. I S = I L K s cos(α) n (Equação 3) Onde I S é a iluminação especular, K s é a constante de reflexão especular, um número entre 0 e 1 que depende do material do objeto e cos(α) n é o cosseno do ângulo entre o raio traçado pelo observador e o raio refletido elevado por uma variável chamada Specular Power (em tradução livre, Poder Especular), que determina o tamanho do brilho especular. Essa variável é um valor que varia de 1 até valores muito grandes, e quanto maior, mais suave é o brilho da especular. 3.2.4 Modelo de Iluminação de Phong O modelo de iluminação de Phong é uma forma de representar os componentes citados acima e uni-los, de maneira a representar o objeto de forma mais realista.
De acordo com o modelo de Phong, a iluminação total é a soma da iluminação ambiente com a difusa e com a especular. A Equação 4 mostra como ela é calculada, juntando as Equações 1, 2 e 3. I T = I a K a + I L K d N. L + I L K s cos(α) n (Equação 4) Onde I T é a intensidade total. O modelo de Phong será mostrado em prática no estudo de casos, na Seção 4. 3.2.5 Reflexão Dependendo do material do objeto, ele pode ter uma característica peculiar: a reflexão. Um objeto pode refletir outros objetos ao que incidem nele. A forma de fazer é um complemento do algoritmo do Ray Tracing, sendo bastante importante e difundida. Para fazer a reflexão, quando o raio traçado pela câmera atinge um objeto que reflete, a partir do ponto que houve a interseção é traçado outro raio, um raio secundário é atirado em na direção do raio refletido até interceptar outro objeto. A cor do primeiro objeto (o objeto espelho) será a cor do segundo objeto encontrado. A Figura 8 mostra essa trajetória. Figura 8 Trajetória da reflexão. Através dessa explicação é possível perceber que o algoritmo do raio traçado é recursivo, pois se um objeto espelho encontrar outro objeto espelho nesse caminho, o algoritmo deve lançar mais um raio. O ponto de parada dessa recursão deve ser uma variável de controle extra, pois corre o risco da recursão ser infinita. Normalmente essa variável é chamada de Profundidade (Depth) e é escolhida pelo usuário. Quanto maior a profundidade, mais recursões serão utilizadas.
Parte do raio traçado, quando atinge um objeto, pode ter outro comportamento. Esse comportamento é conhecido como Refração, e é um complemento da reflexão, pois alguns objetos se comportam como refletores e refratores. Um exemplo clássico é a água. Para equilibrar a quantidade de reflexão e a quantidade e refração em um objeto, é utilizado uma variável oriunda da Equação de Fresnel. Nesse trabalho, a refração será suprimida e apenas citada por conveniência. A reflexão foi implementada, devida a sua simplicidade. 3.3. Objetos As características dos objetos são muito importantes para a visualização em uma cena. Cada objeto tem uma característica própria, sendo elas principalmente baseadas nas suas formas. Conhecer o objeto é de extrema importância, pois suas características de forma deverão ser bem formalizadas, para o cálculo da interseção. Neste trabalho foram implementadas duas formas de objetos: A esfera e o triângulo. Ambos são suficientes para criar uma cena bem simples e testar as propriedades do Ray Tracing. 3.4.1 Esfera A esfera é considerada a forma mais simples de objetos na cena 3D, pois o cálculo de sua intercepção é bem simples, computacionalmente falando. Há duas formas simples de calcular a interseção de um Ray Tracing com uma esfera. Uma solução geométrica e uma solução analítica. Por ser mais simples e mais efetivo computacionalmente, a forma geométrica será descrita. A Figura 9 mostra os componentes algébricos de um raio incidindo em uma esfera.
Figura 9 Raio passando por dois pontos de uma esfera. Um raio disparado pelo Ray Tracing pode ser representado pela Equação 5. o + tr (Equação 5) Onde o é o ponto de origem, r é o vetor de direção do raio e t é um parâmetro de distância, onde variando ele, percorremos por qualquer ponto do raio. Em outras palavras, podemos encontrar o ponto P e o P utilizando a Equação 6. P = o + t 0 r P = o + t 1 r (Equação 6) Onde t0 e t1 são as distâncias da origem o aos pontos que o raio passa pela esfera. Utilizando a Figura 9 como base, sabemos os valores de L e de r, sendo a distância da origem ao centro do objeto e a direção do raio, respectivamente. Podemos descobrir o valor de tca através do produto escalar entre L e r, de acordo com a Equação 7. t ca = L. r (Equação 7) Sabemos que esse produto escalar representa duas situações: Ele é o valor da projeção de L no raio traçado e se ele for negativo, ambos estão apontando para direções diferentes.
Se esse valor for negativo, não nos interessa, pois há interseção somente atrás da câmera, logo, descartamos. Utilizando o Teorema de Pitágoras, podemos descobrir o valor de d, como na Equação 8. d 2 = t 2 ca + L 2 (Equação 8) Desenvolvendo essa equação, podemos analisar o valor de d. Se ele for menor que 0 ou se d é maior que o raio da esfera, o raio traçado erra a esfera, não havendo interseção. Tendo o valor de d, temos todos os valores necessários para calcular thc. A Equação 9 mostra que é possível utilizar o teorema de Pitágoras novamente para descobrir esse valor e, consequentemente, os valores de t0 e t1.. d 2 + t 2 hc = radius 2 t hc = radius 2 d 2 (Equação 9) t 0 = t ca t hc t 1 = t ca + t hc 3.4.2 Triângulo O triângulo possivelmente é o objeto mais importante a ser renderizado. Ele é a base de todos os polígonos, que são divididos em triângulos para terem uma forma no Ray Tracing. Os triângulos são formas muito simples, definidos por 3 pontos (vértices) e um plano formado entre os três. Há várias formas de calcular a interseção do Ray Tracing com os triângulos. A forma utilizada nesse trabalho foi o algoritmo de Moller-Trumbore. O algoritmo de Moller-Trumbore é considerado uma das técnicas mais rápidas de se calcular a interseção com triângulos. Uma explicação sucinta da técnica será feita abaixo. Podemos calcular um ponto dentro de um triângulo através da Equação 10. P = wa + ub + vc (Equação 10) Onde P é o ponto, A, B e C são os vértices do triângulo e w, u e v são oriundas da forma parametrizada da equação e são constantes que representam as distâncias dos vértices aos pontos dentro do triângulo. A soma desses três últimos termos é igual a 1. Sabendo que w pode ser representado por (1-u-w) e utilizando a Equação 5, do ponto na reta formada pelo raio traçado, podemos obter a Equação 11.
o A = td + u(b A) + v(c A) (Equação 11) Essa Equação 11 pode ser representada como uma operação de matrizes. Por conveniência e para visar a simplicidade, essas operações serão omitidas nesse trabalho. A Figura 10 mostra algumas informações algébricas que podemos extrair dessa mudança de representação de bases. Figura 10 Dependendo da direção do raio, o determinante da forma matricial do triângulo muda é positivo ou negativo. Os vértices do triângulo podem representar vetores. Dependendo dos vetores formados ou seja, dos vértices utilizados, da ordem que foram utilizados e das direções encontradas o vetor Normal do triângulo muda de direção. A regra da mão direita e da mão esquerda são apropriadas para descobrir para qual direção o vetor será calculado e depende do sistema de coordenadas do sistema. As variáveis u e v são calculadas através da Equação 12.
u = u = (0 v0).(ray X (v2 v0)) det (ray. (o v0 X (v1 v0))) det ) (Equação 12) ) Onde v0, v1 e v2 são vértices do triângulo, o é a origem do raio traçado, ray é a direção do raio traçado e det é o determinante obtido na Equação 11. 4. ESTUDO DE CASO Para testar a teoria do Ray Tracing o algoritmo foi implementado. Os escopos dos códigos serão omitidos nesse trabalho. Porém, um passo a passo do algoritmo será mostrado através dos resultados alcançados. Nos passos a seguir, serão utilizados somente duas formas geométricas, a esfera e o triângulo. A imagem será definida com o tamanho de 800x600, e o campo de visão da câmera foi definido com o valor 50. A câmera está posicionada na posição (0,0,25) e os objetos descritos dentro ou fora do campo de visão. O exemplo a seguir contém somente uma fonte de luz. 4.1. O primeiro raio O primeiro passo do algoritmo é descrever o primeiro raio. A regra é simples: o raio traçado encontrou um objeto, o valor da cor da sua superfície é pintado na imagem. A Figura 11 mostra o primeiro resultado para uma esfera posicionada na origem (0,0,0). Figura 11 Resultado dos primeiros raios traçados.
4.2. Iluminação ambiente Após encontrar o objeto, a iluminação ambiente foi isolada em um componente. O Resultado está na Figura 12. A iluminação, utilizando a equação para seu cálculo, representa 20% da iluminação original do objeto, valor alcançado por livre arbítrio. Figura 12 Iluminação Ambiente 4.3. Iluminação difusa Semelhante à iluminação ambiente, o componente da iluminação difusa foi isolado e a Figura 13 mostra o resultado para o mesmo objeto utilizado. Figura 13 Iluminação Difusa.
4.4. Iluminação Especular O componente da iluminação especular foi separado e a Figura 14 mostra o resultado. 4.5. Modelo de Phong Figura 14 Iluminação Especular. Utilizando o modelo de iluminação de Phong, os 3 componentes previamente calculados são somados formando uma nova imagem, como mostrado na Figura 15. Figura 15 Modelo de Phong para o objeto estudado.
4.6. Triângulos Assim como as esferas, alguns triângulos foram testados na cena. Como os triângulos são a base para qualquer polígono existente, podemos fazer praticamente qualquer forma de polígono não circular existente. A Figura 16 mostra um triângulo renderizado na cena. Figura 16 Triângulo construído. Assim, podemos criar novas formas. A Figura 17 mostra um plano formado por dois triângulos e será utilizada na cena. Figura 17 Dois triângulos coplanares.
4.7. Cenário Utilizando os triângulos, um cenário foi construído e colocado no ambiente. A Figura 18 mostra esse cenário com os triângulos. Figura 18 Cenário construído. Por escolha, o fundo da imagem é da cor branca. 4.8. Sombra Outro componente importante a ser colocado em uma cena é a sombra. A Figura 19 mostra a sombra formada no cenário. Nesse caso, a sombra tem uma compensação de iluminação global, como discutido na Seção 3.
Figura 19 Objeto e sombra calculados na cena. 4.9. Reflexão Objetos com reflexão são a base principal da ideia por trás da recursão do Ray Tracing, então esses objetos devem ser demonstrados na cena. A Figura 20 mostra um objeto reflexivo na cena construída. Figura 20 Objeto com reflexão adicionado na cena.
Além da reflexão na esfera, os triângulos também podem conter essa propriedade. Na Figura 21 é mostrado a reflexão nos triângulos que representam uma das paredes na cena. Figura 21 Parede refletindo. 4.10. Cena completa A cena finalmente é construída com vários objetos. Ela é demonstrada na Figura 22. Figura 22 Cena completa. Objetos colocados na frente e atrás da câmera.
4.11. Profundidade Um ponto importante a discutir a partir desse momento são os efeitos da recursão da reflexão. Como discutido na Seção 3, quanto maior a variável de controle da profundidade da recursão, mais reflexos serão vistos na cena, enquanto elas existirem. A importância desse atributo no Ray Tracing é o fato de que quanto maior o valor, também é maior o custo computacional. Logo, é necessário conhecer a cena para escolher um bom valor para essa profundidade, de forma que não prejudique nem a performance e nem a aparência da cena. A Figura 23 mostra outra cena desenvolvida, onde outro objeto formado por triângulos e colocado em um ambiente com vários espelhos e com a profundidade com o valor 1 ou seja, somente uma recursão. A Figura 24 e 25 são semelhantes, mas com os valores de profundidade sendo 2 e 5, respectivamente. Figura 23 Ray Tracing com o valor 1 na profundidade.
Figura 24 Ray Tracing com o valor 2 na profundidade. Figura 25 Ray Tracing com o valor 5 na profundidade.
CONCLUSÃO O Ray Tracing é um algoritmo bastante explorado e difundido na Computação Gráfica. Ele contém componentes que podem representar um mundo 3D com muita fidelidade com a realidade. Apesar de ser sua maior vantagem, o ponto fraco desta técnica consiste na complexidade computacional: ele ainda é um algoritmo que requer muito processamento para ser executado em tempo real. Este trabalho explicou com detalhes as técnicas básicas que compõe o Ray Tracing, e foi desenvolvido um programa para executar um algoritmo bem simples. Apesar da sua fraqueza em relação à performance (dependendo da cena, o programa demorava de 5 à 14 segundos para renderizar a cena), sua implementação é bem fácil de ser reproduzida. Os programadores de Computação Gráfica almejam executar esse algoritmo com os componentes necessários para representar o maior realismo possível e em tempo real. Esse objetivo ainda está engatinhando, mas a otimização do algoritmo e incremento do poder computacional no futuro podem permitir isso.