Rastreamento de caminho e materiais

8

Estou pensando sobre a técnica usada ao amostrar um material em camadas para o próximo evento em um rastreador de caminho. Eu tenho um material com três camadas: uma base difusa, lobos especulares e brilhantes. Como escolher uma camada discreta para amostrar para a próxima direção do raio? Esta é apenas uma seleção aleatória? Em caso afirmativo, pesos iguais são atribuídos às camadas ou pesos usados ​​com base na contribuição final de um lobo? Obrigado por qualquer insight sobre esse estágio de amostragem.

~ M

Mark Davies
fonte

Respostas:

12

Esta questão está um pouco relacionada a esta .

Como Alan já disse, seguir o caminho real da luz através de cada camada leva a resultados mais precisos fisicamente. Baseará minha resposta em um artigo de Andrea Weidlich e Alexander Wilkie ( "Superfícies de micro- facetas em camadas arbitrárias" ) que li e que parcialmente implementei. No artigo, os autores assumem que a distância entre duas camadas é menor que o raio de um elemento de área diferencial. Essa suposição simplifica a implementação porque não precisamos calcular pontos de interseção separadamente para cada camada; na verdade, assumimos que todos os pontos de interseção sobre as camadas são exatamente o mesmo ponto.

Segundo o artigo, dois problemas devem ser resolvidos para renderizar o material em várias camadas. O primeiro é amostrar adequadamente as camadas e o segundo é encontrar o BSDF resultante gerado pela combinação dos vários BSDFs encontrados ao longo do caminho de amostragem.

ATUALIZAÇÃO: Na verdade, adotei um método diferente para implementar a avaliação desse modelo em camadas. Embora tenha mantido a idéia de considerar os pontos de interseção como sendo o mesmo ponto ao longo das camadas, calculei a amostragem e o BRDF final de maneira diferente: para a amostragem, usei o traçado de raios comum, mas através das camadas (usando o método russo Roleta para selecionar entre reflexão / refração quando for o caso); para a avaliação final do BRDF, apenas multiplico cada BRDF percorrido pelo caminho do raio (ponderando as radiações incidentes de acordo com o cosseno do raio incidente).

Amostragem

Nesta primeira etapa, determinaremos o caminho real da luz através das camadas. Quando um raio de luz está se movendo de um meio menos denso, por exemplo, ar, para um meio mais denso, por exemplo, vidro, parte de sua energia é refletida e a parte restante é transmitida. Você pode encontrar a quantidade de energia refletida nas equações de refletância de Fresnel . Assim, por exemplo, se a refletância de Fresnel de um dado dielétrico for 0,3, sabemos que 30% da energia é refletida e 70% serão transmitidos:

insira a descrição da imagem aqui

Quando o raio de luz está passando de um meio mais denso para um meio menos denso, aplica-se o mesmo princípio descrito pela refletância de Fresnel. No entanto, nesse caso específico, a reflexão interna total (também conhecida como TIR) também pode ocorrer se o ângulo do raio incidente estiver acima do ângulo crítico. No caso de TIR, 100% da energia é refletida de volta no material:

insira a descrição da imagem aqui

Quando a luz atinge um condutor ou uma superfície difusa, ela sempre será refletida (sendo a direção da reflexão relacionada ao tipo de BRDF). Em um material multicamada, o caminho da luz resultante será o resultado agregado de todas essas possibilidades. Assim, no caso de um material de 3 camadas, assumindo que a primeira e a segunda camadas são dielétricas e a terceira camada é difusa, podemos terminar, por exemplo, com o seguinte caminho de luz (uma árvore, na verdade):

insira a descrição da imagem aqui

Podemos simular esse tipo de interação usando a recursão e ponderando cada caminho de luz de acordo com a refletância / transmitância real nos pontos de incidente correspondentes. Um problema em relação ao uso da recursão nesse caso é que o número de raios aumenta com a profundidade da recursão, concentrando o esforço computacional em raios que individualmente podem contribuir quase nada para o resultado final. Por outro lado, o resultado agregado desses raios individuais em níveis de recursão profunda pode ser significativo e não deve ser descartado. Nesse caso, podemos usar a Roleta Russa (RR) para evitar ramificações e caminhos probabilísticos da luz final sem perder energia, mas ao custo de uma variação mais alta (resultado mais ruidoso). Nesse caso, o resultado da refletância de Fresnel, ou o TIR, será usado para selecionar aleatoriamente o caminho a seguir. Por exemplo:

insira a descrição da imagem aqui

Como pode ser visto, a refletância TIR ou Fresnel pode manter alguns raios refletindo indefinidamente entre as camadas. Tanto quanto eu sei, a Mitsuba implementa o plástico como um material de duas camadas e usa uma solução de forma fechada para este caso específico, responsável por um número infinito de luz que salta entre as camadas. No entanto, a Mitsuba também permite a criação de materiais multicamadas com um número arbitrário de camadas; nesse caso, impõe um número máximo de rejeições internas, pois parece não existir uma solução de forma fechada para o caso geral. Como efeito colateral, um pouco de energia pode ser perdida no processo de renderização, tornando o material mais escuro do que deveria eventualmente ser.

Na minha atual implementação de material multicamada, eu permito um número arbitrário de rejeições internas ao custo de tempos de renderização mais longos (bem ... na verdade, eu implementei apenas duas camadas .. uma dielétrica e uma difusa :).

Uma opção adicional é misturar ramificação e RR. Por exemplo, os raios iniciais (níveis mais baixos de profundidade) podem apresentar uma contribuição substancial para a imagem final. Assim, pode-se optar por ramificar apenas nas primeiras uma ou duas interseções, usando apenas RR posteriormente. Este é, por exemplo, o método usado pelo smallpt .

Um ponto interessante em relação aos materiais multicamadas é que os raios refletidos / transmitidos individuais podem ser amostrados por importância de acordo com os BRDFs / BTDFs correspondentes de cada camada.

Avaliando o BSDF final

Considerando o seguinte caminho de luz calculado usando RR:

insira a descrição da imagem aqui

Podemos avaliar a quantidade total de radiação Lrrefletida por um BSDF de multicamadas, considerando cada camada como um objeto individual e aplicando a mesma abordagem usada no rastreamento de caminho comum (ou seja, o brilho que sai de uma camada será o brilho incidente da próxima camada). O estimador final pode, portanto, ser representado pelo produto de cada estimador de Monte Carlo individual:

Lr=(fr1cosθ1pdf1(fr2cosθ2pdf2(fr3cosθ3pdf3(fr2cosθ4pdf2(Lifr1cosθ5pdf1)))))

Como todos os termos do estimador são multiplicados, podemos simplificar a implementação calculando o BSDF final e pdf e fatorando o Li prazo:

fr=fr1fr2fr3fr2fr1

pdf=pdf1pdf2pdf3pdf2pdf1

cosθ=cosθ1cosθ2cosθ3cosθ2cosθ1

Lr=(frcosθpdf)Li

O artigo de Andrea Weidlich e Alexander Wilkie também leva em consideração a absorção, ou seja, cada raio de luz pode ser atenuado de acordo com o fator de absorção de cada camada transmissiva e sua espessura. Ainda não incluí a absorção no meu renderizador, mas ele é representado por apenas um valor escalar, que será avaliado de acordo com a Lei da Cerveja .

Abordagens alternativas

O renderizador Mitsuba usa uma representação alternativa para material de múltiplas camadas com base na "tabulação das funções de refletância em uma base de Fourier". Ainda não mergulhei nisso, mas pode ser interessante: " Uma estrutura abrangente para renderização de materiais em camadas ", de Wenzel Jacob et al . Há também uma versão expandida deste artigo.

Christian Pagot
fonte
11
Quero perguntar (esperando que você se lembre do artigo) se você tem certeza de adicionar termos de cosseno para cada camada? Pelo que entendi, calculamos a equação de renderização apenas na camada superior. Descemos para determinar a direção final de saída e para determinar o BRDF. Perco alguma coisa?
Mustafa Işık
@ MustafaIşık Você está certo, no artigo eles não adicionam os termos de cosseno ao BRDF final. Na verdade, adotei uma abordagem um pouco diferente da proposta no artigo (incluirei isso na minha resposta). No artigo, eles propõem a definição de um BRDF exclusivo a partir dos BRDFs em camadas. Achei o processo de derivação um pouco confuso: 1) Não entendo por que eles adicionam BRDFs individuais (acho que devem ser multiplicados);
Christian Pagot
@ MustafaIşık 2) como você apontou, não há multiplicação pelo termo cosseno (eu acho que você precisa, porque estamos considerando apenas a energia que é incidente em uma área diferencial); 3) eles não desenvolvem a expressãot=(1G)+T21G; 4) Não sei se eles diluíram o termo cosseno dentro do BRDF; 5) também, TIR pode causar perda de energia. Por essas razões, decidi traçar cada raio usando a Roleta Russa para decidir por refração ou reflexão, ao custo de tempos de renderização mais longos do que os eventualmente obtidos por eles.
Christian Pagot
11
O documento parece direto, mas não é porque nem todos os termos nem estratégias são explicados com clareza suficiente para uma implementação exata. É influente, no entanto. O seu é mais como uma simulação evitada pelo papel, mas mais preciso.
Mustafa Işık
3

Pensando nisso do ponto de vista físico, parece que funcionaria como uma versão generalizada do cálculo difuso / especular.

Você começaria com a camada superior e usaria fresnel etc. para calcular uma porcentagem de luz que reflete vs transmite. Em seguida, você usa um número aleatório para determinar qual deles deve ser utilizado na sua amostra.

No caso da reflexão, você faria o lóbulo especular da camada superior, refletiria da superfície e seguiria em frente.

No caso de transmissão, você passaria para a segunda camada.

Nesta camada, você calcularia novamente a porcentagem de chance de refletir vs transmitir.

No caso da reflexão, você usaria o lóbulo especular dessa segunda camada, faria a reflexão e seguir em frente.

No caso de transmissão, você passaria para a camada interna.

Para essa camada mais interna, você descobriria novamente se precisava refletir ou transmitir.

Para reflexão, você usaria o lóbulo especular desta camada interna.

Para transmissão, você faria seu cálculo difuso ou o que mais sua superfície interna desejar fazer para a luz transmitida (dispersão de sub-superfície? Refração? Etc).

Não tenho certeza se cada camada deve fazer sua própria refração e se tecnicamente você deve mover o raio um pouco entre as camadas para obter efeitos mais realistas. Para o seu caso, pode não fazer diferença.

Mas basicamente, se você tivesse uma esfera com três camadas, ela deveria se comportar como se você tivesse três esferas diferentes aninhadas uma na outra, cada uma com uma única camada que lidava com transmissão versus reflexão.

Ter um material em camadas é apenas uma maneira mais compacta de dizer que é isso que você deseja, em comparação com os três objetos separados.

Alan Wolfe
fonte