Jump to content
ragecom

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

Recommended Posts

Então,

Eu tenho tentado entender como funciona o famoso 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 ray-tracing é tão pesado computacionalmente falando. Até andei conversando no Whatsapp com alguns 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.

Share this post


Link to post
Share on other sites

[Eu tentando entender o tal do que você escreveu sobre o  ray-tracing - Parte 1]

 

Te falar que achei interessante, e entendi a primeira parte de vc explicando a colisão do ray tracing e o que ela calcula. depois danou-se

  • Like 1

Share this post


Link to post
Share on other sites

Tem esse vídeo aqui (em inglês) que não explica exatamente como Ray Tracing funciona em si, mas compara os efeitos de texturas pré-rasterizadas, e texturas PBR que usam calculos baseado em física, ou seja usa Ray Tracing...mas para entender o conteúdo do vídeo, é necessário saber como as texturas funcionam em um modelo 3D, ou seja em um modelo só de um objeto ou parte dele, você encontra de 3 a 5 texturas em camadas para dar realismo, que são:
 

Albedo/diffuse = textura de cor, Normal/bump = textura de geometria, specular, ou gloss = textura que determina o brilho e reflexão da luz, Ambient occlusion = textura que determina a sombra própria refletida de uma superfície perpendicularmente na outra, e temos também outras texturas que podem ser usadas, como Height Map, Metallic e Roughness Map...


Quanto mais texturas usadas em um objeto 3D, e boa resolução da mesma, maior as chances do Ray Tracing ser Eficaz no modelo e trazer o realismo desejado, por isso é importante saber como cada mapeamento de textura funciona.

Observe que as mesmas texturas são usadas no jogos, sem que o Ray tracing esteja configurado para rebater inúmeras vezes a luz, e muita vezes dependendo da cena...também se usa a técnica/truque de Baking na iluminação e fica parecendo que o objeto usa Ray tracing...além disso, somente é "perceptível" por gamers em objetos que usam mapeamento Gloss/Metallic e Roughness Map, ou seja objetos polidos, lisos ou objetos com superfície uniformes, como por exemplo no caso do agrupamento continuo ou não, das moléculas de agua, ou seja uma poça, ou rio.

 

 

Falow!!!

Share this post


Link to post
Share on other sites

Resumindo toda essa salada aí:

Ray Tracing tem como objetivo deixar os jogos mais pesados para as placas de vídeo da série GTX e forçar o usuário trouxa a gastar um rim humano com as novas placas RTX sem real necessidade.

 

  • Like 2

Share this post


Link to post
Share on other sites
17 horas atrás, Neo disse:

Resumindo toda essa salada aí:

Ray Tracing tem como objetivo deixar os jogos mais pesados para as placas de vídeo da série GTX e forçar o usuário trouxa a gastar um rim humano com as novas placas RTX sem real necessidade.

 

AO MENOS O JOGO VAI SER MAIS REAL QUE A REALIDADE

  • Like 1

Share this post


Link to post
Share on other sites
22 horas atrás, Snayperskaya disse:

AO MENOS O JOGO VAI SER MAIS REAL QUE A REALIDADE

Deixa eu ir correndo ali tirar meu rim pra comprar uma RTX 2080ti que não consegue atingir os clocks especificados pela Nvidia.

Hahahahahah

Que piada essas RTX.

Edit: e pra rodar só o BF5 com o RT ativado.

Edited by Neo

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×