A amostragem do hemisfério ponderado por cosseno ainda requer NdotL ao calcular a contribuição para a luz indireta?


12

Ao converter de uma amostra uniforme do hemisfério para uma amostra do hemisfério ponderado pelo cosseno, fico confuso com uma declaração em um artigo.

Minha contribuição indireta atual é calculada como:

Vec3 RayDir = UniformGenerator.Next()
Color3 indirectDiffuse = Normal.dot(RayDir) * castRay(Origin, RayDir)

Onde o produto escalar é cos (θ)

Porém, neste artigo sobre melhor amostragem ( http://www.rorydriscoll.com/2009/01/07/better-sampling/ ), o autor sugere que o PDF seja (cos (θ) / pi) e não há evidências de o cálculo de N pontos L.

Minha pergunta é: isso significa que não preciso mais executar o rayDirection de ponto normal porque ele está incluído no PDF ou é um acréscimo ao pdf?

Respostas:


12

Você sempre precisa multiplicar pelo termo cosseno (isso faz parte da equação de renderização). Embora quando você difunde indiretamente usando ray-tracing e, portanto, integração monte-carol (que é a técnica mais comum nesse caso), você deve dividir a contribuição de cada amostra pelo seu PDF . Isso é bem examinado aqui .

Observe também que, na referência mencionada, se o PDF tiver termos que você também encontra nas equações de renderização, você poderá otimizar o código, se desejar, cancelando esses termos.

Não esqueça que o BRDF de uma superfície difusa é ρ / π onde ρ representa o albedo da superfície. Então, precisamos dividir o resultado por π. Embora, no caso do componente difuso indireto, não se esqueça de que deveríamos ter dividido o resultado do castRay pelo PDF da variável aleatória, que, como mostramos anteriormente neste capítulo, é 1 / (2π). DividirDiffus indireto por 1 / (2π) equivale a multiplicar esse valor por 2π. E como o albedo também é dividido por π, podemos simplificar o código ...

Você tem uma situação semelhante. Se você olhar o PDF para a amostragem de cosseno, perceberá que os termos podem ser cancelados. O que não significa que eles não sejam estritamente necessários. Eles são apenas cancelados um ao outro, o que permite otimizar um pouco o código (e evitar algumas divisões, multiplicações etc.). Você está mais na micro-otimização aqui ... o que pode ser confuso se você tentar aprender a teoria apenas olhando para o código otimizado (que geralmente não é comentado adequadamente).

(cos(θ)...)PDF=(cos(θ)...)cos(θ)π=...


1
Obrigado! Isso faz sentido. Intuitivamente, sabia que era necessário, mas não reconhecia que era uma otimização.
5307 Steven

5
Apenas para garantir que isso seja explícito. O hemisfério ponderado por cosseno não é apenas uma otimização, pois requer menos instruções, mas também uma otimização, porque converge mais rapidamente. São necessárias poucas amostras para obter um melhor resultado. Esta é uma forma de amostragem de importância.
Alan Wolfe

Exatamente - esse era meu desejo, pois estou tentando reduzir o número de amostras para cálculos indiretos no meu medidor de luz.
516 Steven
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.