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 - Fo u t
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 , sur )d out
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 - ∫brillantd out =1- Fje n
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