Фізичною основою кольорів масляного пляма є райдужність , а також пов'язана з кільцями Ньютона . Зокрема, товщина масляного шару знаходиться на порядку довжини хвилі світла. Оскільки світло відбивається як від верхньої, так і від нижньої поверхні масла, при будь-якій заданій довжині хвилі, під деякими кутами два відбиття будуть поза фазою і скасовуватимуть один одного; під іншими кутами відбиття будуть у фазі і складаються разом. Це відбувається під різними кутами для кожної довжини хвилі, тому освітлення олії білим світлом видає всі ці кольори. Якщо ви освітлювали його однією частотою (наприклад, лазерним світлом), ви б бачили лише ряд світлих і темних кілець.
Якщо ви ігноруєте заломлення в масляному шарі, просто опрацьовуючи геометрію ситуації, ви можете виявити, що яскравість відбитого світла для будь-якої заданої довжини хвилі повинна змінюватися як
sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5
Теоретично це має бути інтегровано на всіх довжинах хвиль, але на практиці ви, ймовірно, можете просто зробити це для червоного, зеленого та синього - скажімо, 700, 550 та 400 нм відповідно. Зміна товщини масла змінить видимий радіус кольорів кілець. Я б, мабуть, 2.0 * pi * oilThickness / wavelength
перетворив на єдине значення RGB, що надається шейдеру, як рівномірне значення. Ви можете помножити її на текстуру, щоб імітувати різну товщину масла, якщо бажано - саме це, мабуть, дає більшість цікавої текстури на зображенні вище.
Це дає значення кольору RGB, яке ви можете помножити на свій BRDF. dot(L, H)
Фактор буде використовуватися для точкового / спрямованого світла, і ви можете замінити dot(N, V)
там для застосування цього до відбиття карти навколишнього середовища , а також.
Відмова: Я не пробував цього в шейдері, просто намалював кілька діаграм і переконав себе, що це "повинно працювати" ... так що дайте мені знати результати, якщо ви все-таки спробуйте! :)