Memilih Refleksi atau Pembiasan dalam Penelusuran Jalur

14

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

Berapa banyak pantulan cahaya vs refraksi diberikan oleh Fresnel Equations masukkan deskripsi gambar di sini

Dalam pelacak sinar rekursif, implementasi sederhana adalah menembakkan sinar untuk refleksi dan sinar untuk refraksi, kemudian melakukan penjumlahan tertimbang menggunakan Fresnel.

R=Fresnel()T=1-RLHai=RLsaya, refleksi+TLsaya, pembiasan

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.

RichieSams
sumber
roulette Rusia
v.oddou

Jawaban:

6

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:

Lsaya(ωsaya)F(θsaya)P(ωsaya)=Lsaya(ωsaya)F(θsaya)F(θsaya)=Lsaya(ωsaya)

ωsaya=(ϕsaya,θsaya)Lsaya(ωsaya)F(θsaya)P(ωsaya)F(θsaya)

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.

ivokabel
sumber
1
Ini menarik tetapi saya bingung dengan satu hal. Bisakah Anda mengklarifikasi apa artinya "membagi hasil untuk arah itu dengan kemungkinan memilih arah"? Jika ini bukan pilihan biner tetapi arah yang dipilih dari distribusi kontinu, bukankah probabilitasnya akan nol?
trichoplax
1
@trichoplax: Ya, tapi dalam paragraf itu saya menjelaskan teknik pengambilan sampel hanya untuk Fresnel BSDF (dielektrik) - permukaan yang idealnya halus, yang merupakan jumlah dari dua fungsi Dirac delta. Dalam kasus seperti itu, Anda memilih salah satu arah dengan beberapa probabilitas terpisah. Dalam kasus BSDF non-delta (terbatas), Anda menghasilkan arah sesuai dengan fungsi kepadatan probabilitas. Sayangnya, kasus delta dan non-delta harus ditangani secara terpisah, yang membuat kode ini sedikit berantakan. Rincian lebih lanjut tentang sampel BSDF mikrofacet dapat ditemukan, misalnya dalam Walter et. Al. [2007] kertas.
ivokabel
2
@RichieSams: Walter et. Al. [2007] pada dasarnya masih menjadi yang terdepan untuk permukaan kasar dielektrik, tetapi untuk membuatnya bekerja dengan baik, Anda perlu pengambilan sampel yang baik yang baru-baru ini diterbitkan oleh Heitz dan D'Eon pada makalah 2014 "Pentingnya Pengambilan Sampel BSDFs Berbasis Mikrofacet menggunakan Distribusi Normal yang Terlihat ". Dan perhatikan bahwa ini adalah model hamburan tunggal yang mengabaikan inter-refleksi antara mikrofacet membuatnya tampak gelap untuk nilai kekasaran yang lebih tinggi. Lihat pertanyaan saya "Kompensasi untuk kehilangan energi dalam model BSDF mikrofacet hamburan tunggal" untuk detail lebih lanjut.
ivokabel
5
Hanya ingin menunjukkan bahwa jika Anda memilih probabilitas = fresnel () seperti pertanyaan yang disarankan, maka ketika Anda membaginya dengan probabilitas, Anda membatalkan faktor Fresnel yang biasanya akan dikalikan. Jadi (dalam kasus diskrit, dua-Dirac ) Anda berakhir dengan kontribusi sinar tidak termasuk faktor Fresnel sama sekali. Ini adalah teori standar sampel-penting, tetapi saya pikir saya akan menunjukkannya sebagai masalah yang berpotensi membingungkan.
Nathan Reed
2
@ Nathan, saya memasukkan pemberitahuan Anda ke dalam jawabannya.
ivokabel