Traçado de raio[1] (em inglês: Ray tracing) é um sistema computacional de computação gráfica usado para síntese (renderização/formação) de imagens tridimensionais, baseado na simulação do trajecto que os raios de luz percorreriam no mundo real, mas no sentido contrário (neste caso de trás para a frente); ou seja, no mundo real, os raios de luz são emitidos a partir de uma fonte de luz, percorrendo o espaço até encontrar um objecto. Após os raios de luz atingirem o objecto, estes são refractados ou reflectidos, de acordo com as características do objecto, nomeadamente, cor, textura e transparência, alterando assim a sua trajectória, e fazendo com que apenas uma infinitésima minoria desses raios que partiram da fonte de luz atinjam os olhos do observador. Assim sendo, neste sistema o observador passa a ser a fonte da luz, e desta forma apenas serão processados os raios que efectivamente são vistos pelo observador.
Para implementar computacionalmente a simulação real do caminho dos raios de luz, ainda é incomportável com os meios informáticos atuais, devido à quantidade de processamento exigido, seria um desperdício já que a quantidade de raios de luz que atingem o olho do observador (raios úteis) é extremamente pequena comparativamente com a quantidade de raios emitidos pela fonte.
Esta técnica apesar de, computacionalmente, ser muito mais exigente do que a técnica scanline rendering, é capaz de produzir um grau de fotorrealismo muito elevado tornando-se ideal para aplicações onde podemos, previamente, tratar a imagem, como no cinema, televisão e efeitos especiais, e menos adequado para aplicações em tempo real como jogos de computador onde a velocidade é crítica.
Descrição
O traçado-de-raio é um algoritmo recursivo que consiste em projetar, a partir do observador, um vetor (raio) por cada um dos pixeis constituintes da nossa cena/imagem, vetor este que irá intersectar os objetos que formam a cena em análise. As intersecções a que estão sujeitos cada um dos vetores projectados tem que ser confirmadas para todos os objetos que compõe a imagem a fim de determinar qual o que está mais próximo do observador.
Se um determinado raio não intersectar nenhum objeto no seu trajeto, é atribuído ao pixel, por onde o raio passa, a cor do fundo da cena. No caso de o raio intersectar algum objeto, e após ter-se confirmado que esta é a intersecção mais próxima do observador para esse mesmo raio, é necessário determinar a cor do pixel correspondente. Para tal é necessário calcular a iluminação no ponto da cena que o raio atinge, iluminação esta que pode ser proveniente diretamente de fontes de luz, pode ser luz proveniente de outro objeto que por reflexão ilumina o ponto que estamos a analisar, pode ser luz refractada transmitida através do objeto e que assim ilumina o ponto, ou pode ainda ser uma combinação de mais do que uma destas formas de iluminação, que é a situação mais comum.
Para a determinação das componentes de luz que atingem o ponto em análise, o algoritmo recorre a três tipos de raios diferentes a que chamamos de raios secundários.
Cada um destes raios possui características e objectivos diferentes que podem, facilmente, ser identificados pelo seu nome. A partir da intersecção destes raios secundários com os objectos, e de acordo com a informação que cada um deles transporta, o algoritmo calcula então as características da luz e qual a contribuição para a iluminação do ponto de intersecção do raio primário com o objecto.
Como podemos observar na figura um único raio pode ser reflectido e refractado indefinidamente, subdividindo-se em vários raios secundários, formando assim uma árvore de raios, mais ou menos, complexa, de acordo com a composição da nossa cena. Para conseguirmos processar esta informação, necessitamos de estabelecer um limite máximo de subdivisões. Um dos métodos utilizados para terminar a inspecção recursiva dos raios secundários, acontece quando a contribuição retornada pelos raios secundários para um determinado pixel, se torna inferior a um determinado valor mínimo previamente definido, ou então tal com referimos anteriormente, quando um raio primário não intersecta qualquer objecto dentro dos limites da cena pré-estabelecidos atribuindo nesse caso a cor de fundo ao pixel em análise.
As sombras são verificadas através de raios secundários que são lançados a partir do ponto de intersecção do raio primário com o objecto, em direcção ao foco de luz. Se no seu trajecto o raio voltar a cruzar-se com um objecto, é porque o ponto em análise se encontra na sombra, se não, é porque recebe luz directa.
Algoritmo
Para cada pixel da imagem
{
Criar um raio a partir do ponto de visão (observador) e que passe pelo PixelActual
Inicializar NearestT em INFINITO
Inicializar NearestObject em NULL
Para cada objecto da cena
{
Se a distância t da intercepção é menor que NearestT
{
Colocar NearestT = t distância da intercepção
Colocar NearestObject = ObjectoActual
}
}
}
Se NearestObject = NULL
{
Preencher PixelActual com a cor do fundo
}
Senão
{
Lançar um novo raio a cada fonte de luz para comprovar as sombras
Se a superfície é reflectora
{
gerar um raio reflector (recursivo)
}
Se a superfície é transparente
{
gerar um raio refractor (recursivo)
}
Usar NearestObject e NearestT para processar a função sombreado
Preencher este pixel com a cor resultante da função sombreado
}
}
Referências
↑«Ciência Hoje - Revista de Divulgação Científica da Sociedade Brasileira para o Progresso da Ciência». 10 (55-60): 45