Alle Shader-Assistenten haben eine Vorstellung davon, wie ein Effekt für öliges / verschmutztes Wasser erzielt werden kann:
Im Idealfall wäre das Wasser nicht gleichmäßig ölig, sondern das Öl könnte aus einer Quelle (z. B. einem umweltschädlichen Abfluss einer Chemiefabrik) stammen und dann im gesamten Gewässer diffundieren. Mein Gedanke für diesen Teil wäre, eine "Ölkarte" als 2D-Textur zu führen, die die Dichte des Öls an jedem Punkt der Wasseroberfläche bestimmt. Es würde sich mit der Geschwindigkeit des Wassers auf natürliche Weise ausbreiten und bewegen (ich habe eine Wellenpartikelsimulation für dynamische Wellen und mache bereits etwas Ähnliches für Schaum auf der Wasseroberfläche). Ich bin mir jedoch nicht sicher, wie physikalisch korrekt das wäre, da sich das Öl möglicherweise nicht mit der gleichen Geschwindigkeit wie das Wasser bewegt.
Und ich habe keine Ahnung, wie ich all diese trippigen Farben machen soll :-). Gedanken?
Antworten:
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
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 einpacken
2.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! :)
quelle