Ir para conteúdo
Entre para seguir isso  
ragecom

[Eu tentando entender o tal do ray-tracing - Parte 1] Uma solução básica para identificar como raios interceptam uma esfera

Posts Recomendados

Então,

 

Eu tenho tentado entender como funciona o ray-tracing, e resolvi postar aqui à medida que eu vou lendo. Na verdade o que me levou a começar a estudar isso é um desejo de tentar compreender porque o famoso ray-tracing é tão pesado computacionalmente falando. Até andei conversando no Whatsapp com alguns dos chapas sobre isso no nosso grupo tem umas duas semanas. Mas antes de tudo, queria dizer que 1) apesar de eu ser de computação, nunca tive nenhum contato com computação gráfica, então algumas das minhas "conclusões" vão ser óbvias para quem já estudou a fundo esse tópico e; 2) vou tentar escrever da forma mais simples e compreensível que eu conseguir. Eu tenho um background matemático ok na minha opinião, mas sei que nem todo mundo tem.

 

Então... Qual é a do ray-tracing? A ideia é até simples, mas antes vou estabelecer alguns termos pra deixar claro sobre o que eu estou falando:

 

. Câmera - seria um "olho" imaginário que é de onde se enxerga a cena.
. Renderização - é o processo de transformar um conjunto de modelos 3D em uma imagem 2D, que depende do ponto de vista da câmera.

 

Ok, vamos ao ray-tracing: a parada é disparar um "tiro": um raio imaginário para cada pixel, a partir do ponto de vista da câmera. Até aqui, é o que sempre foi feito: calcular parâmetros associados à colisão desse raio imaginário com o sólido que foi colidido para determinar a cor exata daquele pixel. Claro, esses parâmetros são definidos no próprio sólido, e são associados à cor, à transparência, à absorção de luz do objeto, e por ai vai.

 

O ray-tracing faz a mesma coisa, mas quando colide, ele define mais outros três vetores: um de reflexão, um de refração e um de sombra. Até ai, ok, mas o grande lance, e que é o que faz as renderizações ficarem fodas, é que o mesmo processo é repetido para a colisão destes vetores de forma recursiva, ou seja, criando "reflexões de reflexões", e dependendo da quantidade de vezes que essa recursão ocorrerá, o resultado é que uma imagem bastante realista será criada. Pensem em duas esferas espelhadas (como bolas de natal) viradas uma pra outra na cena - se o ray tracing tiver 10 recursões, será possível observar 10 esferas uma "dentro" do outra e cada uma cada vez menor que a outra, que é uma reflexão extremamente realista.

 

Por outro lado, essa recursão tem um custo computacional alto, ainda mais se a gente parar pra pensar que se espera atingir o ray tracing em 4K, que seria esse cálculo do parágrafo anterior feito 530.841.600 por segundo, tendo como meta 60 fps.

 

Tá, beleza... Como eu falei, eu não sou um cara de computação gráfica, então comecei a ler do início. O que acontece quando um dos "tiros" do ray-tracing acerta uma esfera? Bem, tem três coisas que podem acontecer:

 

1) Ele acertou na "borda" da esfera. Nesse caso, o tiro acertou no ponto onde o plano tangente toca a esfera, ou seja, atingiu a esfera em apenas um ponto.
2) O tiro acertou a esfera por um lado e saiu pelo outro. Nesse caso, o tiro passa por algum plano secante, atingindo a esfera duas vezes.
3) O tiro não atingiu a esfera.

 

Ok, agora vem a parte legal. Mas pra isso, por favor, tenham paciência comigo. Eu não estou escrevendo num editor LaTeX (lol :P) então vamos adotar umas convenções aqui:

 

. sqrt é raiz quadrada, ou seja, sqrt(4) = 2
. ^ é exponenciação, ou seja, 2^2 = 4

 

Beleza, a equação genérica que define uma esfera é (x - x0)^2 + (y - y0)^2 + (z - z0)^2 = r^2 onde,

 

r é o raio da esfera,
x, y e z são as coordenadas espaciais em R3 (euclidiano de três dimensões) do centro da esfera, e
x0, y0 e z0 são as coordenadas espaciais em R3 da origem. Óbvio que se o centro for a origem, eles são dispensáveis.

 

Mas meio que foda-se as coordenadas. Pra gente generalizar, dá pra escrever na notação vetorial assim: ||x - c||^2 = r^2 onde,

 

r é o raio da esfera,
c é o centro (as coordenadas estão embutidas aí dentro desse c), e
x são os pontos da esfera.

 

Agora vamos definir uma equação genérica de segmento de reta: x = o + dl onde,

 

x são os pontos do segmento de reta,
o é a origem do segmento de reta,
d é o tamanho do segmento de reta
l é um vetor de direção.

 

Então, juntando as duas a gente tem a seguinte equação:

 

(o + dl - c)^2 = r^2

 

Dai, desenvolvendo essa equação a gente chega no formato da equação do segundo grau:

 

d^2(l*l) + 2d(l(o - c)) + (o - c)(o - c) - r^2 = 0

 

Vou pular o desenvolvimento da equação. Resolvendo ela, chegamos ao seguinte resultado:

 

d = -(l(o - c)) +- sqrt(l(o - c)^2 - (o - c)^2 + r^2)

 

O que de, novo, nos dá três possibilidades:

 

1) Se o resultado daquela raiz quadrada ali for maior que zero, existem duas soluções para d, ou seja, o segmento de reta passou pelo plano secante e o "tiro" pegou na entrada e na saída da esfera.
2) Se o resultado for exatamente 0, só existe uma solução de d: o tiro bateu no ponto onde o plano tangente toca a esfera.
3) Se o resultado da raiz quadrada for menor que zero, não há solução (o tiro não atingiu a esfera).

 

E assim, com geometria básica, conseguimos identificar as formas de como um tiro de ray-tracing atinge uma esfera a partir da câmera. Dá pra notar também que não há complexidade algorítmica significativa aqui, e que esse exemplo não leva em consideração a angulação do tiro em relação à esfera, justamente pra facilitar o entendimento (até porque na real, não se usaria uma equação pra definir um segmento de reta secante, e sim um segmento de reta até onde o tiro "entrou" na esfera, e os outros três vetores do ray-tracing seriam calculados).

 

À medida que eu for compreendendo mais coisas (como um tiro atinge outras formas geométricas, como a luminosidade influencia na cor, etc), vou postando. Caso alguém ache um erro no que eu escrevi, corrige ai: vamos aprender juntos.

Editado por ragecom

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citar

 

In the mood for light reading? Nvidia is writing a book on ray tracing
By Paul Lilly an hour ago

Developers can read it for free.
 

In a just a few more weeks, Nvidia can claim it wrote the book on ray tracing, or at least a book on the topic. Work has already begun, and Nvidia is planning to make a hardback version available mid-March at GDC and GTC. What's the point?

 

"Our main goal with this book is educating developers at all levels about important concepts and the state of the art in ray tracing, with an emphasis on real-time rendering," Nvidia explains.


Titled "Ray Tracing Gems," Nvidia promises the book will not be a survey of the field of ray tracing, as such tomes already exist. Instead, Nvidia says its book will highlight techniques that are not typically covered in general texts. It will also include tutorials on newer technologies and guides on best practices for solving problems.

More than a passing curiosity for Nvidia, the GPU maker has a vested commercial interest in ray tracing, which is the staple feature of its Turing GPU architecture. Even without it, the company's GeForce RTX 2080 Ti is the best graphics card for gaming, but it's the allure of realistic light reflections driven by ray-traced rendering that is the main selling point.

Ironically, it's also what holds the card back. Sales of the GeForce RTX series as a whole have not met Nvidia's expectations, with the company recently admitting that some customers have put off upgrading in anticipation of lower price points and "further demonstrations of RTX technology in actual games." Or put another way, the cards are pricey and support is lacking at the moment.

 

Undeterred, Nvidia is part of a larger industry push to usher in the era of real-time ray tracing in the mainstream market. Microsoft is part of that push with its DirectX Raytracing (DXR) API, and eventually it's reasonable to expect both AMD and Intel will implement support in future GPU architectures.

 

"The introduc­tion of explicit ray tracing acceleration features into graphics hardware is a major step toward bringing real-time ray tracing into common usage. Combining the sim­plicity and inherent parallelism of ray tracing with the accessibility and  horsepower of modern GPUs brings real-time ray tracing performance within the reach of every graphics programmer. However, getting a driver‘s license isn‘t the same as winning an automobile race. There are techniques to be learned. There is experience to be shared. As with any discipline, there are tricks of the trade. When those tricks and techniques are shared by the experts who have contributed to this text, they truly become gems," ray tracing pioneer J. Turner Whitted wrote in the book's Forward.

 

In the lead up to the hardcover launch, Nvidia is making available the entire text for free to its registered developers in seven PDF chunks. The first of those is available now, with more to follow every few days. It doesn't cost anything to register as a developer, in case anyone is in the mood for some light reading (ba-dum tish!).

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
Entre para seguir isso  

×

Informação Importante

Ao utilizar este site, você está automaticamente concordando com os nossos Termos de Uso e regras..