Saya pikir Anda harus berpikir tentang efeknya sebagai "menghitung peta di mana air" + "menghasilkan vektor normal dari peta itu dan menggunakannya untuk mengimbangi pencarian tekstur latar belakang".
Memecah apa yang contoh shadertoy Anda lakukan, itu hanya menghitung "jejak" untuk menunjukkan di mana defogging terjadi:
Menghitung normal dari tetesan hujan melingkar,
dan menggunakan peta normal itu untuk mengimbangi pencarian tekstur ke pembiasan palsu.
Jika Anda ingin jalur dilakukan melalui post-processing dalam shader, Anda harus membuat bentuk "trail" di shader menggunakan beberapa aljabar. Misalnya, dalam fungsi berikut, saya telah overlay "jalur goyah" dan lancip di kepala dan ekor untuk mendapatkan
float trailDrop(vec2 uv, vec2 id, float t) {
// wobbly path
float wobble = 0.5 + 0.5
* cos(120.0 * uv.y)
* sin(50.0 * uv.y);
float v = 1.0 - 10.0 * abs(uv.x - 0.5 + 0.2 * wobble);
// head
v *= clamp(30.0 * uv.y, 0.0, 1.0);
v *= clamp( uv.y + 7.0 * t - 0.6, 0.0, 1.0);
// tail
v *= clamp(1.0 - uv.y - pow(t, 2.0), 0.0, 1.0);
return clamp(v * 10.0, 0.0, 1.0);
}
Berikut ini adalah POC kasar di shadertoy - https://www.shadertoy.com/view/XlBfz1 yang mendemonstrasikan pembuatan satu set jalur hujan. Itu terlihat kasar pada resolusi kecil karena resolusi turunan tetapi harus terlihat lebih baik jika Anda fullscreen
Sunting: Menambahkan contoh dengan tetesan hujan yang dihamparkan
Ditinggalkan sebagai latihan untuk pembaca:
1) Tambahkan tetes bulat kecil. untuk inspirasi, lihat StaticDrops
fungsi dalam contoh shadertoy asli Anda.
2) Tambahkan dalam perhitungan normal berkualitas tinggi. Seperti yang #define CHEAP_NORMALS
tersirat dalam opsi contoh shadertoy asli Anda, dFdx bawaan adalah pendekatan kesetiaan yang rendah dan Anda bisa mendapatkan hasil yang lebih baik dengan secara manual menghitung turunannya (dengan biaya menghitung fungsi 3 kali).
3) Mengacak jarak antar kolom. Anda dapat memperluas kolom dan kemudian memodifikasi uv.x - 0.5 + 0.2 * wobble
bit untuk menambahkan offset acak pada sumbu x. Anda mungkin juga ingin mengambil satu halaman dari contoh aslinya sekali lagi dan melapisi beberapa lapis aliran ukuran yang berbeda satu sama lain untuk mendapatkan tampilan yang kurang seragam.
Anda dapat membuat efek ini dengan mengikuti langkah-langkah di bawah ini:
Partikel
RenderTextuer
Anda dapat menyimpan hasilnya dengan menggunakan RenderTexture. ini adalah contoh multipass di shadertoy:
https://www.shadertoy.com/view/ltccRl
Saya membuat kamera untuk Rendering partikel ke RenderTexture:
GrabPassing
Anda dapat memperoleh pass untuk menerapkan Distortion
Saya jelaskan di posting ini:
Bagaimana saya bisa meniru efek partikel distorsi Quantum Break?
Mengaburkan
dengan menggunakan alpha dalam warna lebih dari Lifetime kami memiliki blur sederhana
untuk mendapatkan hasil yang lebih baik lebih baik menggunakan blur sederhana, tetapi bagaimana kita mencapai blur?
Matriks konvolusi
Dalam pemrosesan gambar, kernel, matriks konvolusi, atau mask adalah matriks kecil. Ini digunakan untuk pengaburan, penajaman, embossing, deteksi tepi, dan banyak lagi. Ini dilakukan dengan melakukan konvolusi antara kernel dan gambar.
untuk lebih jelasnya, silakan ikuti tautan ini
Boxblur
Pengulangan
Anda dapat menggunakan Rendertexture untuk menyimpan frame sebelumnya. dengan mengulangi ini Anda mencapai blur.
Normal
Kesimpulan
Shader terakhir:
tanpa menggunakan warna alfa selama Lifetime:
dengan menggunakan alpha dalam warna sepanjang Lifetime:
Sumber tersedia:
https://github.com/smkplus/RainDrop
Masih ada lagi!
Anda juga bisa membuat Riak
Tautan yang Berguna
https://80.lv/articles/breakdown-animated-raindrop-material-in-ue4/
https://seblagarde.wordpress.com/2013/01/03/water-drop-2b-dynamic-rain-and-its-effects/
sumber
Sebenarnya ada pertanyaan tentang ini tahun lalu, tetapi itu tidak berkaitan dengan Unity sama sekali (sayangnya). Jika Anda melihat slide 57 dari presentasi yang ditautkan, mereka menyebutkan pendekatan berbasis grid.
Ada pertanyaan yang agak terkait pada Fisika SE yang mungkin menarik bagi Anda. Tautan ke droplet.pdf dalam pertanyaan yang ditautkan rusak, tetapi masih ada di Wayback Machine. Ini masuk ke beberapa matematika air yang mengalir dari beberapa jenis permukaan. Tetesan lebih suka melakukan perjalanan di jalur yang sebelumnya digunakan oleh hujan sebelumnya, misalnya (lihat hal926).
Anda mungkin bisa hanya memodelkan kepala dan ekor dari setiap "tetesan air hujan" dan membiarkannya zig dan zag sedikit. Ketika dua tetes hujan yang memanjang bertabrakan, saya kira Anda bisa membuatnya menjadi hujan yang lebih besar dan bergerak lebih cepat. Volume air tetap sama. Itu hanya digerakkan dan dibentuk oleh kekuatan gravitasi, adhesi pada kaca, dan kohesi.
sumber