Wie kann man die diffusen und spiegelnden Begriffe richtig kombinieren?

18

Soweit ich weiß, gibt der Fresnel-Term in einer BRDF die Wahrscheinlichkeit an, dass ein Photon reflektiert oder gebrochen wird, wenn es auf eine Oberfläche trifft.

Die reflektierten Photonen tragen zum spekularen Term bei, während die gebrochenen zum diffusen Term beitragen. Wenn ich also physikalisch den Beitrag eines Lichts zur Materialfarbe bestimme, fühle ich mich versucht, einfach zu schreiben:

// 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);

Trotzdem glaube ich nicht, dass ich es jemals so geschrieben gesehen habe. Ich habe gesehen, dass der spekulare Term nach dem Fresnel-Term gewichtet wurde, aber nicht nach dem diffusen. Sébastien Lagarde stellt in seinem weitgehend referenzierten Artikel über Züchterrechte sogar fest, dass die Verwendung von zur Gewichtung des diffusen Terms falsch ist.(1F)

Was vermisse ich?
Ich würde eine Erklärung sehr begrüßen, die auf offensichtliche Weise aufzeigt, warum dies falsch wäre.

Julien Guertault
quelle

Antworten:

14

Die Verwendung von zwei Fresnel-Termen ist in dem Sinne korrekt, dass ein beliebiger diffuser Pfad zweimal durch die Oberfläche verläuft. Wenn Sie die Diffusion lösen, indem Sie einen Pfad durch das Medium verfolgen, bis er wieder herausspringt, erhalten Sie zwei (oder mehr) Fresnel-Terme für diesen Pfad, wenn er mit der Oberfläche interagiert.

1Fout

1glossy_bsdf(in,out)dout

1glossydout=1Fin

π

Also ungefähr:

// 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);

F

Karl Schmidt
quelle
8

Beim Stöbern, um meine Frage richtig zu schreiben, fand ich tatsächlich die Antwort , die zufällig sehr einfach ist.

Ein weiterer Fresnel-Term wird ebenfalls gewichtet, wenn die Photonen aus dem Material austreten (also in die Luft gebrochen werden) und zum diffusen Term werden. Der richtige Faktor für den diffusen Term wäre also:

(1Fin)(1Fout)
Julien Guertault
quelle
1
In Abschnitt 5.3 des Disney BRDF-Papiers wird auf die Gleichung in Ihrer Antwort verwiesen und anschließend ein anderes Modell angegeben. Ich behaupte nicht, etwas davon zu verstehen, da ich gerade mit meiner hochglänzenden BRDF-Implementierung begonnen habe!
PeteUK
Ich gehe davon aus, dass dies von hier aus so weitergeht, dass das von innen zurückreflektierte Licht dann von innen auf die gegenüberliegende Seite und dann immer wieder ins Unendliche fällt: P (oder ins Sub Oberflächenstreuung hehe)
Alan Wolfe
Wie berechnet man den anderen Fresnel-Term?
Plasmacel