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 / wavelength
menjadi 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! :)