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