Apakah ini cara yang benar untuk menerapkan Hukum Beer's?

11

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): masukkan deskripsi gambar di sini

Dan ini dia tanpa refraksi: masukkan deskripsi gambar di sini

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: masukkan deskripsi gambar di sini

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?

Alan Wolfe
sumber
2
Anda membandingkan kubus dengan jaring yang lebih kompleks. Mengapa tidak meniru skenario yang sama? Model Susan mudah didapat.
Bart
Ini tidak mudah dalam implementasi shadertoy! (:
Alan Wolfe
2
Anda kubus terlihat benar bagi saya: Dapatkan lebih transparan saat mendekati tepi. Jika Anda dapat melakukan full blown Suzanne, sphere setidaknya harus memberikan perkiraan yang lebih baik dari tampilan di gambar lain.
yuriks
1
Saya tidak bisa memisahkan refraksi dari atenuasi. Bisakah Anda membuat kubus dengan IOR = 1.0?
imallett
1
@AlanWolfe IOR Anda = 1 render terlihat persis seperti yang saya harapkan, dan saya membaca skim shadertoy impl dan terlihat bagus.
imallett

Jawaban:

12

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:

refleksi internal total

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:

kubus kaca lacak jalur

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.

MJP
sumber
1
Here is what a cube looks like (...) using my own path tracer. Apakah Anda kebetulan membuka sumbernya secara kebetulan?
usap
2
Tidak, belum. Saya berencana untuk menyelesaikan dan merilis varian khusus ini bersama dengan posting blog tentang rendering kaca, tetapi sudah di backlog saya untuk sementara waktu.
MJP