Die physikalische Grundlage der Farben eines Ölteppichs ist das Schillern und steht auch in Beziehung zu Newtons Ringen . Insbesondere liegt die Dicke der Ölschicht in der Größenordnung der Wellenlänge des Lichts. Da Licht sowohl von der oberen als auch von der unteren Oberfläche des Öls bei jeder gegebenen Wellenlänge in einigen Winkeln reflektiert wird, sind die beiden Reflexionen außer Phase und heben sich gegenseitig auf; Bei anderen Winkeln sind die Reflexionen gleichphasig und addieren sich. Dies geschieht in unterschiedlichen Winkeln für jede Wellenlänge. Wenn Sie das Öl also mit weißem Licht beleuchten, entstehen all diese Farben. Wenn Sie es mit einer einzigen Frequenz (z. B. Laserlicht) beleuchten, sehen Sie nur eine Reihe von hellen und dunklen Ringen.
Wenn Sie die Brechung in der Ölschicht ignorieren und nur die Geometrie der Situation herausarbeiten, können Sie feststellen, dass die Helligkeit des reflektierten Lichts für eine bestimmte Wellenlänge wie folgt variieren sollte
sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5
Theoretisch sollte dies über alle Wellenlängen integriert werden, aber in der Praxis können Sie dies wahrscheinlich nur für Rot, Grün und Blau tun - sagen wir 700, 550 bzw. 400 nm. Durch Ändern der Öldicke wird der scheinbare Radius der Farbringe geändert. Ich würde das wahrscheinlich einpacken2.0 * pi * oilThickness / wavelength
in einen einzelnen RGB-Wert dem Shader als einheitlicher Wert bereitgestellt wird. Falls gewünscht, können Sie es mit einer Textur multiplizieren, um eine unterschiedliche Dicke des Öls zu simulieren. Dies ist wahrscheinlich der Grund für die meisten interessanten Texturen im obigen Bild.
Das ergibt einen RGB-Farbwert, den Sie mit Ihrer BRDF multiplizieren können. Der dot(L, H)
Faktor wird für Punkt- / Richtungslichter verwendet, und Sie können ihn dort ersetzen, dot(N, V)
um ihn auch auf eine Umgebungskartenreflexion anzuwenden.
Haftungsausschluss: Ich habe dies nicht in einem Shader ausprobiert, habe nur ein paar Diagramme gezeichnet und mich davon überzeugt, dass es "funktionieren sollte". Lassen Sie mich die Ergebnisse wissen, wenn Sie es versuchen! :)