2D Водный профиль верхней поверхности

9

Я пытаюсь создать эффект толщины поверхности воды с помощью вершинно-фрагментного шейдера.

Я нахожусь в трехмерной игровой среде, но это вид с прокруткой, так что вид "2D". Вот хороший урок по созданию такого эффекта в реальном 2D с использованием фрагментного шейдера.
Но это не может быть использовано в моем случае, я думаю. На данный момент у меня есть только самолет, где я применяю рефракцию.

преломление

И я хочу применить эффект толщины воды. Но я не знаю, как это сделать.
Я не пытаюсь создать некоторую деформацию / смещение воды, используя вершину на данный момент, это не главное.

Я не знаю, возможно ли это с помощью простого квадроцикла, возможно, мне следует использовать такой объект, как этот.

система

Вот несколько примеров.

1 2 4 Rayman

Я понятия не имею, как создать этот эффект.

Большое спасибо !

[ РЕДАКТИРОВАТЬ ] Добавлен эффект воды Rayman, чтобы лучше справиться с эффектом.

Мат
источник
Как вы делаете свой эффект воды в настоящее время? Если первый снимок экрана в посте - ваш, то похоже, что вы рисуете двухмерный четырехугольник над сценой с шейдером, который его искажает. Если это правильно, почему вы не можете следовать инструкциям в руководстве, которое также основано на использовании искаженной 2D текстуры?
Натан Рид
У меня есть трехмерный четырехугольник с вершинным фрагментным шейдером, который искажает фон (фон захватывается функциональностью Unity GrabPass). Я не думаю, что использование 2D-текстуры - это хорошая идея, я думал о чем-то более универсальном с настраиваемыми параметрами, но, похоже, другого пути нет ... и это будет медленнее, нет?
МАТ

Ответы:

1

Имейте значение в шейдере, которое определяет влажность. Меньше 0 означает воздух, больше 1 означает воду, а между ними означает мениск.

Вот некоторый псевдокод:

vec2 uv2 = bigWaves(uv); // modify the texture coords to create a wavy water effect
float wetness = (uv2.y - 0.1) * 100;

if( wetness<0.0 )
{
    gl_Fragment = texture2D(screen_texture,uv); // is air - no refraction or effect
}
else if( wetness>1.0 )
{
    vec2 uv3 = smallWaves(uv2); // modify the texture coords to create a ripply water effect
    gl_Fragment = texture2D(screen_texture,uv3); // is water - with refraction
}
else
{
    gl_Fragment = vec4(1,1,1,1); // solid white meniscus
}

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

DaleyPaley
источник
Да, это хорошая идея! Я полностью согласен с размытостью и оттенками. Я также добавляю градиент глубины (Y) (возможно, другой градиент глубины (Z)). Я должен добавить другой эффект преломления и в зоне мениска, но на данный момент я пытаюсь получить волновой эффект, как в Rayman. Но я не знаю как. Может быть, я должен использовать различные текстуры для мениска, чтобы иметь этот двойной эффект. Я не знаю, знаете ли вы, что я имею в виду.
Мат