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:
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:
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):
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:
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:
Podemos avaliar a quantidade total de radiação eurrefletida 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:
eur= (fr1 1porqueθ1 1p df1 1(fr2porqueθ2p df2(fr3porqueθ3p df3(fr2porqueθ4p df2(euEufr1 1porqueθ5p df1 1) ) )))
Como todos os termos do estimador são multiplicados, podemos simplificar a implementação calculando o BSDF final e p df e fatorando o euEu prazo:
fr = fr1 1⋅ fr2⋅ fr3⋅ fr2⋅ fr1 1
p df= p df1 1⋅ p df2⋅ p df3⋅ p df2⋅ p df1 1
porqueθ = cosθ1 1⋅ cosθ2⋅ cosθ3⋅ cosθ2⋅ cosθ1 1
eur= (fr cosθp df)euEu
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.
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.
fonte