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