L'échantillonnage de l'hémisphère pondéré en cosinus nécessite-t-il toujours NdotL lors du calcul de la contribution à la lumière indirecte?

12

Lors de la conversion de l'échantillonnage uniforme de l'hémisphère en échantillonnage de l'hémisphère pondéré en cosinus, je suis confus par une déclaration dans un article.

Ma contribution indirecte actuelle est calculée comme suit:

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

Où le produit scalaire est cos (θ)

Mais dans cet article sur un meilleur échantillonnage ( http://www.rorydriscoll.com/2009/01/07/better-sampling/ ), l'auteur suggère que le PDF est (cos (θ) / pi), et il n'y a aucune preuve de le calcul de N point L.

Ma question est - cela signifie-t-il que je n'ai plus besoin d'effectuer la dot rayDirection normale parce qu'elle est incluse dans le PDF, ou est-ce en plus du pdf?

Steven
la source

Réponses:

12

Vous devez toujours multiplier le terme cosinus (cela fait partie de l'équation de rendu). Bien que lorsque vous diffusez indirectement en utilisant le lancer de rayons et donc l'intégration monte-carol (qui est la technique la plus courante dans ce cas), vous devez diviser la contribution de chaque échantillon par votre PDF . Ceci est bien illustré ici .

Notez également que dans la référence mentionnée, si le PDF contient des termes que vous trouvez également dans les équations de rendu, vous pouvez optimiser le code si vous le souhaitez en annulant ces termes.

N'oubliez pas que le BRDF d'une surface diffuse est ρ / π où ρ représente l'albédo de surface. Nous devons donc diviser le résultat par π. Bien que dans le cas de la composante diffuse indirecte, n'oubliez pas que nous aurions dû diviser le résultat de castRay par le PDF de la variable aléatoire, qui comme nous l'avons montré plus haut dans ce chapitre est 1 / (2π). Diviser indirectDiffuseby 1 / (2π) équivaut à multiplier cette valeur par 2π. Et comme l'albédo est également divisé par π nous pouvons simplifier le code ...

Vous avez une situation similaire. Si vous regardez le PDF pour l'échantillonnage du cosinus, vous vous rendrez compte que les termes peuvent être annulés. Ce qui ne veut pas dire qu'ils ne sont «pas» strictement nécessaires. Ils le sont, ils s'annulent simplement ce qui permet d'optimiser légèrement le code (et d'éviter quelques divisions, multiplications, etc.). Vous êtes plus dans la micro-optimisation ici ... ce qui peut être déroutant si vous essayez d'apprendre la théorie en regardant simplement du code optimisé (qui n'est souvent pas correctement commenté).

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

user18490
la source
1
Je vous remercie! Ça a du sens. Intuitivement, je savais que c'était nécessaire mais je n'ai pas reconnu qu'il s'agissait d'une optimisation.
Steven
5
Juste pour être sûr que cela est explicite .. non seulement l'hémisphère pondéré en cosinus est une optimisation car il prend moins d'instructions, c'est aussi une optimisation car il converge plus rapidement. Il faut moins d'échantillons pour obtenir un meilleur résultat. Il s'agit d'une forme d'échantillonnage d'importance.
Alan Wolfe
Exactement - c'était mon désir car j'essaie de réduire le nombre d'échantillons pour les calculs indirects dans mon lightmapper.
Steven