Tous les assistants shader ont une idée de la façon d'obtenir un effet d'eau huileuse / polluée, similaire à ceci:
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?
Réponses:
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
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 / wavelength
valeur 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 substituerdot(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! :)
la source