Użycie dwóch terminów Fresnela jest poprawne w tym sensie, że każda dana ścieżka rozproszona przejdzie dwukrotnie przez powierzchnię. Jeśli rozwiązujesz dyfuzję, śledząc ścieżkę przez medium, dopóki nie odbije się ona ponownie, otrzymasz dwie (lub więcej) warunki Fresnela dla tej ścieżki, gdy wchodzi ona w interakcję z powierzchnią.
Jednak nie to robisz z rozproszonym BRDF. Rozproszony BRDF ma reprezentować średnią ze wszystkich możliwych ścieżek dyfuzji. W przypadku Lambertausa ta średnia jest modelowana jako równomierne odbicie i pojedyncza wartość albedo mierząca wewnętrzną utratę energii podczas dyfuzji, ale możliwe są bardziej skomplikowane modele. Co najważniejsze: rozproszony BRDF będzie już uwzględniał łączny efekt niektórych ścieżek odbijanych z powrotem do ośrodka w celu dalszego rozproszenia, a niektóre z nich natychmiast znikają. jest już „pieczone w” do BRDF¹ i nie trzeba czynnik go ponownie.1 - Fo U T
Pojęcie Lamberta nie obejmuje części energii, która jest tracona w wyniku odbicia, zanim światło dostanie się do ośrodka dyfuzji. Jest to zależne od widoku, ale zależy od precyzyjnego błyszczącego płata nad nim. Nie ma strat energii na interfejsie powierzchniowym (niemetalowym), więc wszystko, co nie zostanie odbite, zostanie załamane, co oznacza, że tak naprawdę chcesz zintegrować całkowitą utratę energii na powierzchni we wszystkich kierunkach wychodzących, tj. .1 - ∫glossy_bsdf ( w , na )d out
Możliwe jest wstępne obliczenie przybliżeń tej całki dla określonych BRDF. Wynik końcowy będzie ogólnie zależeć co najmniej od kierunku widoku, szorstkości materiału i IOR. Jako pierwsze przybliżenie można założyć, że błyszczący płat jest idealnie odbłyśnikiem. Daje to wagę , czyli dokładnie to, co najpierw zasugerowałeś.1 - ∫lśniącyd out =1- F.i n
Dodatkowo należy zauważyć, że Lambertowskie BRDF to albedo podzielone przez i że cosinus oznacza miarę tłumienia przychodzącego światła na powierzchni; dotyczy to zarówno błyszczącego, jak i rozproszonego współczynnika odbicia.π
Z grubsza:
// 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);
fa