Ich kann nirgendwo einen guten Grund dafür finden. Der im Phong verwendete Reflexionsvektor hat eine einfache physikalische Basis. Aber der in Blinn verwendete Halbvektor scheint keine rationale Basis zu haben und stellt keine richtige Reflexion dar. Und doch wird es in jeder sogenannten "physikalisch basierten" Verschattungsfunktion verwendet. Wenn es eine gute physische Basis dafür gibt, würde ich gerne wissen.
Was ich finden konnte, sind einige Gründe:
Es ist schneller - es gibt gemischte Informationen darüber, aber es wäre trotzdem ein guter Grund gewesen ... im Jahr 1998.
Winkel von mehr als 90 Grad werden besser verarbeitet - soweit ich das beurteilen kann, liegt dies nur daran, dass der Phong-Begriff nicht richtig verwendet wurde. Das Skalarprodukt der Reflexion und der Ansicht ergibt einen Winkel zwischen -1 und +1. Normalerweise wird dieser Winkel auf 0 zu 1 geklemmt, dies ist die direkte Ursache für das 90-Grad-Problem. Normalisieren Sie den Winkel neu, anstatt ihn zu klemmen, und Sie erhalten die volle 180-Grad-Abdeckung. Ich weigere mich zu glauben, dass eine einfache x * 0.5 + 0.5-Operation der Grafikwelt seit 40 Jahren entgangen ist.
es handhabt Kanten besser - Das Kanten- "Problem" existiert auch in der Blinn-Lösung, nur in geringerem Maße. Die Hauptursache ist eine unsachgemäße Simulation der Flächenbeleuchtung am Terminator, die für jeden "physisch basierten" Shader unerlässlich sein sollte. Aber auch in einfacheren Situationen kann eine Sigmoid-Funktion eine weiche Abschlusslinie korrekt approximieren. Die Multiplikation mit einem Lambert-Term ist falsch, da der Specular-Term dadurch nicht ordnungsgemäß abgeschwächt wird. Dies könnte einen Fresnel-Term aufheben und zu weiteren Fehlern führen.
Es hat lange Reflexionen am Rand - Es scheint mir, dass anisotrope Reflexionen zwar realistisch sein können, Blinn jedoch nicht die richtige Methode ist, um sie zu implementieren, da sie nur am Rand auftreten. Es ist nur ein glücklicher Zufall, dass ein Fehler im H-Term realistisch aussieht.
Keiner dieser Gründe ist zufriedenstellend, ich möchte diesen Wahnsinn ausräumen.
Ich möchte klarstellen, dass ich nicht spezifisch von Blinn und Phong spreche , sondern von den Vektorkomponenten H und R, die als Grundlage für diese und andere Shader dienen.
Eigentlich haben Sie selbst die Gründe aufgeführt, warum Blinn die Standardeinstellung für Phong ist.
Jeder Grund, den Sie dort aufgeführt haben, ist in der Tat ein Bereich, in dem Blinn Phong überlegen ist.
Alles in allem führt dies dazu, dass Blinn besser in Verzug ist als Phong.
Ist Blinn perfekt? Ist es besser als Phong?
Nein.
Aber es ist ein vernünftiger Standard. Fühlen Sie sich frei, Phong für Blinn in jedem Renderer / Shader zu ersetzen, den Sie schreiben.
quelle
Ich habe den Grund für die Verwendung des H-Vektors entdeckt. Leider ist es nicht die Art und Weise, wie es in den meisten Beschattungsmodellen verwendet wird, was dann als falsch angesehen werden kann.
Bei physikalisch basierten Abschattungen muss reflektiertes Licht den Fresnel-Gleichungen entsprechen. (Die meisten "physikalisch basierten" Shader tun dies nicht.) Mikrofacetten müssen auch die Fresnel-Gleichungen einhalten, die sich auf den Einfallswinkel des Lichts sowie den Brechungsindex der Grenzfläche stützen, um ein korrektes Ergebnis zu erzielen.
Nach dem Reflexionsgesetz muss der Einfallswinkel mit dem Reflexionswinkel entlang der Flächennormalen gespiegelt werden. Damit ein Lichtstrahl die Kamera getroffen hat - von der wir wissen, dass sie getroffen wurde -, muss er vom Licht reflektiert worden sein - von dem wir die Richtung kennen. Die Flächennormale muss also abzüglich der Spiegelachse für diese beiden Richtungen sein. Dies gibt uns den Halbvektor H, der zwischen ihnen liegt. Berechnet durch Normalisierung der Summe von beiden.
Durch Berechnung des Winkels zwischen der Lichtrichtung L und dem Halbvektor H erhalten wir nun den Einfallswinkel für die Spiegelreflexion einer Mikrofacette und können ihn mit dem Fresnel-Term korrekt abschwächen.
Es ist zu beachten, dass die Blickrichtung für diese Mikrofacette gleich R ist, H ist kein Reflexionsterm. Blinn, Cook, Torrance und Sparrow können es lutschen. Phong und Fresnel hatten recht.
quelle