2D Profil górnej powierzchni wody

9

Próbuję stworzyć efekt grubości powierzchni wody za pomocą modułu cieniującego fragmenty wierzchołków.

Jestem w środowisku gier 3D, ale jest to widok przewijania, więc widok „2D”. Oto dobry samouczek tworzenia takiego efektu w prawdziwym 2D za pomocą modułu cieniującego fragmenty.
Ale myślę, że nie można tego użyć w moim przypadku. W tej chwili mam tylko samolot, w którym stosuję załamanie.

refrakcja

I chcę zastosować efekt grubości wody. Ale nie wiem jak to zrobić.
Na razie nie próbuję tworzyć deformacji / przemieszczeń wody za pomocą wierzchołków, nie o to chodzi.

Nie wiem, czy jest to możliwe z prostym quadem, może powinienem użyć takiego obiektu.

system

Oto kilka przykładów.

1 2) 4 rayman

Nie mam pojęcia, jak stworzyć ten efekt.

Wielkie dzięki !

[ EDYCJA ] Dodano efekt wody Raymana, aby mieć lepsze odniesienie do efektu.

Mata
źródło
Jak sobie radzisz z efektem wody? Jeśli pierwszy zrzut ekranu w Twoim poście jest twój, wygląda na to, że rysujesz kwadracik 2D nad sceną za pomocą modułu cieniującego, który go zniekształca. Jeśli to prawda, dlaczego nie możesz postępować zgodnie z instrukcjami w samouczku, który również opiera się na użyciu zniekształconej tekstury 2D?
Nathan Reed
Mam quad 3D z shaderem fragmentów wierzchołków, który rozróżnia tło (tło jest przechwytywane przez funkcję Unity GrabPass). Nie sądzę, aby użycie tekstury 2D było dobrym pomysłem, myślałem o czymś bardziej ogólnym z dostosowywanymi parametrami, ale wydaje się, że nie ma innej drogi ... i byłoby wolniej, nie?
MaT

Odpowiedzi:

1

Mieć wartość w module cieniującym, która określa wilgotność. Mniejsze niż 0 oznacza powietrze, większe niż 1 oznacza wodę, a pomiędzy nimi oznacza menisk.

Oto pseudo kod:

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
}

To jest najprostsze, co mogę zrobić. Gdybym to był ja, zrobiłbym coś nieco bardziej skomplikowanego w przypadku antyalizy łąkotki i zastosowałbym tam więcej refrakcji, czy coś takiego, ale nie mogę ci powiedzieć co, ponieważ wymagałoby to iteracji estetycznych. Poza tym zabarwiłem i rozmazałem próbkę wody. Ale to wszystko pozostawię tobie.

DaleyPaley
źródło
Tak, to dobry pomysł! Całkowicie zgadzam się co do rozmycia i odcienia. Dodam również gradient głębokości (Y) (może inny gradient głębokości (Z)). Powinienem również dodać inny efekt załamania w strefie łąkotki, ale w tej chwili próbuję uzyskać efekt falowania, jak w Raymanie. Ale nie wiem jak. Może powinienem użyć różnych tekstur dla menisku, aby uzyskać ten duplikat. Nie wiem czy wiesz o co mi chodzi.
MaT