UFPE - Centro de Informática

Computação Gráfica

Exercício ExtraClasse - RayCife+

1. Introdução

Este trabalho introduz os conceitos de Iluminação Global em Computação Gráfica. A idéia principal do trabalho é implementar o algoritmo de Path Tracing (PT). Path Tracing, introduzido por Kajiya em 1986 [1], resolve alguns dos problemas encontrados no Traçado de Raios, particularmente a técnica consegue calcular melhor a parcela de iluminação difusa que está ausente do Traçado de Raios tradicional. Uma outra introdução ao PT pode ser encontrada no livro do Henrik W. Jensen [2]. Abaixo duas imagens sintetizadas com PT (não estranhe se o seu trabalho não conseguir gerar imagens com esta qualidade!). Outra observação: imagens com pouco ruído irão exigir um grande número de paths por pixel, logo não se espante com os tempos necessários para renderizar uma imagem com qualidade razoável. Se você quiser se aventurar na física e matemática por trás destes conceitos, confira o texto do Pat Hanrahan sobre path-tracing.pdf.


2. Exemplos de Resultados



Cornell Box com duas esferas. 3000 paths por pixel. 7.5 horas de processamento e modelo de um jaguar totalmente difuso com 140000 triângulos e uma fonte de luz em formato de semi-esfera. 100 paths por pixel. Resolução 1024x512. Tempo de rendering 20 min num Pentium III-500 (http://graphics.ucsd.edu/~henrik/images/global.html).


3. Especificação do trabalho

O objetivo deste trabalho é implementar a técnica de Iluminação Global conhecida como Path Tracing (PT). PT pode ser considerada uma extensão de Ray Tracing. Se você precisa se lembrar de Ray Tracing, pode consultar a especificação do trabalho Raycife.


As principais diferenças são:


  1. Para cada pixel a técnica lança um número n de raios aleatórios que irão percorrer um caminho (path) no ambiente. As contribuições deste n raios constituem a cor do pixel;

  2. Os raios que percorrem o ambiente, após a intersecção com algum objeto, poderão ser do tipo reflexão especular, difusa ou transmissão, de acordo com as propriedades materiais do objeto. Isto significa que iremos amostrar também a contribuição de iluminação difusa em uma cena, melhorando o efeito global de iluminação;

  3. A cada intersecção lançamos igualmente um shadow ray (raio em direção à fonte de luz) que amostre aleatoriamente a área da fonte de luz distribuída (por exemplo um retângulo).


Você deverá implementar um sistema simples para síntese de imagens utilizando PT. O sistema, em termos gerais, deverá ser capaz de ler um arquivo representando uma cena no formato sdl, conforme explicado abaixo no item 8.  Você deverá implementar a leitura de objetos quaisquer especificados no formato obj e portanto o seu path tracer deverá ser capaz de calcular intersecções com polígonos quaisquer.


4. Formato arquivos de saída

Os arquivos de saída gerados podem estar em qualquer formato de imagem conhecido, mas sugerimos que você continue utilizando o formato pnm conforme especificado para o Raycife.


5. Modelo de Iluminação

Quando um raio intersecciona um objeto, como iremos determinar a cor do objeto naquela posição da cena? Suponha que a superfície do objeto tem uma cor RGB dada por (r,g,b) com 0.0 <= r,g,b <= 1.0. Primeiro assumimos que nosso objeto é iluminado por uma quantidade de luz ambiente Ia que é refletida pelo objeto de acordo com um coeficiente ka. A intensidade de luz ambiente refletida é independente do observador e é definida por:


Rambiente = Ia*kar

Gambiente = Ia*kag

Bambiente = Ia*kab


A seguir precisamos considerar as fontes de luz na cena. Para cada fonte de luz visível, a superfície do objeto retorna alguma fração de reflexão difusa. Esta fração depende de: a intensidade da fonte de luz Ip, o coeficiente de reflexão difuso kd e do cosseno do ângulo q entre a direção da luz (vetor L) e a normal à superfície no ponto sendo iluminado (vetor N) cfe figura.


Se assumirmos que ambos vetores L e N estão normalizados (módulo igual a 1), o cosseno do ângulo entre eles é igual ao produto escalar dos mesmos, logo cos q = L.N. A intensidade de luz difusa para uma fonte de luz qualquer é dada então por:


Rdifuso = Ip*kd(L.N)r

Gdifuso = Ip*kd(L.N)g

Bdifuso = Ip*kd(L.N)b


Finalmente iremos considerar reflexão especular. A intensidade de reflexão especular depende do ângulo a entre a direção de reflexão perfeita R e a direção do observador (veja a próxima figura) Utilizaremos o modelo de Phong para aproximar a reflexão especular. Neste modelo cada objeto possui um coeficiente de reflexão especular ks e um expoente de reflexão especular n. n determina o "tamanho" da reflexão especular. Valores maiores de n produzem highligths menores. Dados estes valores e a intensidade da fonte de luz Ip, a intensidade de reflexão especular é dada por:


Respecular = Ip*ks*(cos a)n

Gespecular = Ip*ks*(cos a)n

Bespecular = Ip*ks*(cos a)n


Note que, diferentemente das componentes ambiente e difusa, a reflexão especular no modelo de Phong não depende da cor do objeto. O reflexo especular será sempre da cor da fonte de luz. Se ambos R e V forem normalizados teremos cos a = R.V e as equações acima ficam:


Respecular = Ip*ks*(R.V)n

Gespecular = Ip*ks*(R.V)n

Bespecular = Ip*ks*(R.V)n


Vamos assumir que temos um número total variável l de fontes de luz na cena. Neste modelo simplificado, a cor do objeto num ponto P é simplesmente a soma das equações acima para o número l de fontes de luz.


6. Enviando raios secundários

A cada intersecção de um raio com um objeto, precisamos enviar um raio aleatório no ambiente. Para definir se este raio é difuso, especular ou transmitido utilizaremos as propriedades materiais do objeto como segue. Seja ktot = kd+ks+kt  e um número aleatório R entre (0,ktot). Se R < kd então dispara raio difuso, senão se R < kd+ks dispara raio especular, senão dispara raio transmitido. Para a direção do raio especular utilizar R=2N(NL) - L. Para estabelecermos uma direção aleatória (phi, theta) para o raio difuso, precisamos de 2 números aleatórios R1 e R2 no intervalo (0,1). Então teremos phi=cos-1 (sqrt(R1)) e theta = 2.pi.R2.


7. Shadow Rays

Para cada intersecção de um raio com um objeto precisamos enviar um shadow ray, ou seja, um raio em direção à fonte de luz. A idéia é que possamos utilizar fontes de luz distribuídas, como um retângulo por exemplo. Para isto o shadow ray deverá atingir uma posição aleatória dentro da área especificada para a fonte de luz.


8. Formato arquivos entrada – Scene Description Language (sdl)

A cena a ser sintetizada será especificada através de um arquivo texto com comandos para o sintetizador. Os comandos da SDL são descritos abaixo:


  1. #...comentário
    Qualquer linha iniciando com o caracter # é considerada uma linha de comentário. Todos os caracteres após o # até o próximo caracter de final de linha são desconsiderados

  2. output nomedearquivo
    Especifica o nome do arquivo de saída que será gerado

  3. eye x y z
    Especifica a posição (x,y,z) do observador virtual. Z deve ser maior do que 0

  4. ortho x0 y0 x1 y1
    Especifica a janela no universo. (x0,y0) especificam a posição do canto inferior esquerdo e (x1,y1) especificam a posição do canto superior direito. A janela está sempre no plano z=0

  5. size w h
    Especifica como dividir a janela nos pixels individuais. A janela do universo especificada pelo comando ortho deve ser dividida em w pixels de largura e h pixels de altura

  6. background r g b
    Especifica a cor de fundo, ou seja, a cor a ser utilizada para os pixels cujos raios não atingem nenhum objeto. Valores no intervalo [0,1]

  7. ambient Ia
    Especifica a intensidade da luz ambiente na cena. 0 <= Ia <= 1

  8. light luz.obj red green blue Ip
    Especifica uma fonte de luz com geometria especificada por um arquivo formato obj. A cor da fonte de luz é dada pelos valores de (red,green,blue) e a intensidade por Ip. Uma mesma cena pode ter várias fontes de luz

  9. npaths n
    Especifica o número de paths por pixel

  10. tonemapping tm
    Especifica o valor a ser utilizado no operador de Tone Mapping (ver detalhes nas dicas abaixo)

  11. seed s
    Especifica o valor da semente inteira dos números randômicos, para facilitar comparações

  12. objectquadric a b c d e f g h j k red green blue ka kd ks kt n
    Especifica uma superfície quádrica através dos coeficientes de a até k. A cor do objeto é especificada pelas componentes red, green, blue, valores no intervalo [0,1]. ka, kd, ks e n são os coeficientes de reflexão do objet. Maiores detalhes sobre as quádricas podem ser encontrados na página do
    Raycife.

  13. object camel.obj red green blue ka kd ks kt n
    Especifica um objeto do tipo obj (neste exemplo o arquivo camel.obj). A cor do objeto é especificada pelas componentes red, green, blue, valores no intervalo [0,1]. ka, kd, ks kt e n são os coeficientes de reflexão ambiente, difusa, especular e de transparência do objeto. n representa o expoente de reflexão especular. Uma mesma cena pode ter vários objetos.


9. Especificação do trabalho

Você deverá implementar o seguinte:


  1. I.Rotinas para ler e interpretar um conjunto de comandos da SDL conforme especificado no item 8 deste documento

  2. II.Rotinas que implementam o algoritmo de PT conforme especificado nos demais itens deste documento. Estes comandos serão lidos de um arquivo passado como parâmetro para o seu programa.

    Exemplo:
    raycife+ cornell.sdl 


10. Dicas

  1. Caso o raio interseccione exatamente a fonte de luz, não emita o raio secundário, encerre a emissão de paths para este pixel e faça a cor do pixel igual à cor da fonte de luz.

  2. Você precisará implementar um operador de Tone Mapping, para conseguir exibir os valores calculados, já que provavelmente eles não estarão no intervalo de valores que podem ser exibidos num display normal. Utilize o operador simples dado por Lo = L/L+tm, onde tm é um valor de controle deste operador que é lido no arquivo sdl. Nesta equação Lo é a intensidade que pode ser exibida (entre [0,1]) e L é a intensidade calculada.

  3. Para objetos transparentes, é necessário especificar um coeficiente de refração do objeto. Acrescente na sdl acima, nas entradas object e objectquadric um último valor referente ao índice de refração do objeto. Apenas como referência o índice de refração do ar pode ser aproximado por 1. Alguns índices interessantes: água a 20oC = 1.33, Gelo=1.31, vidro=1.5 e diamante=2.417.


11. Cornel Box

Uma cena famosa para o teste do programa é a conhecida Cornell Box, ilustrada ao lado. Os arquivos que descrevem esta cena estão aqui disponibilizados:


cornellroom.sdl

back.obj

ceiling.obj

cube1.obj

cube2.obj

floor.obj

leftwall.obj

luzcornell.obj

rightwall.obj


12. Referências


[1] Kajiya, James T. The Rendering Equation – Proceedings of SIGGRAPH 1986, p. 143-150

[2] Jensen, H.W. Realistic Image Synthesis Using Photon Mapping. AK Peters, 2001

 

IMPORTANTE: Abaixo estão as instruções para a implementação do trabalho extraclasse da disciplina. Todo o material deverá estar disponível numa página web do trabalho, a saber: um documento de até 2 páginas explicando o que foi feito, o código fonte executável do programa desenvolvido e no mínimo 3 imagens renderizadas com o programa com os respectivos arquivos sdl. Esta página web deverá estar pronta até às SEIS horas da manhã dia 30 de junho de 2009. Enviar por email ao professor (marcelo.walter at gmail.com), NO MESMO PRAZO, os arquivos fontes de seu programa e qualquer outro fonte necessário para compilar seu executável! A cada hora de atraso no envio do email, será descontado 1.0 (um) ponto do total da nota. Você pode enviar também arquivos script descrição de cena que você escreveu para testar seu programa. Explicitar no documento qualquer informação necessária para compilar corretamente seu programa. Este trabalho poderá ser feito em grupos de até 2 alunos.