O que é amostragem importante? Cada artigo que li sobre ele menciona 'PDF', o que é isso também?
Pelo que entendi, a amostragem de importância é uma técnica para apenas amostrar áreas de um hemisfério que importam mais que outras. Então, idealmente, eu deveria amostrar raios em direção a fontes de luz para reduzir o ruído e aumentar a velocidade. Além disso, alguns BRDFs em ângulos de pastejo têm pouca diferença no cálculo, então usar amostragem importante para evitar que seja bom?
Se eu fosse implementar amostragem importante para um BRDF da Cook-Torrance, como eu poderia fazer isso?
brdf
importance-sampling
Arjan Singh
fonte
fonte
Respostas:
Resposta curta:
A amostragem por importância é um método para reduzir a variação na integração de Monte Carlo, escolhendo um estimador próximo ao formato da função real.
PDF é uma abreviação de Probability Density Function . Um fornece a probabilidade de uma amostra aleatória gerada ser .pdf( X ) x
Resposta longa:
Para começar, vamos revisar o que é a Integração Monte Carlo e como ela é matematicamente.
Integração Monte Carlo é uma técnica para estimar o valor de uma integral. É normalmente usado quando não há uma solução de formulário fechado para a integral. Se parece com isso:
Em inglês, isso indica que você pode aproximar uma integral calculando a média de amostras aleatórias sucessivas da função. À medida que aumenta, a aproximação se aproxima cada vez mais da solução. representa a função de densidade de probabilidade de cada amostra aleatória.N pdf( xEu)
Vamos fazer um exemplo: calcula o valor da integral .Eu
Vamos usar a integração Monte Carlo:
Um programa python simples para calcular isso é:
Se o programa, obtemosEu= 0,4986941
Usando a separação por partes, podemos obter a solução exata:
Você notará que a solução de Monte Carlo não está correta. Isso ocorre porque é uma estimativa. Dito isto, como chega ao infinito, a estimativa deve se aproximar cada vez mais da resposta correta. Já em algumas execuções são quase idênticas à resposta correta.N N= 2000
Uma observação sobre o PDF: neste exemplo simples, sempre coletamos uma amostra aleatória uniforme. Uma amostra aleatória uniforme significa que toda amostra tem exatamente a mesma probabilidade de ser escolhida. Amostramos no intervalo , portanto,[ 0 , 2 π] p df( x ) = 1 / ( 2 π- 0 )
A amostragem de importância funciona por amostragem não uniforme. Em vez disso, tentamos escolher mais amostras que contribuam muito para o resultado (importante) e menos amostras que contribuem apenas um pouco para o resultado (menos importante). Daí o nome, amostragem importante.
Se você escolher uma função de amostragem cujo pdf corresponda muito à forma de , poderá reduzir bastante a variação, o que significa que você pode colher menos amostras. No entanto, se você escolher uma função de amostragem cujo valor seja muito diferente de , poderá aumentar a variação. Veja a figura abaixo: Imagem da dissertação de Wojciech Jarosz Apêndice Af f
Um exemplo de amostragem de importância no Path Tracing é como escolher a direção de um raio depois que ele atinge uma superfície. Se a superfície não for perfeitamente especular (isto é, um espelho ou vidro), o raio que sai pode estar em qualquer lugar do hemisfério.
Nós poderia uniformemente provar o hemisfério para gerar o novo raio. No entanto, podemos explorar o fato de que a equação de renderização tem um fator cosseno:
Especificamente, sabemos que quaisquer raios no horizonte serão fortemente atenuados (especificamente, ). Portanto, os raios gerados perto do horizonte não contribuirão muito para o valor final.porque( X )
Para combater isso, usamos amostragem importante. Se gerarmos raios de acordo com um hemisfério ponderado por cosseno, garantiremos que mais raios sejam gerados bem acima do horizonte e menos próximos do horizonte. Isso reduzirá a variação e reduzirá o ruído.
No seu caso, você especificou que usará um BRDF baseado em microfacet da Cook-Torrance. A forma comum é:
Onde
O blog "A nota de um gráfico" tem um excelente artigo sobre como experimentar os BRDFs da Cook-Torrance. Vou encaminhá-lo para o seu blog . Dito isto, tentarei criar uma breve visão geral abaixo:
O NDF é geralmente a porção dominante do BRDF de Cook-Torrance; portanto, se formos amostrar uma amostra importante, devemos amostrar com base no NDF.
Cook-Torrance não especifica um NDF específico para usar; somos livres para escolher o que melhor se adequar à nossa fantasia. Dito isto, existem alguns NDFs populares:
Cada NDF possui sua própria fórmula, portanto cada uma deve ser amostrada de maneira diferente. Eu só vou mostrar a função de amostragem final para cada um. Se você gostaria de ver como a fórmula é derivada, consulte a postagem do blog.
GGX é definido como:
Para amostrar o ângulo das coordenadas esféricas , podemos usar a fórmula:θ
onde é uma variável aleatória uniforme.ξ
Assumimos que o NDF é isotrópico, para que possamos amostrar uniformemente:ϕ
Beckmann é definido como:
Que pode ser amostrado com:
Por fim, Blinn é definido como:
Que pode ser amostrado com:
Colocando em prática
Vejamos um rastreador básico de caminho para trás:
IE. pulamos pela cena, acumulando cores e atenuação de luz à medida que avançamos. A cada salto, temos que escolher uma nova direção para o raio. Como mencionado acima, poderíamos amostrar uniformemente o hemisfério para gerar o novo raio. No entanto, o código é mais inteligente; A importância mostra a nova direção com base no BRDF. (Nota: Esta é a direção de entrada, porque somos um rastreador de caminho para trás)
O que poderia ser implementado como:
Depois de provarmos o inputDirection ('wi' no código), usamos isso para calcular o valor do BRDF. E então dividimos pelo pdf de acordo com a fórmula de Monte Carlo:
Onde Eval () é apenas a própria função BRDF (Lambert, Blinn-Phong, Cook-Torrance, etc.):
fonte
wi
? Eu entendo como amostrar o ângulo de coordenadas esféricas θ, mas para o vetor de direção real, como isso é feito?Se você possui uma função 1D e deseja integrar essa função de 0 a 1, uma maneira de realizar essa integração é tomar N amostras aleatórias no intervalo [0, 1], avaliar para cada amostra e calcule a média das amostras. No entanto, diz-se que essa integração "ingênua" de Monte Carlo "converge lentamente", ou seja, você precisa de um grande número de amostras para se aproximar da verdade do terreno, principalmente se a função tiver altas frequências.f( X ) f( X )
Com amostragem importante, em vez de coletar N amostras aleatórias no intervalo [0, 1], você coleta mais amostras nas regiões "importantes" de que mais contribuem para o resultado final. No entanto, como você polariza a amostragem para as regiões importantes da função, essas amostras devem ser ponderadas menos para compensar a polarização, que é onde o PDF (função de densidade de probabilidade) aparece. O PDF informa a probabilidade de uma amostra em determinada posição e é usado para calcular a média ponderada das amostras dividindo cada amostra com o valor do PDF em cada posição da amostra.f(X )
Com a amostragem de importância de Cook-Torrance, a prática comum é distribuir amostras com base na função de distribuição normal NDF. Se o NDF já estiver normalizado, ele poderá servir diretamente como PDF, o que é conveniente, pois cancela o termo da avaliação do BRDF. A única coisa que você precisa fazer é distribuir as posições das amostras com base no PDF e avaliar o BRDF sem o termo NDF, ou seja, E calcule a média dos resultados da amostra multiplicada pelo ângulo sólido do domínio em que você integra (por exemplo, para o hemisfério).
Para NDF, é necessário calcular a Função de distribuição cumulativa do PDF para converter a posição da amostra distribuída uniformemente em posição de amostra ponderada em PDF. Para NDF isotrópico, isso simplifica a função 1D devido à simetria da função. Para mais detalhes sobre a derivação do CDF, você pode conferir este artigo antigo da GPU Gems .
fonte