Rendering air berminyak / tercemar?

19

Penyihir shader apa pun di luar sana memiliki gagasan tentang cara mencapai efek air berminyak / tercemar, serupa dengan ini:

air berminyak

Idealnya, air tidak akan berminyak secara seragam, tetapi sebaliknya minyak dapat dihasilkan dari beberapa sumber (seperti saluran pencemar dari pabrik kimia) dan kemudian berdifusi ke seluruh badan air. Pemikiran saya untuk bagian ini adalah untuk menjaga "peta minyak" sebagai tekstur 2D yang menentukan kepadatan minyak di setiap titik di permukaan air. Ini akan berdifusi dan bergerak secara alami dengan kecepatan air pada saat itu (saya memiliki simulasi gelombang-partikel untuk gelombang dinamis, dan saya sudah melakukan sesuatu yang serupa untuk busa di permukaan air). Namun, saya tidak yakin seberapa benar secara fisik itu, karena minyak mungkin tidak bergerak pada kecepatan yang sama dengan air.

Dan saya tidak tahu bagaimana membuat semua warna trippy itu :-). Pikiran?

Robert Fraser
sumber
Gunakan tekstur ..? Gradien radial kromatik, terapkan beberapa distorsi ..
bobobobo
@bobobobo - Arah yang Anda lihat memengaruhi warna mana yang ditampilkan, meskipun ... youtube.com/watch?v=NRtUoMG16ZU
Robert Fraser
1
Anda akan ingin menerapkan shader berdasarkan en.wikipedia.org/wiki/Thin-film_interference tetapi saya tidak tahu bagaimana cara menulisnya.
jzx
2
( gamedev.net/page/resources/_/technical/… ) Saya tidak dapat menyaring jawaban karena saya tidak tahu topiknya
horatio

Jawaban:

25

Dasar fisik dari warna minyak adalah warna - warni , dan juga terkait dengan cincin Newton . Secara khusus, ketebalan lapisan minyak berada di urutan panjang gelombang cahaya. Karena cahaya memantul dari permukaan atas dan bawah minyak, pada panjang gelombang tertentu, pada beberapa sudut kedua refleksi akan keluar dari fase dan membatalkan satu sama lain; di sudut lain pantulan akan berada dalam fase dan ditambahkan bersama. Ini terjadi pada sudut yang berbeda untuk setiap panjang gelombang, sehingga menyinari minyak dengan cahaya putih menghasilkan semua warna tersebut. Jika Anda menyalakannya dengan frekuensi tunggal (mis. Sinar laser), Anda hanya akan melihat serangkaian cincin terang dan gelap.

Jika Anda mengabaikan pembiasan dalam lapisan minyak, hanya mengerjakan geometri situasi, Anda dapat menemukan bahwa kecerahan cahaya yang dipantulkan untuk setiap panjang gelombang yang diberikan harus bervariasi seperti

sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5

Secara teoritis ini harus diintegrasikan pada semua panjang gelombang, tetapi dalam praktiknya Anda mungkin hanya dapat melakukannya untuk merah, hijau, dan biru - katakanlah masing-masing 700, 550, dan 400 nm. Mengubah ketebalan oli akan mengubah jari-jari lingkaran warna yang tampak. Saya mungkin akan membungkusnya 2.0 * pi * oilThickness / wavelengthmenjadi nilai RGB tunggal yang disediakan untuk shader sebagai nilai seragam. Anda bisa mengalikannya dengan tekstur untuk mensimulasikan berbagai ketebalan minyak, jika diinginkan - mungkin itulah yang memberi sebagian besar tekstur menarik pada gambar di atas.

Itu menghasilkan nilai warna RGB yang dapat Anda gandakan ke dalam BRDF Anda. The dot(L, H)Faktor akan digunakan untuk titik lampu / directional, dan Anda dapat mengganti dot(N, V)di sana untuk menerapkan ini untuk refleksi peta lingkungan juga.

Penafian: Saya belum mencoba ini dalam shader, hanya menggambar beberapa diagram dan meyakinkan diri sendiri bahwa "harus bekerja" ... jadi beri tahu saya hasilnya jika Anda mencobanya! :)

Nathan Reed
sumber
Hal yang keren. Alasan mengapa ada pantulan di permukaan minyak atas dan bawah adalah karena beberapa gelombang dipantulkan di atas sementara yang lain hanya dibiaskan. Gelombang-gelombang yang dibiaskan ini maju ke permukaan kapas, di mana mereka dapat dibiaskan kembali atau dipantulkan.
dsilva.vinicius