Saya mencoba menerapkan pembiasan dan transmisi di jalur pelacak saya dan saya agak tidak yakin tentang bagaimana menerapkannya. Pertama, beberapa latar belakang:
Ketika cahaya menyentuh permukaan, sebagian darinya akan memantul, dan sebagian dibiaskan:
Berapa banyak pantulan cahaya vs refraksi diberikan oleh Fresnel Equations
Dalam pelacak sinar rekursif, implementasi sederhana adalah menembakkan sinar untuk refleksi dan sinar untuk refraksi, kemudian melakukan penjumlahan tertimbang menggunakan Fresnel.
Namun, dalam pelacakan jalur, kami hanya memilih satu jalur. Ini pertanyaan saya:
- Bagaimana cara saya memilih apakah akan mencerminkan atau membiasakan diri dengan cara yang tidak bias
Tebakan pertama saya adalah memilih secara acak berdasarkan Fresnel. Aka:
float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
// Reflect
} else {
// Refract
}
Apakah ini benar? Atau apakah saya perlu memiliki semacam faktor koreksi? Karena saya tidak mengambil kedua jalur.
sumber
Jawaban:
TL; DR
Ya, Anda bisa melakukannya seperti itu, Anda hanya perlu membagi hasilnya dengan kemungkinan memilih arah.
Jawaban Lengkap
Topik pengambilan sampel dalam pelacak jalur yang memungkinkan bahan dengan refleksi dan pembiasan sebenarnya sedikit lebih kompleks.
Mari kita mulai dengan latar belakang terlebih dahulu. Jika Anda mengizinkan BSDF - bukan hanya BRDF - di pelacak jalur Anda, Anda harus mengintegrasikan seluruh bola bukan hanya belahan positif. Sampel Monte Carlo dapat dihasilkan oleh berbagai strategi: untuk penerangan langsung Anda dapat menggunakan BSDF dan pengambilan sampel cahaya, untuk penerangan tidak langsung, satu-satunya strategi yang berarti biasanya adalah pengambilan sampel BSDF. Strategi pengambilan sampel itu sendiri biasanya berisi keputusan tentang belahan mana yang akan diambil sampel (misalnya apakah refleksi atau refraksi dihitung).
Dalam versi yang paling sederhana, sampling cahaya biasanya tidak terlalu memerhatikan refleksi atau refraksi. Ini sampel sumber cahaya atau peta lingkungan (jika ada) sehubungan dengan sifat cahaya. Anda dapat meningkatkan pengambilan sampel peta lingkungan dengan memilih hanya belahan bumi di mana material memiliki kontribusi tidak nol, tetapi sisa properti material biasanya diabaikan. Perhatikan bahwa untuk dan bahan Fresnel idealnya halus, pengambilan sampel cahaya tidak berfungsi.
Untuk pengambilan sampel BSDF, situasinya jauh lebih menarik. Kasing yang Anda jelaskan berkaitan dengan permukaan Fresnel yang ideal, di mana hanya ada dua arah yang berkontribusi (karena Fresnel BSDF sebenarnya hanya jumlah dari dua fungsi delta). Anda dapat dengan mudah membagi integral menjadi jumlah dua bagian - satu refleksi dan satu untuk pembiasan. Karena, seperti yang Anda sebutkan, kami tidak ingin pergi ke dua arah dalam pelacak jalur, kami harus memilih satu. Ini berarti bahwa kami ingin memperkirakan jumlah angka dengan memilih satu saja. Ini dapat dilakukan dengan estimasi Monte Carlo diskrit: pilih salah satu dari addend secara acak dan bagi dengan kemungkinan dipungut. Dalam kasus ideal Anda ingin memiliki probabilitas sampling proporsional dengan penambahannya, tetapi karena kami tidak tahu nilainya (kami tidak perlu memperkirakan jumlahnya jika kami mengetahuinya), kami hanya memperkirakannya dengan mengabaikan beberapa faktor. Dalam hal ini, kami mengabaikan jumlah cahaya yang masuk dan hanya menggunakan reflektansi / transmisi Fresnel sebagai perkiraan kami.
Oleh karena itu, rutin pengambilan sampel BSDF untuk kasus permukaan Fresnel yang halus adalah untuk memilih salah satu arah secara acak dengan probabilitas yang sebanding dengan reflektansi Fresnel dan, pada beberapa titik, membagi hasil untuk arah itu dengan probabilitas memilih arah. Estimator akan terlihat seperti:
Dalam kasus model BSDF yang lebih canggih seperti yang didasarkan pada teori microfacet, pengambilan sampel sedikit lebih kompleks, tetapi gagasan untuk memecah seluruh integral menjadi jumlah sub-integral yang terbatas dan menggunakan Monte Carlo diskrit setelah itu biasanya dapat diterapkan juga.
sumber