Felipe Augusto Rieck. Implementação e Otimização de uma Técnica de Ray Tracing



Documentos relacionados
Bruno Pereira Evangelista.

OpenGL. Uma Abordagem Prática e Objetiva. Marcelo Cohen Isabel Harb Manssour. Novatec Editora

Trabalho de Fundamentos da Computação Gráfica

Utilização. de Shaders de efeitos realistas para jogos. Bruno Pereira Evangelista. Pontifícia Universidade Católica de Minas Gerais

7.Conclusão e Trabalhos Futuros

Rendering. Por Angelo Luz

Capítulo 3. Avaliação de Desempenho. 3.1 Definição de Desempenho

ORGANIZAÇÃO DE COMPUTADORES MÓDULO 10

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Dadas a base e a altura de um triangulo, determinar sua área.

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software

Placa de vídeo em CUDA

Visualização Científica. Pedro de Botelho Marcos Março/2008. Núcleo de Computação Científica Tópicos Avançados em Computação II

1. NÍVEL CONVENCIONAL DE MÁQUINA

Tecnologia PCI express. Introdução. Tecnologia PCI Express

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

MUDANÇAS NA ISO 9001: A VERSÃO 2015

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

ORGANIZAÇÃO DE COMPUTADORES MÓDULO 8

TRABALHO COM GRANDES MONTAGENS

Construindo a câmara escura

1- Fonte Primária 2- Fonte Secundária. 3- Fonte Puntiforme 4- Fonte Extensa

UNIVERSIDADE FEDERAL DE SANTA CATARINA MODELAGEM DE UMA PLATAFORMA VIRTUAL PARA SISTEMAS EMBUTIDOS BASEADA EM POWERPC

SISTEMA DE GERENCIAMENTO DE PROJETOS - REDMINE MANUAL DE USO

Orientação a Objetos

Laboratório Virtual Kit Óptico

MÓDULO 7 Modelo OSI. 7.1 Serviços Versus Protocolos

INTRODUÇÃO À ÓPTICA GEOMÉTRICA

Feature-Driven Development

Curso: Ensino Fundamental II Disciplina: MATEMÁTICA Professor: Álvaro / Leandro

Manual do Ambiente Moodle para Professores

Arquiteturas RISC. (Reduced Instructions Set Computers)

Visão Geral de Hardwares de Renderização e Ferramentas de Avaliação. Carlos Eduardo Rodrigues

Algoritmos e Estrutura de Dados III. Árvores

Itinerários de Ônibus Relatório Final

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

5. EXPERIÊNCIAS E ANÁLISE DOS RESULTADOS Os Programas de Avaliação

ÓPTICA GEOMÉTRICA PREGOLINI

Protocolo em Rampa Manual de Referência Rápida

SISTEMAS OPERACIONAIS CAPÍTULO 3 CONCORRÊNCIA

Na medida em que se cria um produto, o sistema de software, que será usado e mantido, nos aproximamos da engenharia.

Manual de implantação

Comparativo de desempenho do Pervasive PSQL v11

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO DEPARTAMENTO DE ESTATÍSTICA E INFORMÁTICA BACHARELADO EM SISTEMAS DE INFORMAÇÃO RAPID APPLICATION DEVELOPMENT

Software de segurança em redes para monitoração de pacotes em uma conexão TCP/IP

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

O Primeiro Programa em Visual Studio.net

MÓDULO 9 METODOLOGIAS DE DESENVOLVIMENTO DE SISTEMAS

O hardware é a parte física do computador, como o processador, memória, placamãe, entre outras. Figura 2.1 Sistema Computacional Hardware

c. Técnica de Estrutura de Controle Teste do Caminho Básico

Organização e Arquitetura de Computadores I. de Computadores

OBJETIVO Verificar as leis da Reflexão Verificar qualitativamente e quantitativamente a lei de Snell. Observar a dispersão da luz em um prisma.

COMPUTAÇÃO GRÁFICA. Rasterização e Preenchimento de Regiões. MARCO ANTONIO GARCIA DE CARVALHO Fevereiro de Computação Gráfica

APLICAÇÃO PARA ANÁLISE GRÁFICA DE EXERCÍCIO FÍSICO A PARTIR DA PLATAFORMA ARDUINO

Cálculo de volume de objetos utilizando câmeras RGB-D

TUTORIAL DO ALUNO. Olá, bem vindo à plataforma de cursos a distância da Uniapae!!!

7 Processamento Paralelo

Informática I. Aula 5. Aula 5-13/05/2006 1

Avanços na transparência

EMISSÃO DE CERTIFICADOS ELETRÔNICOS NOS EVENTOS DO INSTITUTO FEDERAL CATARINENSE CÂMPUS VIDEIRA

Um Driver NDIS Para Interceptação de Datagramas IP

Lista de Revisão Óptica na UECE e na Unifor Professor Vasco Vasconcelos

Hoje estou elétrico!

Capacidade = 512 x 300 x x 2 x 5 = ,72 GB

Introdução ao Aplicativo de Programação LEGO MINDSTORMS Education EV3

Unidade VI. Validação e Verificação de Software Teste de Software. Conteúdo. Técnicas de Teste. Estratégias de Teste

Nosso objetivo será mostrar como obter informações qualitativas sobre a refração da luz em um sistema óptico cilíndrico.

CALDsoft7 - Software de planificação em caldeiraria

Entrar neste site/arquivo e estudar esse aplicativo Prof. Ricardo César de Carvalho

Podemos encontrar uma figura interessante no PMBOK (Capítulo 7) sobre a necessidade de organizarmos o fluxo de caixa em um projeto.

INTRODUÇÃO À PROGRAMAÇÃO BCC 201 TURMAS 31, 32 E AULA TEÓRICA 2 PROF. MARCELO LUIZ SILVA (R E D)

Modelagemde Software Orientadaa Objetos com UML

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia

FATEC Cruzeiro José da Silva. Ferramenta CRM como estratégia de negócios

Construção de Wiki para a MISTOOL, uma Ferramenta de Aplicação do Método de Inspeção Semiótica

Pesquisa com Professores de Escolas e com Alunos da Graduação em Matemática

Interface Homem-Computador

ARQUITETURA DE COMPUTADORES

APLICAÇÕES DA DERIVADA

Capítulo 5. Figura 5.2. Conector para o monitor.

Prof. Marcelo Henrique dos Santos

Modelos de Iluminação

Manual de Publicaça o no Blog da Aça o TRIBOS nas Trilhas da Cidadania

4 Segmentação Algoritmo proposto

3B SCIENTIFIC PHYSICS

Computação Gráfica. Renderização em Tempo Real. Erivaldo Xavier de Lima Filho

EMISSÃO DE CERTIFICADOS ELETRÔNICOS NOS EVENTOS DO INSTITUTO FEDERAL CATARINENSE CÂMPUS VIDEIRA

Metodologia e Gerenciamento do Projeto na Fábrica de Software v.2

29/3/2011. Primeira unidade de execução (pipe U): unidade de processamento completa, capaz de processar qualquer instrução;

UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ CURSO SUPERIOR DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS

Aula 26: Arquiteturas RISC vs. CISC

LENTES E ESPELHOS. O tipo e a posição da imagem de um objeto, formada por um espelho esférico de pequena abertura, é determinada pela equação

Admistração de Redes de Computadores (ARC)

REALIDADE AUMENTADA APLICADA NA EDUCAÇÃO: ESTUDOS DOS SEUS BENEFÍCIOS

Desenvolvimento de Estratégia para Programação do Futebol de Robôs da Mauá

Professora Bruna FÍSICA B. Aula 17 Seus Óculos. Página 232

1.1. Aplicações de TVD dinâmicas

BARRAMENTO DO SISTEMA

ATIVIDADES PRÁTICAS SUPERVISIONADAS

Transcrição:

Felipe Augusto Rieck Implementação e Otimização de uma Técnica de Ray Tracing Joinville 2008

UNIVERSIDADE DO ESTADO DE SANTA CATARINA BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO Felipe Augusto Rieck IMPLEMENTAÇÃO E OTIMIZAÇÃO DE UMA TÉCNICA DE RAY TRACING Trabalho de conclusão de curso submetido à Universidade do Estado de Santa Catarina como parte dos requisitos para a obtenção do grau de Bacharel em Ciência da Computação Orientador: Doutora, Daniela G. Trevisan Joinville 2008

Felipe Augusto Rieck IMPLEMENTAÇÃO E OTIMIZAÇÃO DE UMA TÉCNICA DE RAY TRACING Este Trabalho de Conclusão de Curso foi julgado adequado para a obtenção do título de Bacharel em Ciência da Computação e aprovado em sua forma nal pelo Curso de Ciência da Computação do CCT/UDESC. Banca Examinadora: Orientador: Doutora, Daniela G. Trevisan Membro: PhD., Marcelo da Silva Hounsell Membro: PhD., Roberto Silvio Ubertino Rosso Jr. Joinville, 3 de dezembro de 2008

Agradecimentos Agradeço a Deus por seu amor inndável, pelo novo ânimo soprado a cada dia e por poder conar tudo a Ele. Aos meus pais, Rolf e Beatriz, a quem eu amo muito, pela dedicação, ensinamentos e pelo apoio em todas os momentos da minha vida. Aos meus irmãos Paulo e João, que me animavam, alegravam, questionavam, e com quem pude aprender e ensinar muito. Minha professora orientadora, Dra. Daniela Gorski Trevisan pela orientação, apoio e contribuição nesta monograa, auxiliando e, sobretudo, defendendo minhas idéias. À minha amiga Ariane Böge, que esteve junto em todos esses anos de faculdade e amizade, e que me contagiava com sua alegria e diversão. Todos os colegas e amigos, que me ajudaram não somente durante o curso, mas também no decorrer da vida. À Universidade do Estado de Santa Catarina - UDESC pela oportunidade de ensino de qualidade e gratuito. Ao professor Msc. Rogério Eduardo da Silva, que me incentivou na realização deste trabalho fornecendo auxílio na implementação do Ray Tracer na disciplina de Computação Gráca.

É melhor tentar e falhar, que preocupar-se e ver a vida passar; é melhor tentar, ainda que em vão, que sentar-se fazendo nada até o nal. Eu prero na chuva caminhar, que em dias tristes em casa me esconder. Prero ser feliz, embora louco, que em conformidade viver... Martin Luther King

Resumo Este trabalho buscou o melhoramento de um Ray Tracer desenvolvido na disciplina de CGR - Computação Gráca. O algoritmo do Ray Tracer permite simular um fotorrealismo muito semelhante ao vivenciado no mundo real, permitindo que cenas das mais diferentes complexidades, tanto em relação à quantidade de primitivas como à complexidade da texturização, simulem ambientes ou situações reais. Entretanto, o algoritmo do Ray Tracer despende de um elevado custo computacional, que não permite que ele seja utilizado para aplicações interativas sem que haja a otimização da forma como as imagens são geradas. Foram feitos estudos sobre a estrutura de aceleração KD-Tree, bem como a utilização do poder computacional da GPU, am de utilizá-los como métodos de aceleração do processo de render. O algoritmo estipulado permitiu que fossem utilizadas esferas e malhas de triângulo, podendo estas serem texturizadas, reexivas e/ou transparentes. Os resultados obtidos mostram que o algoritmo foi acelerado com o processo de otimização por divisão espacial, e levam à conclusão da real necessidade de otimização de um Ray tracer, sobretudo, quando este suporta malhas de triângulos de diversas complexidades. Palavras-chaves: Ray Tracer, aceleração, GPU, KD-Tree

Abstract This study is aimed to improve a Ray Tracer developed in the discipline of CGR - Computer Graphics. The algorithm of Ray Tracer is able to simulate a photorealism very similar with the real world, allowing scenes of dierent complexities, including the amount of primitive as the complexity of texturing, simulate real situations or environments. However, the algorithm of Ray Tracer spends a high computational cost, which does not allow it to be used for interactive applications without giving the optimization of how the images are generated. Studies were made on the KD-Tree acceleration structure, and the use of computational power of the GPU, in order to use them as methods for accelerating the entire render process. The algorithm stipulated here, allowed to spheres and triangle meshes, these can be of textured, reective and/or transparent materials. The results shows that the algorithm was accelerated with the space division optimization, and lead to the conclusion of the need for optimization of a Ray tracer, especially when it supports mesh of triangles of various complexities. Keywords: Ray Tracer, aceleration, GPU, KD-Tree

LISTA DE FIGURAS 1.1 Entidades básicas de um Ray Tracer. Adaptado de (GLASSNER, 1989). 14 1.2 Etapa de uma divisão espacial por KD-Tree. (BIKKER, 2004b).... 17 2.1 O modelo de câmera pinhole...................... 21 2.2 Traçado de raios em uma cena normal................ 23 2.3 Raios de sombra............................. 25 2.4 Raio de luz reetido três vezes até chegar ao plano de projeção... 26 2.5 Raio de luz refratado.......................... 27 2.6 Ray Tracer recursivo.......................... 29 2.7 O problema de aliasing......................... 30 2.8 Desempenho de Ponto-utuante nas GPUs.............. 32 2.9 Pipeline de uma GPU......................... 33 3.1 Mapeamento Bilinear.......................... 44 3.2 Malha de triângulos texturizada sobre uma superfície plana reetiva 45 3.3 Esfera texturizada ao centro de duas esferas reetivas........ 46 4.1 Interface de seleção raio-cena na GPU................. 48 4.2 Um Ray Tracer em streaming..................... 51 4.3 Cenas Renderizadas........................... 52

4.4 Resultado das Cenas.......................... 53 4.5 Imagens geradas a partir do volume de dados............ 55 4.6 Cenas renderizadas........................... 57 4.7 Resultado em comparação à diferentes GPUs............. 57 4.8 Resultado da Comparação de uma GPU com CPUs......... 58 5.1 Arvore resultante da divisão de D................... 62 5.2 Cena com os retângulos de divisão................... 63 5.3 Encontrando a melhor divisão em uma cena contendo um triângulo 64 6.1 Exemplo de nó de dados na textura.................. 72 7.1 Cena B1 com variação da profundidade de recursão de 1 a 5 raios recursivos................................ 74 7.2 Teste B1, cena composta de duas esferas............... 75 7.3 Cena B2 com variação da profundidade de recursão de 1 a 5 raios recursivos (da esquerda para a direita)................ 76 7.4 Teste B2 - KD-Tree, cena composta de 2604 triângulos....... 77 7.5 Teste B2 - Normal, cena composta de 2604 triângulos........ 77 7.6 Teste B2 - Ganho de desempenho, cena composta de 2604 triângulos 78 7.7 Teste B3 - KD-Tree, cena com variação da quantidade de triângulos 79 7.8 Teste B3 - Normal, cena com variação da quantidade de triângulos. 80 7.9 Teste B3 - Ganho de desempenho, cena com variação da quantidade de triângulos.............................. 80 6

A.1 4 Esferas................................. 89 A.2 8 Esferas................................. 90 A.3 Malha com 2600 triângulos....................... 90 A.4 Malha de 2600 triângulos suavizada, resultando em 15600 triângulos 91 A.5 Duas esferas com material reexivo.................. 91 A.6 Malha e plano com material reexivo, resultando em 2604 triângulos 92 A.7 Malha utilizada no teste com variação de complexidade por suavização da malha de polígonos...................... 92 7

Lista de Abreviaturas API BVH CGR CPU GFLOPS GLSL GPU KD-Tree HLSL SAH SDK Application Programming Interface Bounding Volume Hierarchie Computação Gráca Central Processing Unit Giga Floating Points Operations per Seconds OpenGL Shading Language Graphics Processing Unit k-dimensional tree High Level Shader Language Surface Area Heuristic Software Development Kit

LISTA DE TABELAS 4.1 Comparação dos Trabalhos Relacionados............... 59 5.1 Desempenho do Ray Tracer com KD-Tree.............. 68

10 SUMÁRIO 1 INTRODUÇÃO.............................. 14 1.1 OBJETIVOS................................. 18 1.1.1 Geral.................................... 18 1.1.2 Especíco.................................. 18 1.2 METODOLOGIA.............................. 18 1.3 ESTRUTURA DO TRABALHO...................... 19 2 FUNDAMENTAÇÃO TEÓRICA................... 20 2.1 RAY TRACER - CONCEITOS....................... 20 2.1.1 Modelo de Câmera Pinhole........................ 20 2.1.2 Traçado de Raios.............................. 22 2.1.2.1 Ray Tracer Inverso Versus Tradicional................. 22 2.1.2.2 Iluminação e Texturização........................ 24 2.1.2.2.1 Sombra................................. 24 2.1.2.2.2 Reexão................................. 25 2.1.2.2.3 Transparência.............................. 27 2.1.2.2.4 Colorização Phong........................... 28 2.1.3 Ray Tracer Recursivo........................... 28 2.1.4 Aliasing e Anti-aliasing.......................... 29

2.1.5 Algoritmos de Intersecção......................... 30 2.2 GPU - CONCEITOS............................ 31 2.2.1 Pipeline de Processamento........................ 33 2.2.2 Linguagens para Colorização em Alto-Nível............... 34 2.2.2.1 Cg..................................... 35 2.2.2.2 HLSL................................... 36 2.2.2.3 GLSL................................... 36 3 AMPLIAÇÃO DAS FUNCIONALIDADES DO RAY TRACER 38 3.1 NOVAS PRIMITIVAS............................ 38 3.1.1 Malhas de Triângulos........................... 39 3.1.1.1 Intersecções Raio-Triangulo....................... 40 3.2 TEXTURIZAÇÃO.............................. 42 3.3 RESULTADOS OBTIDOS......................... 45 4 TRABALHOS RELACIONADOS................... 47 4.1 TRABALHO 1: RAY TRACING COMPLEX SCENES ON GRAPHICS HARDWARE................................ 47 4.1.1 Descrição da Abordagem......................... 47 4.1.2 Testes e Resultados Obtidos........................ 49 4.2 TRABALHO 2: RAY TRACING ON PROGRAMMABLE GRAPHICS HARDWARE................................ 50 4.2.1 Descrição da Abordagem......................... 50 4.2.2 Testes e Resultados Obtidos........................ 52 11

4.3 TRABALHO 3: A SINGLE-PASS GPU RAY CASTING FRAMEWORK FOR INTERACTIVE OUT-OF-CORE RENDERING OF MASSIVE VOLUMETRIC DATASETS........................ 53 4.3.1 Descrição da Abordagem......................... 53 4.3.2 Testes e Resultados Obtidos........................ 54 4.4 TRABALHO 4: RAY TRACING ON GPU................ 56 4.4.1 Descrição da Abordagem......................... 56 4.4.2 Testes e Resultados Obtidos........................ 56 4.5 DISCUSSÃO DO CAPÍTULO....................... 58 5 OTIMIZAÇÃO POR SOFTWARE - DIVISÃO ESPACIAL... 60 5.1 KD-TREE.................................. 61 5.1.1 Gerando a KD-Tree............................ 62 5.1.2 Percorrendo a KD-Tree.......................... 65 5.1.3 Cenas Dinâmicas/Interativas....................... 66 5.1.4 Resultados Obtidos............................ 68 6 OTIMIZAÇÃO POR HARDWARE.................. 70 6.1 PASSANDO DADOS ATRAVÉS DE TEXTURAS............ 70 6.2 O PROBLEMA DA RECURSIVIDADE.................. 72 6.3 A DIFICULDADE DE IMPLEMENTAÇÃO............... 73 7 TESTES E RESULTADOS....................... 74 7.1 TESTE B1: COMPLEXIDADE DE MATERIAL EM CENAS SIMPLES 74 12

7.2 TESTE B2: COMPLEXIDADE DE MATERIAL EM CENAS COM- PLEXAS................................... 76 7.3 TESTE B3: VARIAÇÃO DA COMPLEXIDADE DA CENA...... 78 7.4 DISCUSSÃO DOS RESULTADOS..................... 81 8 CONCLUSÃO............................... 82 8.1 TRABALHOS FUTUROS......................... 83 REFERÊNCIAS................................ 85 APÊNDICE A -- Cenas Renderizadas................... 89 A.1 TESTE A1.................................. 89 A.2 TESTE A2.................................. 90 A.3 TESTE A3.................................. 90 A.4 TESTE A4.................................. 91 A.5 TESTE B1.................................. 91 A.6 TESTE B2.................................. 92 A.7 TESTE B3.................................. 92 APÊNDICE B -- Código Fonte GPU................... 93 B.1 CARREGAMENTO DE TEXTURAS................... 93 B.2 ESTRUTURA PARA PRIMITIVAS.................... 93

1 Introdução Com o avanço da tecnologia empregada na síntese de imagens, tanto para visualizações grácas como para jogos, surgiu a necessidade de uma melhoria na qualidade do resultado apresentado ao usuário. Esta qualidade pode ser obtida através da técnica do Ray Tracing, que permite computar imagens baseando-se no traçado original da luz, da mesma forma como a vemos na natureza. Segundo (AZEVEDO; CONCI, 2003), os primeiros estudos sobre Ray Tracing são da década de 1960, a partir do estudo e busca de um algoritmo que simulasse a trajetória de projéteis balísticos e partículas nucleares. A empresa Apple foi a primeira a apresentar o Ray Tracer como uma forma de calcular sombras em computação gráca (AZEVEDO; CONCI, 2003). Entretanto, mesmo com pouca utilização, o avanço do hardware empregado nos computadores propiciou que a técnica do Ray Tracing passasse a ser aprimorada e implementada. Assim, em 1980 já se tornava possível criar imagens com sombras, reexões, transparência e refrações. Figura 1.1: Entidades básicas de um Ray Tracer. Adaptado de (GLASSNER, 1989). Um Ray Tracer consiste de três entidades principais (GLASSNER, 1989):

1 Introdução 15 a câmera (ou olho da imagem), o plano da imagem e a cena contendo primitivas e luzes. Na gura 1.1 pode ser visto um raio A sendo propagado através do olho em direção a um pixel do plano de imagem (quadrado pintado). Através da direção deste raio são computadas as intersecções com as primitivas da cena e, então, obtida a colorização para o pixel do plano de imagem. Dessa forma, basicamente, a técnica do Ray Tracing consiste em traçar raios que partem do olho do observador à cena, e, através de testes de intersecção, determinar se o raio intercepta ou não as primitivas nela contidas. Quando há uma intersecção raio-primitiva, calcula-se a cor nal do pixel através da normal no ponto de intersecção e das congurações do material da primitiva e luzes presentes na cena (GLASSNER, 1989). Para efeito de cálculo de reexão e/ou transparência, quando existem intersecções raio-primitiva, novos raios são gerados recursivamente como se o raio inicial fosse ricocheteado pela cena. A este efeito de ricochete dá se o nome de Ray Tracer Recursivo, e é através dele que se tornou possível computar efeitos mais complexos como refração e reexão. Vale ressaltar que este tipo de cálculo não é computado em primitivas opacas e não reetoras, sendo utilizado sempre que existe uma primitiva transparente e/ou espelhada. Costuma-se estabelecer um limite de profundidade de recursão para que o algoritmo não entre em um ciclo innito de raios. Quanto maior a profundidade de recursão, maior a qualidade da cena e signicativamente maior o tempo que a cena levará para renderizar. Além dos raios originários da recursividade do Ray Tracer existem outros tipos de raios gerados para a obtenção da iluminação no ponto de encontro raio-primitiva. Estes raios, designados raios de sombra (AZEVEDO; CONCI, 2003; GLASSNER, 1989), vericam se o ponto de encontro raio-primitiva é diretamente iluminado pelas fontes de luz presentes na cena ou não. Isto é feito através de análises que determinam se um raio originário no ponto de intersecção e direcionado a cada lâmpada, sofre ou não intersecção por outra primitiva. Caso haja esta intersecção, signica que essa outra primitiva bloqueia a passagem de luz para aquela lâmpada. Através dos raios de sombra torna-se possível determinar a existência, ou não, de umbras, penumbras, ou até mesmo escuridão nos objetos da cena. En-

1 Introdução 16 tretanto, da mesma forma como os raios recursivos tem um elevado custo, os raios de sombra também custam tempo de processamento, principalmente se o número de lâmpadas na cena for relativamente grande. Todavia, a qualidade das imagens de um Ray Tracer está diretamente relacionada ao tempo que este levará para renderizar uma cena. Assim, no quesito interatividade (que diz respeito à exibição da cena renderizada em um tempo relativamente curto - que favoreça a interação - ao usuário), se torna difícill criar um algoritmo que satisfaça o desejo de uma boa qualidade 1 de renderização em um tempo que satisfaça a interação (próximo ou equivalente ao real-time) sem que sejam utilizados métodos de aceleração, quer eles sejam através de software (técnicas de implementações e algoritmos ecientes) ou hardware. Entende-se por tempo de interação, por exemplo, os grácos 3D de um jogo de ação, que são gerados em tempo real através do hardware gráco de um computador. Isto signica que os grácos são atualizados de forma tão rápida sem que haja qualquer atraso perceptível ao usuário. De mesma forma, entendese por fotorrealismo a qualidade nal de imagens geradas de forma a simular uma fotograa de algo real, com texturização, iluminação e propriedades físicas semelhantes às encontradas no mundo real. Dentre as técnicas de aceleração por software, um dos algoritmos comumente utilizados é o de subdivisão espacial denominado KD-Tree, que visa reduzir o número de testes de intersecção do Ray Tracer. A utilização da técnica de KD- Tree é usual em algoritmos de Ray Tracing pois ela é a estrutura de aceleração mais eciente no momento, e a que mais se aplica a cenas de grande complexidade (HAVRAN, 2000). Segundo (AKENINE-MOLLER; HAINES, 2002) uma KD-Tree permite que espaços vazios da cena sejam eliminados dos testes de intersecção através da construção de uma árvore hierárquica dos objetos presentes da cena. Uma KD-Tree permite que cenas complexas sejam renderizadas mais rapidamente uma vez que os testes de intersecção serão limitados aos elementos pertencentes à cena e por sua vez a estrutura da KD-Tree. Para tanto, o espaço da cena é dividido em duas metades, e as duas metades são processadas recursi- 1 Qualidade que simule o foto-realismo

1 Introdução 17 vamente até que um semi-espaço não contenha mais de uma primitiva (BIKKER, 2004b). Figura 1.2: Etapa de uma divisão espacial por KD-Tree. (BIKKER, 2004b). Na gura 1.2 é ilustrado um processo de divisão da cena em blocos. Cada primitiva é guardada na árvore KD-Tree, fazendo com que o teste de intersecções seja reduzido aos objetos existentes na cena. Assim, a área grande da cena que não possui primitivas (quadrado de maior área), não poderá sofrer intersecção com nenhum raio, e por sua vez todos os raios que por ela passarem serão ignorados. Em relação à otimização por hardware, com o avanço da tecnologia empregada em processadores grácos - Graphics Processing Unit(GPU's) - e na taxa de transmissão de dados do sistema operacional para a placa de vídeo; utilizar estes dispositivos como auxiliares na computação de cores e intersecções torna-se uma medida para aliviar a sobrecarga de processamento na CPU. Assim, como uma maneira de acelerar o tempo de renderização, utilizar o desempenho gráco das placas de vídeo pode ser uma maneira viável para a otimização durante a síntese da imagem da cena, favorecendo ganho de desempenho da CPU para computar outras etapas da renderização (HORN et al., 2007). Motivado por um Ray Tracer desenvolvido pelo acadêmico para a dis-

1 Introdução 18 ciplina de Computação Gráca (CGR) 2, este trabalho tem por nalidade aplicar técnicas de otimização em Ray Tracer, as quais possibilitem juntar fotorrealismo com desempenho a m de obter resultados satisfatórios que favoreçam tanto qualidade como interatividade (ou um balanço entre estes fatores). A interatividade aliada à qualidade permitirá a obtenção de resultados favoráveis e inversamente proporcionais ao tempo necessário para a computação da imagem. Os resultados obtidos serão validados através de comparação com abordagens existentes, como, por exemplo, a apresentada em (HORN et al., 2007). 1.1 Objetivos 1.1.1 Geral Desenvolver um Ray Tracer para planos, esferas, cubos e malhas de triângulos com suporte a texturas, que, aliado a técnicas de aceleração por software e hardware, permita interatividade, ou seja, que a técnica possa ser utilizada em aplicações interativas. 1.1.2 Especíco Aquisição de experiência em programação de hardware gráco; Aplicação do algoritmo do Ray Tracer implementado em GPU's com suporte a linguagem de Pixel Shader da NVidia 3 ; Avaliação de desempenho e análise comparativa das técnicas implementadas; 1.2 Metodologia Este trabalho será desenvolvido com base em pesquisa bibliográca na busca de algoritmos de aceleração KD-Tree aplicados à Ray Tracer bem como 2 Este Ray Tracer renderiza cenas com planos e esferas, computando a colorização de opacidade, reexões e transparências pelo método de texturização phong. 3 http://developer.nvidia.com/page/cg_main.html

1 Introdução 19 técnicas de programação em GPU. Para isso, será implementado um Ray Tracer que sintetize malhas de triângulos, esferas, cubos e planos, o qual servirá de base para testes e implementações de algoritmos de otimização e futura transposição para GPU. A partir do conteúdo implementado será feita a validação do desempenho através do comparativo entre as técnicas implementadas, analisando cenas de diferentes complexidades e o tempo de rendering. Estas análises serão feitas utilizando, ou não, otimizações. 1.3 Estrutura do Trabalho Este trabalho está disposto na seguinte estrutura: o capítulo 1 aborda a fundamentação teórica dos conceitos envolvidos no algoritmo do Ray Tracer e na computação em GPU, o capítulo 2 aborda as novas funcionalidade adicionadas ao Ray Tracer desenvolvido para a disciplina de CGR. No capítulo 3 são abordados os trabalhos relacionados à esta pesquisa. No capítulo 4 são abordados os conceitos sobre a otimização por divisão espacial, e no capítulo 5 é abordada a otimização por hardware. Finalmente, no capítulo 6 são abordados os testes e os resultados obtidos neste trabalho.

20 2 Fundamentação Teórica Este capítulo aborda a fundamentação teórica levantada para a base de conhecimento utilizada na elaboração e aprimoração do Ray Tracer. São apresentados os conceitos do algoritmo do Ray Tracing e os conceitos de programação em GPU - Graphic Processing Unit, ou Unidade Gráca de Processamento. 2.1 Ray Tracer - Conceitos Ray Tracing é uma técnica de geração de imagens a partir do traçado original da luz (JENSEN; CHRISTENSEN, 2007). Como se sabe, a luz é propagada pelo meio em linhas retas e pode, ou não, sofrer alterações em seu percurso. Estas alterações vão desde fenômenos de absorção até fenômenos como reexão, sombra e refração. Para tanto, esta técnica consiste em propagar um raio e efetuar as devidas interações deste raio com o meio em que ele está. Como o Ray Tracing é uma técnica que busca simular de forma precisa as interações da luz com o meio, pode-se dizer que esta é uma técnica de fotorrealismo. Dessa forma pode-se dizer de antemão que o algorítmo do Ray Tracing simula a iteração de fontes primárias. A melhor maneira de denir a técnica de Ray Tracing e a forma em que os raios se propagam na cena é através do entendimento do modelo de câmera Pinhole, descrita a seguir. 2.1.1 Modelo de Câmera Pinhole Segundo (GLASSNER, 1989), talvez o modelo mais simples de câmera encontrado, o modelo pinhole consiste em uma caixa escura com um orifício para a passagem de luz em uma extremidade, e uma parede de projeção na extremidade oposta onde é colocado o lme fotográco. A luz que incide nos objetos que estão a frente do orifício sofre interação com os mesmos e, dependendo das características do

2 Fundamentação Teórica 21 material, pode ser reetida passando a tomar um novo rumo. Figura 2.1: O modelo de câmera pinhole Se esta nova direção adotada pelo raio de luz coincidir com o orifício, o raio de luz entra na câmera e é projetado na parede de projeção, conforme gura 2.1. Fica evidente que os demais raios de luz não serão captados pela câmera. Porém podem existir casos onde uma sequência de interações da luz pode desviar um raio e por conseguinte colocá-lo em direção ao orifício fazendo-o entrar na câmera. Se ao invés do orifício existisse um abertura, luzes de todas as direções seriam projetadas na parede de projeção ou lme, dessa forma a câmera não teria uma imagem direcionada ou focada em uma cena, e sim em todo o ambiente, provocando o embaralho dos raios de luz e gerando uma imagem desconexa, onde os raios seriam sobrepostos uns aos outros e a foto resultaria em uma imagem totalmente branca (exceto se não houver nenhum raio de iluminação, resultando então em uma imagem totalmente escura). Analogamente pode-se dizer que o orifício serve como um ltro de raios. Apenas os raios a ele direcionados serão projetados no lme. Quanto maior o orifício maior a quantidade de raios que poderão ser projetados no lme e consequentemente mais carregada de cor será a imagem. Todavia, na computação gráca, o modelo de câmera pinhole é modicado de forma que a parede de projeção é movida para a frente do orifício, e este passa a ser o olho da câmera, como pode ser visto na gura 1.1. Assim, para que um determinado objeto seja visível, não se faz mais necessário que ele passe pelo orifício e sim que ele passe pelo olho, ou seja, todo o raio que seria projetado no olho será projetado na parede de projeção e consequentemente fará parte da

2 Fundamentação Teórica 22 cena renderizada. A partir desse novo modelo, pode-se dizer que que a junção do olho e da parede de projeção forma-se uma pirâmide innita e todo raio nela contido e projetado em seu topo fará parte da imagem. A esta pirâmide dá-se o nome de frustum (AKENINE-MOLLER; HAINES, 2002). 2.1.2 Traçado de Raios Um raio possui um ponto inicial (origem) e uma direção. A origem é o ponto de onde a câmera se apresenta na cena. No algoritmo do Ray Tracing a direção de um raio é calculada para cada pixel do plano de projeção. A partir disso pode-se calcular a direção em que determinado raio aponta. Como exemplo, tome-se um raio que parte do ponto (0, 0, 5) e se destina ao pixel (0, 0, 0). A sua direção é calculada por: Normalizando o vetor v teremos: v = (0, 0, 0) (0, 0, 5) (2.1) v = v = v = (0, 0, 5) (2.2) v 02 + 0 2 + 5 2 (2.3) v = v 5 (2.4) v = (0, 0, 1) (2.5) 2.1.2.1 Ray Tracer Inverso Versus Tradicional Existem basicamente duas formas de computar o traçado dos raios, a maneira tradicional e a maneira inversa. Embora as duas maneiras tenham o mesmo princípio e nalidade - traçar o caminho dos raios para renderizar a imagem - as duas técnicas possuem uma grande diferença: o desempenho (GLASSNER, 1989). Para isso se explicará o funcionamento das duas maneiras e posteriormente justicar-se-á a comum adoção da maneira inversa nos Ray Tracers existentes.

2 Fundamentação Teórica 23 Figura 2.2: Traçado de raios em uma cena normal. Retirado de (GLASSNER, 1989) Em uma câmera fotográca convencional, inúmeros raios sofrem interações com o meio e são posteriormente projetados em um lme fotográco. Embora para isso o ser-humano teve que aprender a dominar os fenômenos óticos, este processo é absolutamente natural. Os raios de luz, em sua natureza, tendem a propagar-se em linha reta, até que atinjam um objeto. Esse objeto pode simplesmente absorver esses raios bem como refratá-los ou reeti-los. Mas a câmera não precisa ter o conhecimento de exatos quantos raios serão projetados no lme fotográco, pois, bem se sabe, a grande maioria dos raios existentes na cena não será projetada no lme (ver gura 2.2). O mesmo não ocorre na técnica do Ray Tracing. Em uma simulação, deve se ter o conhecimento das principais variáveis existentes, nesse caso, em se tratando de uma simulação de raios de luz, na técnica do Ray Tracing deve se ter conhecimento de todos os raios que irão realmente passar pelo olho da câmera. Mas como determinar entre os inúmeros raios, quais serão úteis à cena? Isso pode ser feito através do Ray Tracing inverso. Na técnica de Ray Tracing inverso, um raio é disparado do olho da câmera e direcionado à um pixel da cena - o lme fotográco da cena renderizada - esse raio continua até interceptar, ou não, um objeto da cena. Para saber se um raio vai interceptar um objeto, utiliza-se algoritmos de detecção de colisões, que serão vistos mais a frente. Quando um raio colide com um objeto, as propriedades do objeto são processadas e a partir delas são calculadas as refrações, absorções e reexões.

2 Fundamentação Teórica 24 Entretanto, através da técnica de Ray Tracing inverso, não se faz necessário calcular os raios que jamais farão parte da cena, pois estes jamais passaram pelo frustum (AKENINE-MOLLER; HAINES, 2002). Assim, onde antes se tinham inúmeros de raios, agora ltrados, são conhecidos somente os raios pertinentes à renderização da cena, diminuindo consideravelmente o número de iterações do algoritmo. Assim, com base na técnica de Ray Tracing inverso, pode-se estabelecer um algoritmo que direcione os raios para cada pixel da cena e efetue as computações de intersecção e iluminação, este algoritmo é dado por (APPEL, 1963 apud BIKKER, 2008): para cada pixel da tela construir um raio da câmera para o pixel interceptar o raio com as primitivas da cena pintar o pixel com a cor resultante da intersecção 2.1.2.2 Iluminação e Texturização Após ser visto como o raio se comporta quanto sua direção na cena, faz-se necessária uma abordagem quanto a forma como serão tratados os efeitos de iluminação e texturização dos objetos que compõem a cena renderizada. Nesta seção serão vistos os efeitos de sombra, reexão e texturização phong. 2.1.2.2.1 Sombra Na natureza, quando um raio proveniente de uma fonte luminosa encontra um objeto em seu caminho, ocorre uma interação com as propriedades do objeto em questão e, através dessas propriedades, se o objeto for opaco, tem-se um exemplo de sombra.

2 Fundamentação Teórica 25 Figura 2.3: Raios de sombra De forma análoga, pode-se dizer que quando um raio intersecta um objeto, um ponto de intersecção é obtido e a partir desse ponto é gerado um novo raio em direção à cada fonte de luz existente na cena, ou seja, o novo raio surge da intersecção do raio antigo ao objeto, e assim, quanto maior o número de fontes de luz, maior o custo computacional (WANG; SHIH; CHANG, 2001). Este novo raio percorre a cena até encontrar outro objeto ou simplesmente até chegar ao seu destino nal: a luz (gura 2.3, raio L a ). Caso esse raio encontre um objeto, as propriedades desse objeto são obtidas e analisadas. Se o objeto for opaco, o raio não atinge a luz e consequentemente projeta uma sombra (gura 2.3, raio L b ). Um raio enviado do objeto à luz é chamado de raio de sombra (GLASS- NER, 1989) e se ele colidir com um objeto antes de chegar à luz, ele é ignorado pois se trata de um raio sem informações adicionais. Já o raio que incide diretamente em uma luz é chamado de raio de iluminação e nele estarão contidas as informações da luz para o cálculo da iluminação daquela fonte luminosa no objeto. 2.1.2.2.2 Reexão Assim como nos raios de sombra, um raio de reexão surge da colisão de um raio com um objeto. Após a ocorrência dessa colisão, as propriedades do material que constitui o objeto são vericadas e a partir das mesmas é obtido o índice de reexão do material que compõe o objeto, ou seja, a capacidade do objeto retransmitir os raios nele colididos. Um raio reetido é calculado pela seguinte fórmula, adaptado de (AZE-

2 Fundamentação Teórica 26 VEDO; CONCI, 2003): R = V 2 ( V N) N (2.6) onde R é o vetor do raio reetido, V é o vetor do raio incidente e N é a normal calculada a partir da superfície do objeto e o ponto em que o raio incide nela. Figura 2.4: Raio de luz reetido três vezes até chegar ao plano de projeção Assim, quando um raio incide em um objeto reetor, um novo raio com a direção calculada pela fórmula 2.6 é gerado e propagado pela cena, até que ele atinja um objeto opaco. A cor desse objeto é então projetada no objeto inicial e este passa a reetir aquele. Obviamente, um raio pode ser reetido mais de uma vez. A gura 2.4 explica de forma mais detalhada a reexão em Ray Tracers, mostrando o comportamento de um raio reetido três vezes até ser projetado no plano de visão. Basicamente, o cálculo da cor nal de um ponto em um objeto reetor é determinado pela multiplicação de sua própria cor com a cor proveniente do raio por ele disparado (raio de reexão). A este valor ainda se multiplica o fator de reexão do objeto. Quando um raio de reexão não atinge outro objeto, esse raio possui cor neutra, logo, a cor para aquele ponto do objeto reetor será a cor denida para o ambiente da cena (usualmente a cor preta). Ainda quanto às reexões, existe a técnica chamada de reexão difusa, que cria uma reexão com aspecto rugoso. Nesta técnica é gerado um número X de raios aleatórios englobados por um cone imaginário. A média das cores resultantes dos raios é calculada e a partir dela é obtida uma cor correspondente. O custo computacional da reexão difusa é relativo ao número de raios aleatórios

2 Fundamentação Teórica 27 gerados e à qualidade nal da reexão, uma vez que quanto maior o número de raios aleatórios mais suavizada será a reexão difusa. 2.1.2.2.3 Transparência Quando um raio incide em um objeto transparente, ele passa pelo objeto e continua seu caminho até outra interação. Porém o raio sofre alterações em sua direção. Essas alterações são em função do índice de refração do material que compõe o objeto e constituem raios de transparência. Figura 2.5: Raio de luz refratado Na gura 2.5 pode-se observar que o raio R passa pelo objeto A e sofre uma alteração em sua direção. Em seguida, o raio sofre outra alteração ao sair do objeto e segue seu caminho até colidir com o objeto opaco B. A refração é calculada cada vez que o raio troca de meio, devido a diferença da velocidade de propagação da luz nos diferentes meios. A nova direção do raio refratado é calculada pela seguinte fórmula (GLASSNER, 1989): cos I = ( N D) (2.7) cos T 2 = 1 n 2 (1 cos I 2 ) (2.8) T = (n D) + n cos I cos T 2 ) N (2.9) onde: n representa o índice de refração do objeto; D é o vetor direção do raio incidente; N é o vetor normal da intersecção do raio com o objeto.

2 Fundamentação Teórica 28 Outro fenômeno envolvido na transparência é o da absorção da luz no meio que compõe o objeto, dado pela fórmula, (BIKKER, 2004b): d = (C 0.15 dist) (2.10) A = e d (2.11) onde: C é a cor do objeto transparente; dist é a distância percorrida internamente no objeto; e é a constante de absorção do objeto. Dessa forma, quanto maior a distância que o raio percorrer dentro do objeto, maior será a absorção que a luz sofrerá em seu interior. 2.1.2.2.4 Colorização Phong A texturização phong consiste em computar a iluminação para cada pixel ao invés de para cada vértice do objeto (AKENINE-MOLLER; HAINES, 2002). Dessa forma é possível construir uma suavização da iluminação em todo o objeto, tornando-o mais parecido com a realidade. Para calcular a colorização phong deve-se então obter o valor da normal para cada intersecção raio-primitiva e através dela calcular a iluminação. 2.1.3 Ray Tracer Recursivo Para que seja possível simular com maior realismo as interações sofridas por um raio de luz em um determinado ambiente, se faz necessário utilizar a recursividade. Dessa forma quando um raio colide com um objeto não opaco, um novo raio é gerado e calculado novamente. Assim um raio originalmente disparado pela câmera, pode gerar um raio de transparência que por sua vez pode gerar outro raio de transparência e nalmente terminar como um raio de iluminação. O mesmo também permite que um determinado objeto possa reetir o raio e simultaneamente refratá-lo.

2 Fundamentação Teórica 29 Figura 2.6: Ray Tracer recursivo, retirado de (GLASSNER, 1989) A gura 2.6 mostra um raio E inicialmente disparado pelo olho da câmera, e que sofre diversas (e até simultâneas) interações com os objetos que compõem a cena. Nesta gura, o raio E intersecta o plano 3. Para esta intersecção são gerados quatro novos raios: um raio de transparência (T 1 ), um raio de reexão (R 1 ) e dois raios de sombra, sendo que o raio com L A (S 1 ) é diretamente iluminado e o raio com L B (S 2 ) é um raio de sombra, pois, a esfera 4 é intersectada por (S1) antes que este chegue a L B. Entretanto, faz-se necessário limitar a profundidade da recursividade para que o algoritmo do Ray Tracing não entre em um loop, não chegando ao nal de sua execução. Quanto maior a profundidade da recursão, melhor serão tratados os efeitos como reexão e refração, pois suas simulações serão mais parecidas como as que ocorrem na natureza, onde não existe um limite para a recursividade de iterações. 2.1.4 Aliasing e Anti-aliasing Imagens geradas no computador, comumente apresentam um efeito desagradável de serrilhado. Este fenômeno, conhecido como aliasing, acontece principalmente porque os dispositivos de vídeo possuem uma resolução limitada. Por exemplo: quando desenha-se um círculo na tela, o que se está fazendo na verdade é aproximar

2 Fundamentação Teórica 30 por um conjunto limitado de pixels uma entidade geométrica que possui innitos pontos, ou seja, estamos fazendo uma discretização do círculo. Figura 2.7: O problema de aliasing Na verdade, segundo (GLASSNER, 1989), é impossível eliminar o problema de aliasing. Pois mesmo que se aumente a quantidade de pixels gerados para uma imagem, sempre é possível ampliar a imagem ao ponto dos pixels se tornarem visíveis novamente (GLASSNER, 1989). A gura 2.7 mostra um polígono (2.7 (a)) discretizado em uma grade de baixa resolução (2.7 (b)); na gura 2.7 (c), é exibido o mesmo polígono após passar por um tratamento de anti-aliasing. Existem técnicas para reverter o efeito do aliasing, chamadas de antialiasing, como por exemplo a técnica do supersampling, que consiste em basicamente aumentar o número de raios para cada pixel da imagem. Onde anteriormente era gerado apenas um raio por pixel (originado no centro de cada pixel) agora são gerados vários raios por pixel em posições ordenadas (grade). Como resultado, obtem-se uma suavização das cores dos pixels de borda suavizando por consequência o efeito de serrilhado da imagem. 2.1.5 Algoritmos de Intersecção A principal função em um algoritmo de Ray Tracer é detectar se determinado raio colide ou não com um objeto. Um algoritmo de intersecção, assim como os demais algoritmos, é considerado ótimo, quando ele chega a um resultado com o menor número possível de cálculos. Nesse sentido, para que um Ray Tracer seja considerado eciente utilizam-se algoritmos que através de um número pequeno de cálculos já conseguem prever se determinado raio pode vir a colidir com determinado objeto. Caso essa armação seja verdadeira, então são realizados cálculos

2 Fundamentação Teórica 31 mais complexos am de determinar com exatidão o ponto do objeto em que o raio colidiu (dado pela distância dessa colisão, uma vez que já se tem a equação da reta a partir do vetor direção do raio). É necessário garantir que o algoritmo retornará o objeto colidido mais próximo a seu ponto de origem, pois os demais objetos na rota de colisão não serão alcançados por um raio originado na câmera (raio primário), e sim, talvez, por raios originados em outros objetos (raios secundários). Para isso, a cada iteração do algoritmo, quando é vericado se o objeto realmente colide com tal raio, é vericado também se a distância em que esta colisão ocorre é menor do que a distância dos cálculos anteriores. Nos algoritmos, o tipo de retorno é comumente denido por constantes numéricas (GLASSNER, 1989): HIT - O Raio intercepta o objeto, MISS - O raio não intercepta o objeto e INPRIM - O raio está dentro do objeto. 2.2 GPU - Conceitos O hardware gráco, é talvez a parte mais poderosa, em termos de processamento, nos computadores para usuários comuns. Seus chips, conhecidos como Unidades Grácas de Processamento, ou GPUs - Graphics Processing Units, passaram de dispositivos periféricos à modernos, poderosos, e ecientes processadores programáveis. Muitos pesquisadores e desenvolvedores se mostraram interessados em estudar, aprimorar e, sobretudo, aproveitar o alto desempenho fornecido pelo hardware gráco (OWENS et al., 2005). O hardware gráco tem sido otimizado para a rasterização de triângulos, guardar informações de cor e profundidade de pixels etc. Mais recentemente, a computação de pixels e cores se tornou programável, dando liberdade ao programador, enquadrar as utilidades do hardware de acordo com suas necessidades. Com a criação de tais programas, os pixel shaders, sugiram modelos computacionais evoluídos, que suportam modelos sosticados de colorização e texturização. Com o avanço das técnicas de pixel shaders, combinados com a otimização da computação de triângulos, estão sendo alcançados realismos impressionantes em

2 Fundamentação Teórica 32 imagens sintetizadas em tempo real (LOOP; BLINN, 2006). Além do cálculo de colorização, os programas podem ser utilizados para o cálculo de diversos algoritmos, bastando que os dados a ele passados e retornados sejam mascarados através de texturas. Esta área de programação em GPU se denomina GPGPU (General-Purpose Computing on Graphics Processing Units ) e consiste em usar o alto processamento gráco para o processamento de dados não grácos. Figura 2.8: Desempenho de Ponto-utuante nas GPUs. Retirado de (OWENS et al., 2005) A gura 2.8 mostra a evolução da computação de pontos-utuantes por segundo das GPU's em relação aos processadores. Nesta gura pode-se observar que, mesmo com o ganho de desempenho com o surgimento dos processadores dual-core, seu poder de processamento de pontos-utuantes está muito aquém do apresentado pelas placas de vídeo, que sofreram um grande avanço em quatro anos. O grande avanço das GPUs em comparação com as CPUs não se dá em função do emprego de metais semicondutores de melhor qualidade nem da grande tecnologia empregada no processo de fabricação, uma vez que tanto os fabricantes de GPUs como de CPUs possuem tecnologia avançada e utilizam metais semicondutores de alta eciência. Tal avanço se dá em função da arquitetura utilizada nos processadores: CPUs são otimizados para alta performance em códigos seqüenciais, assim, muitos dos seus transistores são dedicados ao suporte de tarefas não compu-

2 Fundamentação Teórica 33 tacionais, como os utilizados para a memória cache. Em contrapartida, o elevado paralelismo do hardware gráco permite que GPUs utilizem mais transistores para a computação, alcançando assim, elevado grau de processamento aritmético com o mesmo número de transistores (OWENS et al., 2005). 2.2.1 Pipeline de Processamento Todo o processamento de uma GPU é feito através de um pipeline. Este pipeline é desenvolvido para permitir um grande paralelismo entre as execuções das tarefas da GPU. Um pipeline é dividido em diferentes etapas, sendo que as primitivas geométricas passam por todas elas. Cada uma destas etapas é implementada de forma separada no hardware, constituindo tarefas processadas paralelamente (CHRISTEN, 2005). Figura 2.9: Pipeline de uma GPU A entrada do pipeline (gura 2.9) é a lista de geometrias expressas em vértices na coordenada do objeto; a saída é o próprio framebuer (conjunto de pixels que compõem a imagem). O primeiro estágio do pipeline, (vertex), transforma cada vértice do espaço do objeto para o espaço da tela e realiza cálculos de iluminação em cada vértice. A saída desta etapa são triângulos no espaço da cena. O próximo estágio (rasterização) consiste em rasterizar, ou seja, determinar a posição na tela de cada triângulo e interpolar os parâmetros de cada vértice do triângulo. Como resultado, esta etapa fornece cada pixel que compõe cada triângulo, este resultado é chamado de fragment. O terceiro estágio (fragment) computa a colorização para cada pixel, usando os valores de interpolação calculados no estágio

2 Fundamentação Teórica 34 vertex. Esta implementação pode utilizar valores da memória global, guardados no formato de texturas; tipicamente, o estágio fragment gera endereços na memória de textura, atribui seus valores de textura associados, e os usa para computar a cor nal do pixel. No estágio nal os pixels são guardados em um vetor bidimensional, concluindo a passada pelo pipeline (OWENS et al., 2005). Entretanto, em função da grande diculdade de se programar um hardware gráco em baixo nível, foram criadas linguagens que manipulam e implementam funções dentro do pipeline da GPU em alto nível de programação. Estas linguagens são abordadas na próxima seção. 2.2.2 Linguagens para Colorização em Alto-Nível As linguagens para a manipulação em GPU tem algo em comum: são desenvolvidas em torno da idéia de que GPUs produzem imagens. Por isso, tais linguagens são comumente chamadas de linguagens de colorização (shading languages). Assim, as linguagens de colorização são linguagens que, compiladas em um shader para vértices e um shader para colorização de pixels, produzem uma imagem descrita pelo programa. Tais linguagens são vantajosas devido aos seguintes aspectos (NVIDIA, 2005): Uma linguagem de alto-nível é mais fácil de manipular, facilitando ajustes nos, durante a construção do shader. Por ser de rápida prototipagem, o ajuste da linguagem de shader pode ser resumido a uma vericação se o resultado visual obtido é satisfatório ou não, e caso não seja, manipula-se o código am de obter o resultado desejado; Os compiladores otimizam o código automaticamente e efetuam tarefas de baixo nível, como a alocação de registradores, muito suscetíveis a erros e falhas; Códigos para shading são mais fáceis de serem lidos e entendidos. Eles também permitem que novos shaders sejam criados através de modicações em um outro shader;

2 Fundamentação Teórica 35 Shaders construídos em uma linguagem de alto nível são facilmente portados para uma ampla gama de plataformas de hardware, diferentemente dos shaders escritos em código Assembly. Atualmente um shader pode ser desenvolvido em HLSL, GLSL e Cg (ENGEL, 2003). Estas três linguagens serão descritas nas próximas subseções: 2.2.2.1 Cg A linguagem Cg (C for Graphics) é baseada em C, se parecendo exatamente como um código em C, apresentando a mesma sintaxe de declaração de variáveis, chamadas de funções, e tipos de dados. Esta linguagem é elaborada pela Nvidia em colaboração com a Microsoft, e está na versão 2.0 (2.0.0015) 1. Esta linguagem permite a escrita de programas para os processadores de vértices e pixels. O código em Cg pode ser compilado em código Assembly entendido pela GPU, assim como executado na hora, de acordo com a demanda (um arquivo lido e interpretado) (NVIDIA, 2005). A Nvidia disponibiliza juntamente com a linguagem Cg uma especicação de shader denominada CgFX. Esta especicação é destinada à artistas grácos e desenvolvedores de aplicações em tempo real. Este formato fornece vários bene- cios, entre eles (NVIDIA, 2005): Encapsulamento de múltiplas técnicas de rendering, permitindo manipulação de níveis de detalhe, funcionalidades e desempenho; Suporte para linguagem Cg em Assembly, e shaders de função xa; Parâmetros editáveis e funções para a Interface Gráca de CgFX 2 embutidas no arquivo; Múltiplos shaders. Assim, em termos práticos, juntando shaders para vértices em Cg e shaders para pixels, desenvolvedores podem criar um efeito completo, através de 1 Documentação da linguagem: http://developer.nvidia.com/object/cg_toolkit.html 2 http://developer.nvidia.com/object/fx\_composer\_home.html

2 Fundamentação Teórica 36 uma linguagem simples e bem difundida na literatura. O manual apresentado em (NVIDIA, 2005) aborda os formalismos e métodos de programação em Cg e CgFX. 2.2.2.2 HLSL A linguagem HLSL 3 (High Level Shader Language é uma linguagem proprietária desenvolvida pela Microsoft para uso com a API Direct3D. Esta linguagem é muito similar com a Cg, pois foi desenvolvida juntamente com ela, e foi incluída na versão nove da biblioteca do DirectX, fornecida pela Microsoft. A linguagem HLSL não possui uma versão atual especíca, uma vez que ela faz parte da biblioteca de manipulação gráca DirectX (ENGEL, 2003). A linguagem HLSL permite que seu código seja executado a partir da leitura (carregamento do aplicativo) ou a partir do código Assembly, compilado por um compilador incluído no pacote de desenvolvimento do DirectX (DirectX SDK) e suporta os shaders de vértice e pixel, além de um shader de geometria. O shader de geometria realiza um processamento por primitiva, permitindo seleção de material e detecção de silhuetas. Este shader pode gerar novas primitivas para, por exemplo, gerar volumes de sombra por extrusão, ou texturização multi-facial de um cubo com renderização de uma única passada (ENGEL, 2003). 2.2.2.3 GLSL A GLSL 4 (OpenGL Shading Language) é uma linguagem de shader criada para a utilização no pipeline de render da bibliotéca gráca OpenGL. O pipeline do OpenGL permite que qualquer estado utilizado pelo shader seja automaticamente obtido e fornecido aos shaders. Isto permite que a aplicação use os estados do OpenGL para manipulação e utilização nos shaders (KESSENICH, 2006). A linguagem GLSL assim como a HLSL fornece os processadores de vértices e pixels, permitindo que sejam alteradas tanto as informações do posicionamento dos vértices que compõem uma primitiva como os dados resultantes da colorização da mesma. Suas variáveis, funções e tipos de dados são denidos de 3 http://msdn.microsoft.com/en-us/library/bb509561(vs.85).aspx 4 http://www.opengl.org/documentation/glsl/

2 Fundamentação Teórica 37 forma semelhante à linguagem C. Os shaders da linguagem GLSL são simplesmente um conjunto de strings que são passadas pelo driver do hardware da placa gráca para compilação. Dessa forma, os shaders podem ser criados em tempo de execução, ou lidos de uma arquivo (KESSENICH, 2006). Este trabalho utiliza a linguagem Cg (C for Graphics) pois ela apresenta ampla especicação, concentrada no site da Nvidia 5, e a existência de fóruns de discussão sobre o assunto. Assim, a partir do grande desempenho da computação pixel-a-pixel efetuada pelas GPUs, mesmo as destinadas à usuários domésticos, pretende-se utilizar aceleração por hardware gráco como maneira de aumentar o desempenho do Ray Tracer em questão. Utilizar a linguagem Cg para computar a colorização de um pixel nal pode vir a ser uma maneira simples (devido à facilidade de implementação de uma linguagem de alto-nível e ampla abordagem na literatura) em contrapartida a grande complexidade em se otimizar um Ray Tracer. 5 http://developer.nvidia.com/object/cg_toolkit.html

38 3 Ampliação das Funcionalidades do Ray Tracer Neste capítulo são abordadas as funcionalidade adicionadas ao Ray Tracer previamente desenvolvido. Entre as funcionalidades que foram adotadas encontra-se a malha de triângulos, sendo através dela que se pode testar o desempenho do algoritmo comparando o tempo de rendering de cenas complexas (muitos triângulos) para cenas mais simples (poucos triângulos). Outra funcionalidade abordada neste capítulo é a texturização das primitivas, que permite a elaboração de cenas com maior realidade, simulando efeitos e cores, além da reexão e transparência. Dessa forma, neste capítulo serão explanados os testes de intersecção raio-triângulos e a texturização das primitivas. Através da renderização de triângulos e esferas se torna possível a geração de primitivas mais complexas, aumentando assim a capacidade de representar diferentes modelos e objetos. 3.1 Novas primitivas Nesta seção são abordados os testes de intersecção para os triângulos. Testes de intersecção em Ray Tracers são calculados determinando se os raios partindo da câmera em direção à cena intersectam ou não com determinada primitiva. A equação de um raio é denida por: R(t) = P + t ˆd 0 t (3.1) onde, P é o ponto de origem e ˆd é o vetor direção ( d) normalizado. A nova primitiva adicionada ao Ray Tracer é a malha de triângulos. Para a malha de triângulos faz-se necessário especicar um modelo de arquivo que contenha as informações de topologia e geometria que denam o posicionamento dos triângulos na cena.

3 Ampliação das Funcionalidades do Ray Tracer 39 3.1.1 Malhas de Triângulos Um objeto pode ser representado de várias formas possíveis, seja por equações matemáticas que o dena (utilizado nas esferas e planos renderizadas por este Ray Tracer), chamadas de equações quadráticas, ou através de componentes planares, como os três pontos coplanares que denem um triângulo. Essas duas formas são comumente usadas em Ray Tracers por apresentarem um cálculo mais simplicado de intersecção raio-primitivas (SCHNEIDER; EBERLY, 2002). Uma malha de triângulos é um conjunto de triângulos que juntos formam um objeto mais complexo. A exibilidade de uma malha permite que todas as guras geométricas possam ser representadas através dela, entretanto seu uso se torna um problema quando em peças muito complexas (com uma grande variação de posições e muitos triângulos) justamente pelo fato do número de triângulos acarretar em um elevado tempo de render. Cada triângulo de uma malha possui as informações de sua geometria (posição de cada um de seus três vértices no espaço 3D). Dessa forma, o cálculo de intersecção de uma malha de triângulos se dá através do teste de intersecção de um raio com todos os triângulos dessa primitiva. Assim, o Ray Tracer não manipula a malha como somente um objeto, e sim como um conjunto de triângulos (GLASSNER, 1989). Entretanto, para que o Ray Tracer possa ler as informações de um objeto denido por uma malha de triângulos, faz-se necessário denir um tipo de arquivo deste tipo. Para este trabalho é utilizado o formato 3ds, pois ele apresenta uma ampla divulgação de primitivas na Internet, além de elevado número de software, como o Wings 3D 1, que fazem a conversão de outros formatos para este. O leitor desenvolvido para esta especicação foi retirado de (VELSEN; FERCOQ, 1997). Embora este formato de arquivo contenha informações para outros tipos de primitivas, como quadriláteros, curvas etc. todas elas serão ignoradas na leitura, sendo pertinente somente as informações sobre triângulos. Com a topologia da malha de triângulos englobada nas informações da 1 Wings 3D - http://www.wings3d.com

3 Ampliação das Funcionalidades do Ray Tracer 40 cena é possível determinar as intersecções de cada raio com os objetos pertencentes a esta cena. Assim, dene-se a seguir como é calculada a interseção raio-triângulo para os triângulos existentes na cena. 3.1.1.1 Intersecções Raio-Triangulo Segundo (SCHNEIDER; EBERLY, 2002), uma maneira de calcular a intersecção de um componente linear com um triângulo seria, vericar a intersecção dele com um plano que contenha o triângulo, e, após isso, determinar se este ponto de intersecção esta dentro do triângulo. Para se determinar se o ponto está realmente dentro do triângulo pode-se simplesmente calcular a projeção dos vértices do triângulo e do ponto em um plano alinhado a um dos eixos e assim vericar a intersecção pontotriângulo em 2D. Esta técnica, embora simplique o cálculo nal da intersecção, exigirá que seja calculado o vetor normal para cada triângulo. Entretanto, uma melhor abordagem é estipulada por (MOLLER; TRUM- BORE, 1997 apud SCHNEIDER; EBERLY, 2002): um triângulo é simplesmente um sequência de vértices {V 0, V 1, V 2 }, e qualquer ponto em um triângulo pode ser denido por sua posição relativa aos seus vértices (SCHNEIDER; EBERLY, 2002): Q u,v,w = wv 0 + uv 1 + vv 2 (3.2) onde u + v + w = 1. A tupla (u, v, w) é chamada de coordenada de baricentro de Q, mas como w = 1 (u + v) então somente o par (u, v) é usado. Uma intersecção raio-triangulo pode ser dada pela substituição da equação 3.1 na equação 3.2: P + t ˆd = (1 (u + v))v 0 + uv 1 + vv 2 (3.3) que pode ser expandida em: [ ˆd ] V 1 V 0 V 2 V 0 t u v = [P V 0] (3.4) Como cada uma dessas variáveis são vetores, pode-se vericar que este é um sistema de três equações lineares, com tres variáveis desconhecidas. Uma maneira de resolver este sistema é através da regra de Cramer(SCHNEIDER; EBERLY, 2002):

3 Ampliação das Funcionalidades do Ray Tracer 41 Assim, pela regra de Cramer, temos: t P V u = 1 0 V 1 V 0 V 2 V 0 ˆd V 1 V 0 V 2 V ˆd P V 0 V 2 V 0 0 v ˆd V 1 V 0 P V 0 ((P V 1 0 ) (V 1 V 0 ) (V 2 V 0 ) = ( ˆd ( (V 2 V 0 )) (V 1 V 0 ) ˆd (V 2 V 0 )) (P V 0 ) ((P V 0 ) (V 1 V 0 )) ˆd (3.5) (3.6) Quando a equação é resolvida para t, u, e v, ca possível determinar a intersecção com o triângulo vericando seus valores para que satisfaçam a seguinte condição: 0 u 1, 0 v 1, e u + v 1. Caso esta condição seja alcançada, a intersecção ocorre dentro do triangulo, caso contrário a intersecção ocorre no plano do polígono, mas fora do triângulo. O seguinte pseudocódigo apresentado por (SCHNEIDER; EBERLY, 2002) verica a intersecção raio-tirângulo: bool I n t e r s e c L i n h a T r i a n g u l o ( { Triangulo3D t r i, Linha3D linha, I n t e r& info, f l o a t epselon, Ponto3D& i n t e r s e c c a o ) Vetor3D e1, e2, p, s, q ; f l o a t t, u, v, tmp ; e1 = t r i. v1 t r i. v0 ; e2 = t r i. v t r i. v0 ; p = Cross ( l i n h a. direcao, e2 ) ; tmp = Dot (P, e1 ) ; i f (tmp > epselon && tmp < epselon ) return f a l s e ; tmp = 1. 0 / tmp ; s = l i n h a. origem t r i. v0 ;

3 Ampliação das Funcionalidades do Ray Tracer 42 u = tmp Dot ( s, p) ; i f (u < 0. 0 u> 1. 0 ) return f a l s e ; i f (u + v > 1. 0 ) return f a l s e ; t = tmp Dot ( e2, q ) ; } i n f o. u = u ; i n f o. v = v ; i n f o. t = t ; i n t e r s e c c a o = l i n h a. origem + t l i n h a. d i r e c a o ; return true ; Dessa forma ca possível computar se um determinado raio intersepta os triângulos de uma malha, vericando a condição para cada triangulo pertencente à esta malha. Caso esta intersecção ocorra, são então calculados os valores de colorização em função da luz e cor do objeto. Como o número de triângulos em uma malha é proporcional à qualidade do objeto que esta malha representa (quanto mais triângulos mais suavizado o objeto é), a quantidade de triângulo causará um maior número de testes de intersecção e, consequentemente, um maior custo computacional para a renderização da cena. Isto justica o fato de comumente a renderização de malhas de triângulos estar vinculada à algoritmos de aceleração, abordados na seção 5. 3.2 Texturização A texturização é utilizada para dar maior realismo aos objetos de uma cena. Atribuir uma cor única ao objeto, mesmo que esta varie de acordo com a iluminação, torna a imagem nal muito aquém do realismo de uma cena com objetos que utilizem texturização. A texturização permite que as cores do objeto variem e sejam controladas por mapas (guras) de cores. Comumente utilizam-se bitmaps para a texturização de objetos. Segundo (AZEVEDO; CONCI, 2003), um

3 Ampliação das Funcionalidades do Ray Tracer 43 bitmap é uma imagem produzida por uma matriz xa de pixels coloridos. Assim, qualquer arquivo de imagem pode ser lido e a partir do mesmo pode ser obtido a matriz de cores da textura. Entretanto, faz-se necessário determinar para cada pixel resultante da intersecção de um raio com uma primitiva texturizada, qual é o pixel correspondente na textura, ou seja, denir um pixel no espaço 2D da textura que represente um pixel no espaço 3D do objeto. Isto é feito através do mapeamento UV. Os pixels correspondentes a um objeto 3D na textura são comumente chamados de texels (AKENINE-MOLLER; HAINES, 2002), e são os menores elementos de uma textura (texture element). Um texel é obtido em função dos valores u e v, que nada mais são do que as coordenadas correspondentes à largura e a altura da imagem, respectivamente. Assim, todo o cálculo de texturização vem em função de determinar para um ponto em um objeto no espaço da cena [x, y, z], um valor correspondente a sua textura no espaço bidimensional da imagem [u, v] (BARSHATZKY, 1992). Esse cálculo, em síntese, é em função da projeção da imagem no objeto. As funções de projeção comumente usadas são as esféricas, cilíndricas e planares (BIER; SLOAN, 1986; BARSHATZKY, 1992; LANDER, 2000); porém outras formas podem ser utilizadas. Por exemplo, as normais de um objeto podem ser utilizadas a m de determinar o valor do texel em uma textura, criando assim efeitos diferentes para peças com normais suavizadas (pouca transição entre normais vizinhas) e normais não suavizadas (muita transição entre normais vizinhas). A projeção esférica lança pontos sobre uma esfera imaginária centrada em torno de um ponto, tendo seu mapeamento baseado nas suas coordenadas polares. Para a obtenção de u, a esfera é analisada em todo o seu comprimento (comprimento da circunferência) que é 2π radianos. Assim, a matriz da textura tem sua longitude computada em 0 para o ponto inicial e 2π para o ponto extremo. De semelhante forma, o cálculo de v é em função da metade da esfera que é de π radianos e a latitude do texel correspondente na textura varia de 0 a π (AKENINE- MOLLER; HAINES, 2002). Para projeções cilíndricas os valores u da projeção são calculados da

3 Ampliação das Funcionalidades do Ray Tracer 44 mesma forma como na projeção esférica. Já os valores v são computados em função da distância em torno do eixo de denição do cilindro. Esta projeção é útil para objetos com eixos de denição, como superfícies de revolução. Entretanto, esta projeção ocasiona distorções quando a superfície é quase perpendicular ao eixo de denição do cilindro (BARSHATZKY, 1992). Projeções planares são como um projetor de slides, onde os raios são projetados em uma direção e a textura é aplicada em todas as superfícies do objeto. Projeções planares utilizam a projeção ortográca, que faz com que todos raios de textura cheguem com um mesmo ângulo ao objeto (AKENINE-MOLLER; HAINES, 2002). Entretanto, os valores obtidos para u e v são reais, enquanto o posicionamento em uma matriz de textura é inteiro. Isto permite que um mesmo pixel de textura seja utilizado para pontos vizinho em uma primitiva, causando um erro de visualização e diminuindo o realismo da imagem nal. Para solucionar este problema, utiliza-se a ltragem de texturas (BIKKER, 2004a). Figura 3.1: Mapeamento Bilinear. Retirado de (BIKKER, 2004a) A ltragem de texturas utilizada neste trabalho é a bilinear. Esta ltragem consiste em calcular três pixels vizinhos a um texel (pixel utilizado na textura) e, com base na área utilizada por cada um desses quatro pixels, calcular a média da colorização entre eles. A gura 3.1 mostra quatro pixels de uma textura sendo utilizados. Para o desenvolvimento do Ray Tracer em questão são utilizados os mapeamentos planares e esféricos. O mapeamento planar é feito para os planos e