Оказание жирной / загрязненной воды?

19

Любой шейдер-волшебник имеет представление о том, как добиться эффекта масляной / загрязненной воды, подобного этому:

жирная вода

В идеале вода не должна быть равномерно маслянистой, но вместо этого нефть может быть получена из какого-то источника (например, загрязняющего стока с химического завода) и затем распространяться по всему водоему. Я думал об этой части, чтобы сохранить «нефтяную карту» в виде 2D текстуры, которая определяет плотность нефти в каждой точке на поверхности воды. В этот момент он будет диффундировать и естественным образом двигаться вместе с уровнем воды (у меня есть моделирование волновых частиц для динамических волн, и я уже делаю нечто подобное для пены на поверхности воды). Тем не менее, я не уверен, насколько это было бы физически правильно, поскольку нефть может двигаться не с той же скоростью, что и вода.

И я понятия не имею, как сделать все эти триповые цвета :-). Мысли?

Роберт Фрейзер
источник
Использовать текстуру ..? Хроматический радиальный градиент, применить некоторые искажения ..
Бобобо
@bobobobo - направление, на которое ты смотришь, влияет на то, какие цвета отображаются, однако ... youtube.com/watch?v=NRtUoMG16ZU
Роберт Фрейзер
1
Возможно, вы захотите применить шейдер на основе en.wikipedia.org/wiki/Thin-film_interference, но я понятия не имею, как его написать.
JZX
2
( gamedev.net/page/resources/_/technical/… ) Я не могу найти ответ, потому что не знаю темы
Горацио

Ответы:

25

Физическая основа цветов нефтяного пятна - переливчатость , а также связанная с кольцами Ньютона . В частности, толщина масляного слоя составляет порядка длины волны света. Поскольку свет отражается как от верхней, так и от нижней поверхности масла, на любой заданной длине волны, под некоторыми углами, два отражения будут сдвинуты по фазе и погасят друг друга; под другими углами отражения будут в фазе и сложить вместе. Это происходит под разными углами для каждой длины волны, поэтому при освещении масла белым светом получаются все эти цвета. Если вы осветите его одной частотой (например, лазерным излучением), вы увидите только серию светлых и темных колец.

Если вы игнорируете преломление в слое масла, просто определяя геометрию ситуации, вы можете обнаружить, что яркость отраженного света для любой заданной длины волны должна изменяться следующим образом

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)там для применения этого к отражению карты окружающей среды , а также.

Отказ от ответственности: я не пробовал это в шейдере, просто нарисовал несколько диаграмм и убедил себя, что это "должно работать" ... так что дайте мне знать результаты, если вы попробуете это! :)

Натан Рид
источник
Классная вещь. Причина появления отражений на верхней и нижней поверхностях масла состоит в том, что некоторые волны отражаются сверху, а другие просто преломляются. Эти преломленные волны продвигаются к поверхности дна, где они могут снова преломляться или отражаться.
dsilva.vinicius