Вода и кромка воды в блендер 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 прикручиваем. Результат на скрине выше.

Для сравнения тот же берег но с самым простым шейдером воды:

В принципе, если прикрутить волны к краям, если то, если сё... то можно использовать. Или если смотреть издалека, и берег будет вертикальным.

Ну а вот детальный рендер того шейдера, что я тут нагородил:

Неидеально, и под каждую сцену и освещение ещё надо донастраивать.  Но уже лучше.

+51
2 194

0 комментариев, по

2 345 425 206
Наверх Вниз