-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Desde os anos 80, O Path Tracing é uma técnica bastante conhecida na Computação Gráfica que possui como intuito simular o comportamento de um raio de luz em uma cena e seus objetos. Essa técnica possui como principal aplicação criar imagens ou animações extremamente realistas, mas sua execução é extremamente lenta, principalmente na época de sua concepção. Com o avanço do poder computacional, já nos anos 90 haviam aplicações capazes de reproduzir um algoritmo baseado em Path Tracing em computadores pessoais, como o Bryce 3D.
Porém, tal técnica se mostrou bastante popular em animações 3D, através da Pixar - pioneira na área e que usaremos um algoritmo otimizado por eles, mas ainda não era possível reproduzir em tempo real. Até a NVIDIA conseguir esse feito com um algoritmo menos custoso, o Ray Tracing, e otimizado para sua arquitetura CUDA.
A diferença entre Ray Tracing e Path Tracing é bem tênue, muitos autores consideram o Path Tracing apenas uma versão aprimorada do Ray Tracing, isso se deve por conta das diferentes formas de se resolver o mesmo problema: Como simular a luz?
O Ray tracing ocorre quando raios que se dirigem para câmera (ou visão) atingem um objeto. Múltiplos raios são então projetados a partir desse ponto de origem em direção às várias fontes de luz. Esses raios podem interagir com outros objetos ou alcançar suas fontes de luz, dependendo de onde pousam. As informações são coletadas e calculadas para o ponto original do raio, e essas informações geram a imagem. Isso simula de certa forma o que a luz realmente faz.
Já o Path Tracing ocorre quando o raio atinge um objeto e depois reflete para tentar alcançar uma fonte de luz. Ele fará isso tantas vezes quantas forem necessárias até alcançar a fonte de luz. Isso é como a luz realmente se comporta; cada cálculo de reflexão fornece mais dados e, além disso, o tamanho e a forma real da fonte de luz também são relevantes. Isso representa uma simulação real da luz.
Por isso, o Path Tracing é mais realista e mais custoso. Jogos com RTX geralmente implementam o Ray Tracing, ou um Híbrido com o Path Tracing. Atualmente apenas animações e renderizadores que não são em tempo real usam o Path Tracing de forma integral (Por curiosidade, apenas alguns jogos possuem somente Path Tracing, como o Quake II RTX)
Podemos implementar o Path Tracing como um algoritmo recursivo simples baseado em Monte Carlo. Para calcular a cor de um pixel de imagem, diversos raios são rastreados a partir do ponto de vista através desse pixel, de forma randômica. Quando um raio intersecta uma superfície, a iluminação direta das fontes de luz é calculada para o ponto de interseção (o que inclui o rastreamento de raios de sombra entre as fontes de luz e o ponto de interseção).
Além disso, um novo raio é gerado para calcular a iluminação indireta. A direção do novo raio é escolhida estocasticamente com base nas propriedades de espalhamento de luz do material da superfície: especular ou opaco, reflexivo ou refrativo. Quando tal raio atinge outra superfície, a iluminação direta é calculada lá (incluindo o rastreamento de mais raios de sombra), um novo raio é gerado e assim por diante. As cores de todos os raios em todas as profundidades contribuem para a cor do pixel do raio de origem. A recursão para quando o novo raio não atinge uma superfície, ou quando uma profundidade máxima de recursão predefinida é alcançada.
O que gera a seguinte imagem:
A Figura mostra imagens renderizadas com Path Tracing com 1, 16 e 256 amostras por pixel na cena da caixa apresentada. A imagem à esquerda foi renderizada rapidamente, mas possui muito ruído, gerado pelo término abrupto da recursão ou pelo não encontro do raio na superfície; as outras imagens levaram mais tempo para serem renderizadas, mas têm muito menos ruído. Apesar do ruído, um artista pode formar uma opinião sobre a iluminação e os materiais na cena mesmo com apenas algumas amostras por pixel, ou seja, após algumas iterações em uma sessão interativa.
Para calcular o raio, usaremos uma interpolação linear, em que um raio R tem a função
Para que o projeto funcione, precisamos de alguns objetos para renderizar, para isso vamos implementar as formas geométricas essenciais: Esfera, Quadriláteros e Triângulos. Eles serão armazenados em uma lista chamada HitList em que o raio irá fazer uma varredura para saber se acertou algum elemento.
Para qualquer objeto, para desenhá-lo na imagem basta apenas um raio o acertar. Assim, devemos encontrar uma forma de calcular como o nosso raio intercepta uma esfera.
Com o algoritmo finalizado, é perceptível o quão lento é com cenários muito complexos. Assim, para termos um tempo razoável para renderizar, vamos atacar na maior lentidão: A checagem se um objeto foi realmente acertado por um raio.
O algoritmo AABB