Öliges / verschmutztes Wasser?

19

Alle Shader-Assistenten haben eine Vorstellung davon, wie ein Effekt für öliges / verschmutztes Wasser erzielt werden kann:

öliges Wasser

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?

Robert Fraser
quelle
Verwenden Sie eine Textur ..? Chromatische radiale Farbverlauf, etwas Verzerrung anwenden ..
Bobobobo
@bobobobo - Die Richtung, in die Sie es betrachten, beeinflusst jedoch, welche Farben angezeigt werden ... youtube.com/watch?v=NRtUoMG16ZU
Robert Fraser
1
Sie möchten einen Shader anwenden, der auf en.wikipedia.org/wiki/Thin-film_interference basiert, aber ich habe keine Ahnung, wie Sie einen Shader erstellen sollen.
jzx
2
( gamedev.net/page/resources/_/technical/… ) Ich kann nicht auf eine Antwort eingehen, weil ich das Thema nicht kenne
Horatio

Antworten:

25

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! :)

Nathan Reed
quelle
Cooles Zeug. Der Grund, warum es Reflexionen auf der oberen und unteren Öloberfläche gibt, ist, dass einige Wellen auf der Oberseite reflektiert werden, während andere nur gebrochen werden. Diese gebrochenen Wellen dringen zur Bodenoberfläche vor, wo sie erneut gebrochen oder reflektiert werden können.
dsilva.vinicius