Saltar para o conteúdo

Traçado de raio

Origem: Wikipédia, a enciclopédia livre.
(Redirecionado de Ray Tracing)
Nota: Se procura pelo método de calcular o caminho de ondas ou partículas, veja Ray tracing (física)
Imagem renderizada com traçado de raio pelo POV-Ray
Imagem renderizada com ray-tracing adicionando sombras e smooth

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.

Reflexões e refracções de um raio e as componentes

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.

  • Raios reflectidos;
  • Raios refractados;
  • Raios de sombra.

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.

Trajectória do Raio Sombra

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.

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

  1. «Ciência Hoje - Revista de Divulgação Científica da Sociedade Brasileira para o Progresso da Ciência». 10 (55-60): 45 

Ligações externas

[editar | editar código-fonte]