Rendre l'eau huileuse / polluée?

19

Tous les assistants shader ont une idée de la façon d'obtenir un effet d'eau huileuse / polluée, similaire à ceci:

eau huileuse

Idéalement, l'eau ne serait pas uniformément huileuse, mais à la place, le pétrole pourrait être généré à partir d'une source (comme un drain polluant d'une usine chimique), puis diffusé dans tout le plan d'eau. Ma pensée pour cette partie serait de garder une "carte du pétrole" comme une texture 2D qui détermine la densité du pétrole à chaque point de la surface de l'eau. Il se diffuserait et se déplacerait naturellement avec la vitesse de l'eau; à ce moment-là (j'ai une simulation vague-particule pour les ondes dynamiques, et je fais déjà quelque chose de similaire pour la mousse à la surface de l'eau). Cependant, je ne sais pas dans quelle mesure cela serait physiquement correct, car le pétrole pourrait ne pas se déplacer à la même vitesse que l'eau.

Et je n'ai aucune idée de comment faire toutes ces couleurs trippantes :-). Pensées?

Robert Fraser
la source
Utilisez une texture ..? Dégradé radial chromatique, appliquez une certaine distorsion ..
bobobobo
@bobobobo - La direction dans laquelle vous le regardez influence les couleurs affichées, cependant ... youtube.com/watch?v=NRtUoMG16ZU
Robert Fraser
1
Vous voudrez appliquer un shader basé sur en.wikipedia.org/wiki/Thin-film_interference mais je n'ai aucune idée de la façon de l'écrire.
jzx
2
( gamedev.net/page/resources/_/technical/… ) Je ne peux pas distiller une réponse parce que je ne connais pas le sujet
horatio

Réponses:

25

La base physique des couleurs d'une nappe de pétrole est l' irisation , et également liée aux anneaux de Newton . Plus précisément, l'épaisseur de la couche d'huile est de l'ordre de la longueur d'onde de la lumière. Puisque la lumière se reflète à la fois sur la surface supérieure et inférieure de l'huile, à n'importe quelle longueur d'onde donnée, à certains angles, les deux réflexions seront déphasées et s'annuleront l'une l'autre; à d'autres angles, les réflexions seront en phase et s'ajouteront. Cela se produit à différents angles pour chaque longueur d'onde, donc éclairer l'huile avec de la lumière blanche produit toutes ces couleurs. Si vous l'illuminiez avec une seule fréquence (par exemple une lumière laser), vous ne verriez qu'une série d'anneaux clairs et foncés.

Si vous ignorez la réfraction dans la couche d'huile, en travaillant simplement sur la géométrie de la situation, vous pouvez constater que la luminosité de la lumière réfléchie pour une longueur d'onde donnée doit varier comme

sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5

Théoriquement, cela devrait être intégré sur toutes les longueurs d'onde, mais en pratique, vous pouvez probablement le faire pour le rouge, le vert et le bleu - disons 700, 550 et 400 nm, respectivement. Changer l'épaisseur d'huile changera le rayon apparent des anneaux de couleur. Je voudrais probablement envelopper la 2.0 * pi * oilThickness / wavelengthvaleur RVB unique fournie au shader comme une valeur uniforme. Vous pouvez le multiplier par une texture pour simuler une épaisseur d'huile variable, si vous le souhaitez - c'est probablement ce qui donne le plus de texture intéressante dans l'image ci-dessus.

Cela produit une valeur de couleur RVB que vous pouvez multiplier dans votre BRDF. Le dot(L, H)facteur serait utilisé pour les lumières ponctuelles / directionnelles, et vous pouvez également y substituer dot(N, V)pour appliquer cela à une réflexion de carte d'environnement.

Avertissement: je n'ai pas essayé cela dans un shader, j'ai juste dessiné quelques diagrammes et je me suis convaincu que cela "devrait fonctionner" ... alors faites-moi savoir les résultats si vous l'essayez! :)

Nathan Reed
la source
Truc cool. La raison pour laquelle il y a des reflets sur les surfaces d'huile supérieure et inférieure est que certaines ondes sont réfléchies sur le dessus tandis que d'autres sont juste réfractées. Ces ondes réfractées avancent vers la surface du botton, où elles peuvent être réfractées ou réfléchies.
dsilva.vinicius