ine 5341

Programa

OpenGL

Links

Bibliografia

Plano de Ensino

Trabalhos de
Alunos de
Semestres
Passados

Parte II - Computação Gráfica Avançada

Visualização Realística em 3D, z-Buffering e Raytracing

2.1. O que é Raytracing ?

2.2. Exemplos de Raytracing

2.3. Buffer de Profundidade - z-Buffering

2.4. Conversão de Varredura (Scan Conversion)

2.5. Modelando a Iluminação de um Objeto

2.6. Principais Raytracers

2.7. Tutorial de Raytracing usando POV-Ray

2.8. O Método da Radiosidade: Modelando Radiância e Interação Luminosa entre Objetos

2.9. Material Fotográfico para o Trabalho de Modelagem em POV-Ray


O que é Raytracing ?

Raytracing é a técnica de renderização de uma cena que calcula a imagem desta cena simulando a forma como os raios de luz percorrem o seu caminho no mundo real. Ela é utilizada nos mais variados ambientes e bibliotecas gráficas, inclusive em OpenGL. Para tornar o processamento factível, a técnica de Raytracing opera este processo de trás para frente. 

No mundo real, os raios de luz são emitidos a partir de uma fonte de luz, de acordo com as características desta fonte de luz, e iluminam os objetos da cena. A luz é então refletida por estes objetos pode ainda  passar através de objetos transparentes e semitransparentes.  Esta luz refletida então atinge os olhos do observador ou a lente de uma câmera. Como a esmagadora maioria dos raios de luz nunca atinge um observador, implementar uma simulação exatamente desta forma é impraticável em termos da quantidade de processamento desnecessário envolvido. 

Programas de Raytracing, como POV-Ray e RADIANCE, e componentes de renderização de bibliotecas como OpenGL, iniciam com a "área de captura" de sua câmera simulada, definida pelo recorte do Plano de Projeção dado pelo Window e traçam os raios de luz de volta para dentro da cena. Assim apenas a intensidade e qualidade dos raios de luz que iriam incidir sobre a Window são calculados. O usuário especifica a localização do plano de projeção, fontes de luz e objetos da cena, assim como as propriedades de textura de superfície dos objetos (vide modelo de Phong), seus interiores (quando transparentes) e, em casos avançados, quaisquer meios atmosféricos como névoa, turbidez e fogo. 

Para cada pixel na imagem final, um ou mais raios de luz é disparado da câmera simulada para dentro da cena para vermos se intercepta algum objeto desta através da utilização de um algoritmo da família de algoritmos denominada zBuffering ou Buffer de Profundidade. Estes "raios de visada" originam-se do observador virtual, representado pelo modelo de câmera, e passam através da Window para representar a imagem final. Utilizamos a resolução da Viewport para nos dar a informação de quantos "pontos de incidência de raios de luz" teremos sobre a Window e assim parametrizar o nosso algoritmo de Conversão de Varredura, que gerará os pixels finais da imagem. 

Toda vez que um objeto é atingido por um raio de luz, a cor da superfície do objeto naquele local é calculada. Para este fim, são enviados raios de volta a cada uma das fontes de luz da cena para determinar a quantidade de luz incidindo sobre a superfície a partir daquela fonte.  Estes "raios umbrais" são testados para saber se aquele ponto está na sombra do ponto de vista daquela fonte de luz ou não. Se a superfície for translúcida, transparente, reflectiva ou espelhada, novos raios são disparados e traçados para se calcular  a contribuição das luzes refratada e refletida para a cor final da superfície do objeto naquele ponto. 

Se desejarmos efeitos adicionais como reflecção interdifusa (radiosidade), efeitos atmosféricos e luzes de área, será necessário disparar uma quantidade bastante grande de raios adicionais para cada pixel para que se possa calcular a contribuição destes efeitos ao aspecto final da cena. Isto é realizado pelo Método da Radiosidade, explanado no capítulo correspondente deste material de ensino.

O que são Raytracers ?

Raytracers são programas de simulação de iluminação que sintetizam imagens a partir de modelos geométricos tridimensionais de espaços físicos utilizando a técnica de raytracing. O processo de raytracing tipicamente não é um processo rápido, mas pode produzir imagens de qualidade extremamente alta com reflexões, sombras e perspectiva realísticas, além de muitos outros efeitos.  O modelo o mundo constitui os dados de entrada e  descreve a forma, tamanho, localização e composição de cada superfície deste mundo. Um modelo pode conter vários milhares de superfícies e é muitas vezes produzido por um programa de CAD separado ou por um programa de análise de imagens e reconstrução 3D, como no caso do nosso exemplo da cabeça reconstruída a partir de uma tomografia computadorizada.  Além de conjuntos de polígonos planares, formados por triângulos, quadriláteros ou polígonos arbitrários, a maioria dos raytracers permite a modelagem direta de objetos como paralelepípedos, esferas e cones. Em alguns casos, Programas geradores podem ser utilizados para a criação interativa de estruturas e formas complexas a partir dessas primitivas e sua posterior exportação na linguagem de definição de cena de algum raytracer. Alguns exemplos são caixas de diversas formas, prismas e sólidos de revolução como vasos, garrafas e outras formas com simetria axial.  Um utilitário de transformação pode permitir a duplicação de objetos e a construção hierárquica de uma cena.

Modelo de Funcionamento de Alto Nível de um Raytracer

Cada raytracer possue particularidades de implementação que o tornam diferente de outras implementações, mas alguns princípios básicos se repetem ao longo de todos eles. Estes são:

  • Utilização de uma linguagem de representação de cenas, baseada em entidades geométricas primitivas como alguns sólidos e tipos de superfícies poligonais e um conjunto de transformações sobre estes para permitir a construção de objetos complexos, como Geometria Construtiva (POV-Ray) ou geração de sólidos de revolução (RADIANCE);
  • Utilização de uma representação interna deste mundo em algum tipo de estrutura de dados adequada à Computação Gráfica 3D, como Octrees (RADIANCE), gerada através de um módulo compilador de cenas;
  • Utilização de algum algoritmo da familia dos Buffers de Profundidade para o cálculo das trajetórias dos raios;
  • Utilização de algum tipo de algoritmo de Conversão de Varredura para a discretização da cena em pixel.
Bibliotecas de renderização como OpenGL e SDL possuem características bastante similares. A diferença básica entre raytracers e bibliotecas de renderização é que raytracers são orientados à renderização em detalhes e com uso do máximo de recursos de qualidade e realismo de cenas estáticas.  Bibliotecas como OpenGL são voltadas à renderização rápida, com realismo suficiente mas não necessariamente o melhor possível, de cenas voltadas à animação. O objetivo de um raytracer é visualizar em detalhes algum dado complexo, sendo que poucos raytracers permitem animação realista ou em tempo real, enquanto que OpenGL é voltado para cenas animadas, em constante regeneração, integradas a um programa aplicativo, como jogos e simulações. 

Para exemplificar o modo de funcionamento de um raytracer vamos aqui descrever os módulos do raytracer RADIANCE. RADIANCE foi desenvolvido como uma ferramenta de auxílio à pesquisa e ao projeto arquitetônico voltada à previsão da distribuição de radiação visível em espaços iluminados e toma como entrada um modelo geométrico tridimensional do ambiente físico e produz um mapa dos valores de radiância espectral sob a forma de uma imagem a cores.  A figura abaixo mostra o seu diagrama de blocos. Nós vamos explicar os componentes importantes do modelo e que servem de exemplo para funcionalidades similares em outras implementações.


No diagrama acima, módulos do sistema RADIANCE são representados por caixas e dados são representados por ovais. O programa central é  rpict, que produz uma imagem a partir de uma descrição de cena. Rview é uma variação de rpict que computa e mostra imagens de forma interativa, aumentando gradativamente a resolução do algoritmo de varredura  e  rtrace computa valores de raios idividuais. O programa oconv funciona como um compilador de cenas, convertendo a descrição de cena em uma Octree de malhas de superfícies para renderização eficiente. 

Um arquivo de descrição de cena de RADIANCE consiste de listas de superfícies e materiais que compõem a cena. Superfícies atualmente suportadas são esferas, polígonos, cones e cilindros. Existe também um tipo de superfície composto, chamado malha (mesh) que facilita a criação de geometrias complexas. Superfícies podem ser feitas a partir de materiais como plástico, metal e vidro. Fontes de luz podem ser discos distantes bem como esferas, discos e polígonos locais. 

Abaixo vemos um exemplo de uma cena renderizada com RADIANCE  e uma foto mostrando o local real  modelado. O objetivo do exemplo foi o de prever as características de iluminação do lugar.

Renderização gerada com RADIANCE

Foto do local real

Pipeline de Visualização usando Raytracing

Antes de passarmos adiante e começarmos a discutir os diversos modelos, algoritmos e aspectos mais importantes do Raytracing, vale colocar aqui como fica a pipeline de visualização após a inclusãos das tarefas necessárias ao raytracing. Vamos fazer isto no algoritmo de altíssimo nível abaixo:

  1. Definição da Orientação da Window por parte do Usuário.
  2. Transformação do sistema de Coordenadas de WC para CPP (coordenadas do plano de projeção).
  3. Clipping,  preferencialmente em 3D usando método da normalização da pirâmide canônica.
  4. Conversão por Varredura.
  5. z-Buffering
  6. Raytracing, com cálculo de iluminação e cores, atualizando o z-Buffer.
  7. Cópia do conteúdo do z-Buffer para a Viewport.