Google Summer of Code 2011

Nessa Segunda-feira saiu o resultado de que meu projeto foi selecionado no Google Summer of Code 2011!

Enviei duas propostas para a organização BRL-CAD. Essa organização desenvolve um programa de modelagem de sólidos através de geometria construtiva sólida. Além do modelador, o software possui outras ferramentas, sendo a principal delas um raytracer para gerar imagens (2D) a partir dos sólidos (3D).

A minha primeira proposta consistia em portar aplicativos independentes já existentes de processamento de imagem, para formar uma biblioteca. Essa é uma tarefa essencialmente de refatoração. Não há muitas dificuldades, mas é um projeto trabalhoso.

A segunda proposta, a que foi aceita, era para melhorar o sistema de shaders do BRL-CAD. Bem por cima, podemos dizer que um shader define a textura do objeto. Podemos implementar shaders para representar vários tipos de materiais como vidro, nuvem, fogo, etc.

Um shader se relaciona diretamente com um raytracer. O raytracer gera imagens 2D a partir de imagens 3D, simulando o comportamento da luz. Imagine uma fonte de luz como uma lâmpada por exemplo. Ela emite infinitos raios de luz em várias direções. Alguns desses raios irão bater em objetos, outros virão diretamente para nosso olho e outros vão para outras direções. Os raios que batem em objetos serão refletidos/refratados em maior ou menor intensidade (por exemplo, um raio incidente a um pano preto quase não será refletido; em uma superfície metálica quase todo o raio que chega será refletido; em uma jarra de vidro o raio será parte refratado e parte refletido). A imagem que formamos do objeto é resultado dos raios que batem nesse objeto e vão para nosso olho.

Essa é uma descrição bem simplificada do comportamento da luz. Imagine que queremos simular esse comportamento computacionalmente. Para cada fonte de luz teríamos que emitir muitíssimos raios de luz e simular o caminho que ele faria. Porém, é certo que a maior parte desse raios jamais chegariam a nossos olhos (ou chegaria com uma intensidade desprezível), o que seria um desperdício computacional enorme.

A sacada é fazer o contrário! Fazer com que a luz siga o caminho inverso, começando a partir dos olhos! Simulamos o caminho percorrido por um raio e ao chegar em uma fonte de luz, saberemos qual é a cor desse raio. Dessa forma apenas simulamos raios que efetivamente chegam no olho.

Cena produzida através de ray tracing

Aonde entram os shaders nessa história? Vimos que os shaders definem as propriedades do material. Em geral, cada superfície está associada a um shader. Quando um raio bate nessa superfície, o shader definirá quanto do raio será refletido, quanto será refratado, qual a cor da superfície, etc. de acordo com o material/textura que ele representa. Porém, a quantidade de raios traçados é bem menor.

Atualmente os shaders do BRL-CAD são implementados em C e compilados como bibliotecas dinâmicas. O raytracer carrega dinamicamente as bibliotecas que serão necessárias para renderizar a cena. A ideia principal da minha proposta é implementar um novo sistema de shaders que possibilite o uso de shaders escritos em OSL.


Basicamente, a OSL é uma linguagem para escrever shaders. O código foi desenvolvido inicialmente pela Sony, que o tornou público em 2010. O diferencial da linguagem é que ela é desenvolvida especialmente para raytracers, de modo que ela emprega técnicas que prometem melhorar o desempenho desses algoritmos. O pacote vem com um compilador para shaders escritos em OSL (formato .osl) e são convertidos para o formato .oso. Além disso, vem um sistema de shaders que manipula os shaders.

Conclusão

O projeto em si é bastante desafiador visto que até um mês atrás nunca tinha ouvido falar de shaders. Além do mais, tenho que conciliar esse projeto com o final do meu mestrado, de forma que até 15 de Agosto terei que me esforçar bastante.

Estou bastante animado com esse projeto especialmente porque envolve o estudo de raytracing, sobre o qual tenho um grande interesse. Idealmente eu gostaria de terminar esse projeto e me envolver com outros projetos do BRL-CAD (ou outras organizações como o Yafaray) envolvendo ray tracers.

Vou focar os posts do blog nesse projeto, aproveitando para escrever sobre seu andamento. Espero que dê tudo certo!

Os comentários estão fechados.

%d bloggers like this: