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.