J'essaie d'implémenter la réfraction et la transmission dans mon traceur de trajectoire et je ne suis pas sûr de savoir comment l'implémenter. Tout d'abord, quelques informations:
Lorsque la lumière frappe une surface, une partie de celle-ci se réfléchit et une partie est réfractée:
La quantité de lumière réfléchie par rapport aux réfractés est donnée par les équations de Fresnel
Dans un traceur récursif, la mise en œuvre simple serait de tirer un rayon pour la réflexion et un rayon pour la réfraction, puis de faire une somme pondérée à l'aide du Fresnel.
Cependant, dans le traçage de chemin, nous ne choisissons qu'un seul chemin. Voici ma question:
- Comment choisir de réfléchir ou de réfracter de manière non biaisée
Ma première supposition serait de choisir au hasard en fonction du Fresnel. Alias:
float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
// Reflect
} else {
// Refract
}
Serait-ce correct? Ou dois-je avoir une sorte de facteur de correction? Puisque je ne prends pas les deux chemins.
la source
Réponses:
TL; DR
Oui, vous pouvez le faire comme ça, il suffit de diviser le résultat par la probabilité de choisir la direction.
Réponse complète
Le sujet de l'échantillonnage dans les traceurs de chemin permettant des matériaux avec réflexion et réfraction est en fait un peu plus complexe.
Commençons par quelques antécédents. Si vous autorisez les BSDF - et pas seulement les BRDF - dans votre traceur de chemin, vous devez vous intégrer sur toute la sphère au lieu de l'hémisphère positif. Les échantillons de Monte Carlo peuvent être générés par différentes stratégies: pour l'éclairage direct, vous pouvez utiliser BSDF et l'échantillonnage de lumière, pour l'éclairage indirect, la seule stratégie significative est généralement l'échantillonnage BSDF. Les stratégies d'échantillonnage elles-mêmes contiennent généralement la décision concernant l'hémisphère à échantillonner (par exemple, si la réflexion ou la réfraction est calculée).
Dans la version la plus simple, l'échantillonnage de la lumière ne se soucie généralement pas beaucoup de la réflexion ou de la réfraction. Il échantillonne les sources de lumière ou la carte de l'environnement (le cas échéant) en ce qui concerne les propriétés de la lumière. Vous pouvez améliorer l'échantillonnage des cartes d'environnement en sélectionnant uniquement l'hémisphère dans lequel le matériau a une contribution non nulle, mais le reste des propriétés du matériau est généralement ignoré. Notez que pour un matériau Fresnel parfaitement lisse, l'échantillonnage de la lumière ne fonctionne pas.
Pour l'échantillonnage BSDF, la situation est beaucoup plus intéressante. Le cas que vous avez décrit concerne une surface de Fresnel idéale, où il n'y a que deux directions contributives (puisque Fresnel BSDF n'est en fait qu'une somme de deux fonctions delta). Vous pouvez facilement diviser l'intégrale en une somme de deux parties - une réflexion et une pour la réfraction. Comme, comme vous l'avez mentionné, nous ne voulons pas aller dans les deux sens dans un traceur de chemin, nous devons en choisir un. Cela signifie que nous voulons estimer la somme des nombres en choisissant un seul d'entre eux. Cela peut être fait par une estimation de Monte Carlo discrète: choisissez l'un des additifs au hasard et divisez-le par la probabilité qu'il soit sélectionné. Dans un cas idéal, vous voulez que la probabilité d'échantillonnage soit proportionnelle aux addends, mais comme nous ne connaissons pas leurs valeurs (nous n'aurions pas à estimer la somme si nous les connaissions), nous les estimons simplement en négligeant certains facteurs. Dans ce cas, nous ignorons la quantité de lumière entrante et utilisons uniquement la réflectance / transmittance de Fresnel comme estimations.
La routine d'échantillonnage BSDF pour le cas d'une surface de Fresnel lisse consiste donc à choisir une des directions au hasard avec une probabilité proportionnelle à la réflectance de Fresnel et, à un certain point, à diviser le résultat pour cette direction par la probabilité de choisir la direction. L'estimateur ressemblera à:
Dans le cas de modèles BSDF plus sophistiqués comme ceux basés sur la théorie des microfacets, l'échantillonnage est légèrement plus complexe, mais l'idée de diviser l'intégrale entière en une somme finie de sous-intégrales et d'utiliser ensuite Monte Carlo discret peut généralement être appliquée aussi.
la source