Comment combiner correctement les termes diffus et spéculaire?

18

Pour autant que je sache, dans un BRDF, le terme de Fresnel nous indique la probabilité qu'un photon soit réfléchi ou réfracté lorsqu'il frappe une surface.

Les photons réfléchis contribueront au terme spéculaire, tandis que les photons réfractés contribueront au terme diffus. Par conséquent, lorsque je détermine, de manière physique, la contribution d'une lumière à la couleur du matériau, je me sens tenté d'écrire simplement:

// Assuming for example:
//   diffuse = dot(L, N);
//   specular = pow(dot(H, N), alpha) * (alpha + 2.0) / 8.0;
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
color = lightIntensity * Lerp(diffuse * albedo, specular, fresnel);

Pourtant, je ne pense pas l'avoir jamais vu écrit de cette façon. J'ai vu le terme spéculaire pondéré selon le terme de Fresnel, mais pas le terme diffus. Dans son article largement référencé sur PBR , Sébastien Lagarde affirme même que l'utilisation de pour pondérer le terme diffus est incorrecte.(1-F)

Qu'est-ce que je rate?
J'apprécierais beaucoup une explication qui souligne de manière évidente pourquoi ce serait incorrect.

Julien Guertault
la source

Réponses:

14

L'utilisation de deux termes de Fresnel est correcte dans le sens où tout chemin diffus donné traversera deux fois la surface. Si vous résolvez la diffusion en traçant un chemin à travers le support jusqu'à ce qu'il rebondisse, vous obtiendrez deux termes de Fresnel (ou plus) pour ce chemin alors qu'il interagit avec la surface.

Cependant, ce n'est pas ce que vous faites avec un BRDF diffus. Un BRDF diffus est destiné à représenter la moyenne de tous ces chemins de diffusion possibles. Dans le cas d'un lambertien, cette moyenne est modélisée comme une réflexion uniforme et une seule valeur d'albédo mesurant la perte d'énergie interne pendant la diffusion, mais des modèles plus compliqués sont possibles. Crucialement: un BRDF diffus comprendra déjà l'effet agrégé de certains chemins qui sont réfléchis dans le milieu pour diffuser plus loin et certains disparaître immédiatement. est déjà "intégré" au BRDF¹ et vous n'avez pas besoin de le reprendre.1-Fout

Ce que le terme lambertien n'inclut pas, c'est la portion d'énergie qui est perdue en étant réfléchie avant que la lumière n'entre dans le milieu de diffusion. Cela dépend de la vue, mais dépend du lobe brillant précis au-dessus. Il n'y a pas de perte d'énergie à une interface de surface (non métallique), donc tout ce qui n'est pas réfléchi sera réfracté, ce qui signifie que ce que vous voulez réellement est d'intégrer la perte d'énergie totale à la surface dans toutes les directions sortantes, c'est-à-dire .1-glossy_bsdf(dans,en dehors)en dehors

Il est possible de pré-calculer des approximations de cette intégrale pour des BRDF spécifiques. Le résultat final dépendra en général de la direction de la vue, de la rugosité du matériau et de l'IOR au moins. En première approximation, vous pouvez supposer que le lobe brillant est un réflecteur parfaitement spéculaire. Cela donne une pondération de , qui est exactement ce que vous avez suggéré en premier.1-brillanten dehors=1-Fjen

De plus, notez que le BRDF Lambertien est l'albédo divisé par et que le terme cosinus est une mesure de l'atténuation de la lumière entrante à la surface; elle s'applique à la fois à la réflectance brillante et diffuse.π

Donc, grosso modo:

// Assuming for example:
//   diffuse = albedo / PI;
//   specular = my_favorite_glossy_brdf(in_dir, out_dir, roughness);
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
//   total_surface_reflection = fresnel
color = lightIntensity * dot(L, N) * Lerp(diffuse, specular, total_surface_reflection);

¹ Vraiment l'intégrale de sur tous les chemins de sortie de diffusion interne incident possibles qui se traduisent par votre direction de sortie, mais je m'égare.F

Karl Schmidt
la source
8

En naviguant pour rédiger correctement ma question, j'ai trouvé la réponse , qui se trouve être très simple.

Un autre terme de Fresnel va également peser à mesure que les photons sortent du matériau (donc étant réfractés dans l'air) et deviennent le terme diffus. Ainsi, le facteur correct pour le terme diffus serait:

(1-Fjen)(1-Fout)
Julien Guertault
la source
1
La section 5.3 du document Disney BRDF fait référence à l'équation dans votre réponse, puis poursuit en spécifiant un modèle différent. Je ne prétends pas comprendre tout cela car je viens de commencer ma mise en œuvre brillante de BRDF!
PeteUK
Je pense que cela continuerait à partir d'ici, où la lumière qui est réfléchie en arrière frapperait à nouveau la surface de l'intérieur, du côté opposé, puis de nouveau, et encore, chaque fois diminuant, sur l'infini: P (ou dans le sous surface hehe de diffusion)
Alan Wolfe
Comment calcule-t-on un autre terme de Fresnel?
plasmacel