Atualmente, estou tentando implementar um rastreador de caminho de Monte Carlo. Eu fiz algumas pesquisas e parece que uma abordagem comum dos materiais é usar um modelo em camadas. Algo assim:
Quando a luz atinge a superfície, Fresnel nos diz quanto dessa luz é refletida pela primeira camada e quanto vai para a segunda, e assim por diante.
Então fiz algo parecido, mas mais simples: apenas uma camada de especular e outra de difusa. Nenhuma transmissão ainda. Até aqui tudo bem, uso um brdf simples com cosseno para o meu difuso e o modelo microfacetado Cook-Torrance para o meu especular.
Agora vem a parte difícil: o que devo fazer quando um raio atingir a superfície? Normalmente, eu selecionava o brdf correspondente ao material da superfície, mostrava uma direção da luz incidente, avaliava o brdf e dividia pela função de distribuição de probabilidade correta.
Mas aqui, uma batida na superfície corresponde efetivamente a vários materiais. A maneira ingênua de lidar com isso seria fazer uma amostra uma vez para cada camada atingida. Mas isso claramente é fonte de um enorme impacto no desempenho, fazendo com que meu caminho se torne efetivamente uma árvore.
Existe uma solução melhor?