Ketika saya menerapkan hukum Beer (penyerapan warna jarak jauh melalui suatu objek), itu tidak pernah terlihat sangat bagus untuk beberapa alasan.
Ketika saya memiliki warna di belakang objek, saya menghitung warna yang disesuaikan seperti ini:
const vec3 c_absorb = vec3(0.2,1.8,1.8);
vec3 absorb = exp(-c_absorb * (distanceInObject));
behindColor *= absorb;
Itu akan memberi saya sesuatu yang terlihat seperti ini (perhatikan sedikit pembiasan yang diterapkan):
Perhatikan bahwa ini diterapkan sebagai mainan shader di sini .
Itu memenuhi deskripsi tentang apa yang dilakukan undang-undang Beer, tetapi tidak terlihat sangat bagus, tidak bila dibandingkan dengan bidikan seperti ini:
Di samping sorotan specular, saya mencoba mencari tahu perbedaannya. Mungkinkah geometri saya terlalu sederhana untuk benar-benar memamerkannya dengan baik? Atau apakah saya salah mengimplementasikannya?
sumber
Jawaban:
Gambar Anda jelas tidak terlihat benar, dan tampaknya Anda tidak menghitung dengan benar jalur internal sinar cahaya saat bergerak melalui jaring Anda. Dari tampilannya, saya akan mengatakan bahwa Anda menghitung jarak antara titik di mana sinar pandangan pertama kali memasuki kubus dan di mana ia pertama kali menyentuh dinding interior, dan menggunakannya sebagai jarak serap Anda. Ini pada dasarnya mengasumsikan bahwa cahaya akan selalu keluar dari kaca saat pertama kali menyentuh dinding, yang merupakan asumsi yang buruk.
Pada kenyataannya, ketika cahaya masuk kaca dari udara, seringkali tidak segera keluar kaca. Ini karena ketika cahaya menerpa antarmuka kaca / udara, sebuah fenomena yang dikenal sebagai refleksi internal total (TIR) dapat terjadi. TIR terjadi ketika cahaya bergerak dari media dengan indeks bias yang lebih tinggi (IOR) ke yang dengan IOR lebih rendah, yang persisnya terjadi pada kasus cahaya yang mengenai dinding bagian dalam objek kaca. Gambar dari Wikipedia ini adalah demonstrasi visual yang bagus dari apa yang tampak ketika itu terjadi:
Dalam istilah dasarnya, artinya adalah jika cahaya menyentuh sudut yang dangkal, cahaya akan sepenuhnya memantul dari interior media. Untuk menjelaskan ini, Anda perlu mengevaluasi persamaan Fresnelsetiap kali sinar cahaya Anda mengenai antarmuka kaca / udara (AKA permukaan interior mesh Anda). Persamaan Fresnel akan memberi tahu Anda rasio cahaya yang dipantulkan dengan jumlah cahaya yang dibiaskan, sedangkan akan menjadi 1 dalam kasus TIR. Anda kemudian dapat menghitung arah cahaya yang dipantulkan dan dibiaskan yang tepat, dan terus melacak jalur cahaya baik melalui media atau di luar itu. Jika Anda mengasumsikan mesh cembung sederhana dengan koefisien hamburan yang seragam, maka jarak yang digunakan untuk hukum Beer akan menjadi jumlah dari semua panjang jalur internal sebelum keluar dari medium. Inilah yang tampak seperti sebuah kubus dengan koefisien hamburan Anda dan IOR 1,526 (gelas soda kapur), yang dibuat dengan menggunakan pelacak jalur saya sendiri yang bertanggung jawab atas refleksi dan refraksi internal dan eksternal:
Pada akhirnya refleksi dan pembiasan internal adalah bagian utama dari apa yang membuat kaca tampak seperti kaca. Perkiraan sederhana benar-benar tidak memotongnya, seperti yang sudah Anda ketahui. Semakin buruk jika Anda menambahkan beberapa jerat dan / atau jerat non-cembung, karena Anda tidak hanya harus memperhitungkan refleksi internal tetapi juga harus memperhitungkan sinar yang meninggalkan medium dan memasukkannya pada titik yang berbeda.
sumber
Here is what a cube looks like (...) using my own path tracer.
Apakah Anda kebetulan membuka sumbernya secara kebetulan?