Физическая основа цветов нефтяного пятна - переливчатость , а также связанная с кольцами Ньютона . В частности, толщина масляного слоя составляет порядка длины волны света. Поскольку свет отражается как от верхней, так и от нижней поверхности масла, на любой заданной длине волны, под некоторыми углами, два отражения будут сдвинуты по фазе и погасят друг друга; под другими углами отражения будут в фазе и сложить вместе. Это происходит под разными углами для каждой длины волны, поэтому при освещении масла белым светом получаются все эти цвета. Если вы осветите его одной частотой (например, лазерным излучением), вы увидите только серию светлых и темных колец.
Если вы игнорируете преломление в слое масла, просто определяя геометрию ситуации, вы можете обнаружить, что яркость отраженного света для любой заданной длины волны должна изменяться следующим образом
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)
там для применения этого к отражению карты окружающей среды , а также.
Отказ от ответственности: я не пробовал это в шейдере, просто нарисовал несколько диаграмм и убедил себя, что это "должно работать" ... так что дайте мне знать результаты, если вы попробуете это! :)