Вода и кромка воды в блендер 3d (water edge in blender 3d)
Автор: wayerrКаждый раз когда я начинаю моделлить кромку воды в блендере (с рендером cycles, если что), то приходится вспоминать это всё а то и гуглить, так что вот собрал вместе для себя, но может кому ещё пригодится.
Первым делом парочка базовых шейдеров для воды и береговой линии.
Воду я поместил вот в такую node group, тут задаются волны и нормали для них. Теоретически можно делать через displacement, но при покатой береговой линии волны будут там мешать, а снизить высоту displacement там не так-то просто. Ещё тут же задаётся шейдер volume - благодаря ему свет рассеивается и затухает в толще воды. И, собственно, основная проблема из-за него, если вы рисуете воду без volume шейдера, то cycles сам по себе делает воду более-менее нормально.
И шейдер для береговой линии с displacement (как оный включается в cycles я расписывать не буду, в инете полно инструкций).
Затем я создал _кубик_ для воды и плоскость для берега, объединил оба меша в один и назначил им соотвествующией материалы. Для воды нужен кубик именно из-за объема, с плоскостью volume шейдер работать не будет. Также объединять воду и берег в один меш крайне странно, но это нужно чтобы работал шейдер bevel - если вам он не нужен (ниже будет показано зачем он), то лучше воду делать отдельным объектом.
Теперь собственно всё готово, для воды берется самый простой шейдер "glass" и вуаля:
Что-то смущает? Да всё, и кромка берега и темнота внутри воды. Давайте отключим surface и заглянем унутрь:
Выглядит иначе... Замечу, что если при подключенном surface отключить volume то тоже будет некоторая разница (лень показывать) в яркости содержимого. Причём очень заметная.
Познакомьтесь, это есть баг. Один из многих. Технически водная поверхность в реальности отсекает часть света (ту что отразилась от границы преломления сред), так что свет прошедши через толщу воды до дна и вернувшийся обратно будет тусклее, но это зависит от угла зрения и коэффициента преломления, а в cycles блендера, увы не зависит.
Давайте попробуем разобрать glass шейдер на составные и "покрутить" его:
Разобрали на refraction и glossy, которые регулирутся через fresnel. Если fresnel задать коэффициент преломления ближе к единице, что бликовать вода будет меньше, а преломляться будет также. Это, увы, не помогает сделать светлее внутреннюю часть, но снижать блеск воды очень полезно, кто фотографировал реки и озера с поляриком, тот в курсе.
Что делать, что делать... в блендере есть такая штука которая позволяет узнать какой "луч" прилетает в шейдер и исходя из этого действовать. Чтож, скрываем воду от всего кроме луча для камеры:
Вотето да, я бы сказал. Надо отметить, что это всё же "слишком" светло, но затенить можно, если понадобиться. Зато теперь видно и толщу воды, и кромка не так бросается в глаза.
Кромку можно сгладить, используя ambient occlusion шейдер. Он работает примерно так:
Обратите внимание, что включён inside.
А вот так он работает уже с кромкой:
Она далека от естественности, но уже не столь угловата, да и вообще. Тут надо отметить, что ещё камни торчат как-то внезапно и резко, хотя поверхность воды должна чуть изгибаться, из-за поверхностного натяжения.
Для этого есть шейдер bevel. Он умеет искажать нормали (тут шейдер подключен сразу "на выход", так что мы видим "цвет" вектора normal):
Разница же на итоговом изображении будет очень малозаметна, для этого придётся открыть две картинки и переключать их посматривая что кое-где возле камней появляется опоясывающий блик:
Теперь я собрал всё это вместе. Вместо glass взял его аналог с fresnel", чут ьснизил высоту волн к краям (вторым ambient occlusion), а заодно у refraction сделал серый цвет, чтобы толща воды сильнее затемнялась (это можно достичь и иными путями):
Весь шейдер на скрин не поместился, потому тут только изменившаяся часть. Как видно вода уже более-менее, но вот кромка...
Тут надо вспомнить, что береговая линия тоже смачивается, а значит блести, более сглаженная и всё такое. Попробуем зайти с этой стороны:
Тут очень примитивный костыль - в шейдере берётся вертикальная координата и если она меньше какого-то значения, то мы считаем, что "рядом вода" (здесь граница задается через map range), а если водя рядом, то цвет темнее, шероховатость ниже, блеск выше, ну и displacement прикручиваем. Результат на скрине выше.
Для сравнения тот же берег но с самым простым шейдером воды:
В принципе, если прикрутить волны к краям, если то, если сё... то можно использовать. Или если смотреть издалека, и берег будет вертикальным.
Ну а вот детальный рендер того шейдера, что я тут нагородил:
Неидеально, и под каждую сцену и освещение ещё надо донастраивать. Но уже лучше.