Hồ sơ mặt nước 2D


9

Tôi đang cố gắng tạo ra hiệu ứng của độ dày mặt nước bằng một shader mảnh đỉnh.

Tôi đang ở trong môi trường trò chơi 3D nhưng Đó là chế độ xem cuộn nên chế độ xem "2D". Dưới đây là một hướng dẫn tốt về việc tạo hiệu ứng như vậy trong 2D thực bằng cách sử dụng shader mảnh.
Nhưng tôi nghĩ nó không thể được sử dụng trong trường hợp của tôi. Hiện tại tôi chỉ có một chiếc máy bay là tôi áp dụng khúc xạ.

khúc xạ

Và tôi muốn áp dụng hiệu ứng độ dày của nước. Nhưng tôi không biết làm thế nào để làm điều đó.
Tôi không cố gắng tạo ra một số biến dạng / dịch chuyển nước bằng cách sử dụng đỉnh cho thời điểm này, đây không phải là điểm.

Tôi không biết nếu có thể với một quad đơn giản thì có lẽ tôi nên sử dụng một đối tượng như thế này.

hệ thống

Dưới đây là một số ví dụ.

1 2 4 rayman

Tôi không có ý tưởng nào về cách tạo hiệu ứng này.

Cảm ơn rất nhiều !

[ EDIT ] Đã thêm hiệu ứng nước Rayman để có tham chiếu tốt hơn về hiệu ứng.


Làm thế nào bạn đang làm hiệu ứng nước của bạn hiện nay? Nếu ảnh chụp màn hình đầu tiên trong bài đăng là của bạn, có vẻ như bạn đang vẽ một hình tứ giác 2D trên khung cảnh, với một bóng đổ làm biến dạng nó. Nếu đó là chính xác, tại sao bạn không thể làm theo các hướng dẫn trong hướng dẫn, cũng dựa trên việc sử dụng kết cấu 2D bị bóp méo?
Nathan Reed

Tôi có một hình tứ giác 3D với một shader mảnh phân đoạn làm biến dạng nền (nền được chụp bởi chức năng của Unity GrabPass). Tôi không nghĩ rằng sử dụng kết cấu 2D là một ý tưởng hay, tôi đã nghĩ đến một cái gì đó chung chung hơn với các thông số có thể tùy chỉnh nhưng dường như không có cách nào khác ... và nó sẽ chậm hơn phải không?
MaT

Câu trả lời:


1

Có một giá trị trong shader chỉ định độ ẩm. Nhỏ hơn 0 có nghĩa là không khí, lớn hơn 1 có nghĩa là nước và ở giữa có nghĩa là sụn.

Đây là một số mã giả:

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
}

Đây là cách đơn giản nhất tôi có thể làm cho nó. Nếu là tôi, tôi sẽ làm một cái gì đó phức tạp hơn một chút để chống lại sụn khớp và áp dụng khúc xạ nhiều hơn ở đó hoặc một cái gì đó, nhưng tôi không thể nói cho bạn biết vì nó sẽ lặp đi lặp lại thẩm mỹ. Ngoài ra, tôi sẽ pha màu và làm mờ mẫu nước. Nhưng tôi sẽ để lại tất cả cho bạn.


Vâng nó là một ý tưởng hay ! Tôi hoàn toàn đồng ý về mờ và tint. Tôi cũng đang thêm một độ sâu (Y) gradient (có thể là độ sâu (Z) khác). Tôi cũng nên thêm một hiệu ứng khúc xạ khác trong vùng sụn khớp nhưng hiện tại tôi đang cố gắng để có hiệu ứng gợn như trong Rayman. Nhưng tôi không biết làm thế nào. Có lẽ tôi nên sử dụng các Kết cấu khác nhau cho sụn để có hiệu ứng trùng lặp này. Tôi không biết nếu bạn hiểu ý tôi.
MaT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.