Qu'est-ce que l'échantillonnage d'importance? Chaque article que j'ai lu parle de «PDF», qu'est-ce que c'est aussi?
D'après ce que je comprends, l'échantillonnage en importance est une technique qui consiste à n'échantillonner que les zones d'un hémisphère plus importantes que d'autres. Donc, idéalement, je devrais échantillonner les rayons vers les sources de lumière pour réduire le bruit et augmenter la vitesse. En outre, certaines BRDF à des angles de pâturage ont peu ou pas de différence dans le calcul, alors utilisez-vous un échantillonnage par importance pour éviter cela?
Si je devais mettre en œuvre un échantillonnage d'importance pour une BRDF Cook-Torrance, comment pourrais-je procéder?
brdf
importance-sampling
Arjan Singh
la source
la source
Réponses:
Réponse courte:
Échantillonnage d'importance est une méthode pour réduire la variance dans l'intégration de Monte Carlo en choisissant un estimateur proche de la forme de la fonction réelle.
PDF est l'abréviation de Probability Density Function . Apdf(x) donne la probabilité qu'un échantillon aléatoire soit généré x .
Longue réponse:
Pour commencer, examinons ce qu'est l'intégration de Monte Carlo et à quoi elle ressemble mathématiquement.
L’intégration de Monte Carlo est une technique permettant d’estimer la valeur d’une intégrale. Il est généralement utilisé lorsqu'il n'y a pas de solution de forme fermée à l'intégrale. Cela ressemble à ceci:
En anglais, cela signifie que vous pouvez approximer une intégrale en faisant la moyenne des échantillons aléatoires successifs de la fonction. LorsqueN devient grand, l’approximation se rapproche de plus en plus de la solution. pdf(xi) représente la fonction de densité de probabilité de chaque échantillon aléatoire.
Faisons un exemple: Calculer la valeur de l'intégraleI .
Utilisons Monte Carlo Integration:
Un programme python simple pour calculer ceci est:
Si on lance le programme on obtientI=0.4986941
En utilisant la séparation par pièces, nous pouvons obtenir la solution exacte:
L’échantillonnage d’importance ne fonctionne pas n'échantillant uniformément. Au lieu de cela, nous essayons de choisir plus d’échantillons qui contribuent beaucoup au résultat (important) et moins d’échantillons qui contribuent peu au résultat (moins important). D'où le nom, l'importance d'échantillonnage.
Un exemple d’échantillonnage d’importance dans le suivi de trajectoire est la manière de choisir la direction d’un rayon après qu’il atteigne une surface. Si la surface n'est pas parfaitement spéculaire (miroir ou verre), le rayon sortant peut se trouver n'importe où dans l'hémisphère.
Nous pourrions échantillonner uniformément l'hémisphère pour générer le nouveau rayon. Cependant, nous pouvons exploiter le fait que l’équation de rendu a un facteur de cosinus:
Plus précisément, nous savons que tous les rayons à l’horizon seront fortement atténués (en particulier,cos( x ) ). Ainsi, les rayons générés près de l'horizon ne contribueront pas beaucoup à la valeur finale.
To combat this, we use importance sampling. If we generate rays according to a cosine weighted hemisphere, we ensure that more rays are generated well above the horizon, and less near the horizon. This will lower variance and reduce noise.
In your case, you specified that you will be using a Cook-Torrance, microfacet-based BRDF. The common form being:
where
The blog "A Graphic's Guy's Note" has an excellent write up on how to sample Cook-Torrance BRDFs. I will refer you to his blog post. That said, I will try to create a brief overview below:
The NDF is generally the dominant portion of the Cook-Torrance BRDF, so if we are going to importance sample, the we should sample based on the NDF.
Cook-Torrance doesn't specify a specific NDF to use; we are free to choose whichever one suits our fancy. That said, there are a few popular NDFs:
Each NDF has it's own formula, thus each must be sampled differently. I am only going to show the final sampling function for each. If you would like to see how the formula is derived, see the blog post.
GGX is defined as:
To sample the spherical coordinates angleθ , we can use the formula:
whereξ is a uniform random variable.
We assume that the NDF is isotropic, so we can sampleϕ uniformly:
Beckmann is defined as:
Which can be sampled with:
Lastly, Blinn is defined as:
Which can be sampled with:
Putting it in Practice
Let's look at a basic backwards path tracer:
IE. we bounce around the scene, accumulating color and light attenuation as we go. At each bounce, we have to choose a new direction for the ray. As mentioned above, we could uniformly sample the hemisphere to generate the new ray. However, the code is smarter; it importance samples the new direction based on the BRDF. (Note: This is the input direction, because we are a backwards path tracer)
Which could be implemented as:
After we sample the inputDirection ('wi' in the code), we use that to calculate the value of the BRDF. And then we divide by the pdf as per the Monte Carlo formula:
Where Eval() is just the BRDF function itself (Lambert, Blinn-Phong, Cook-Torrance, etc.):
la source
wi
? I understand how to sample the spherical coordinates angle θ but for the actual direction vector how is that done?If you have a 1D functionf(x) and you want to integrate this function from say 0 to 1, one way to perform this integration is by taking N random samples in range [0, 1], evaluate f(x) for each sample and calculate the average of the samples. However, this "naive" Monte Carlo integration is said to "converge slowly", i.e. you need a large number of samples to get close to the ground truth, particularly if the function has high frequencies.
With importance sampling, instead of taking N random samples in [0, 1] range, you take more samples in the "important" regions off(x) that contribute most to the final result. However, because you bias sampling towards the important regions of the function, these samples must be weighted less to counter the bias, which is where the PDF (probability density function) comes along. PDF tells the probability of a sample at given position and is used to calculate weighted average of the samples by dividing the each sample with the PDF value at each sample position.
With Cook-Torrance importance sampling the common practice is to distribute samples based on the normal distribution function NDF. If NDF is already normalized, it can serve directly as PDF, which is convenient since it cancels the term out from the BRDF evaluation. Only thing you need to do then is to distribute sample positions based on PDF and evaluate BRDF without the NDF term, i.e.
For NDF you need to calculate Cumulative Distribution Function of the PDF to convert uniformly distributed sample position to PDF weighted sample position. For isotropic NDF this simplifies to 1D function because of the symmetry of the function. For more details about the CDF derivation you can check this old GPU Gems article.
la source