Apakah kode roulette Rusia ini benar?

8

Saya menggunakan www.scratchapixel.com di antara sumber daya lain untuk membantu saya mempelajari cara menerapkan renderer. Saya melihat kode berikut dari halaman ini di mana satu paket foton bergerak melalui suatu bahan sedang dipertimbangkan. Untuk setiap paket foton, bobot diinisialisasi ke . adalah probabilitas penyerapan.w1dw

Bagian yang membingungkan bagi saya adalah ketika dikurangi dari . Saya dapat melihat ini masuk akal ketika paket memiliki berat penuh karena adalah proporsi foton yang tidak diserap. Misal jika probabilitas penyerapan adalah maka dan dari foton tetap. Saya tidak bisa melihat bagaimana ini masuk akal pada iterasi selanjutnya. Misalnya, pada iterasi dua, sehingga setengah foton diserap pada iterasi ini, bukan sepertiga.dww11dw33%w=10.33=0.6767%w=0.670.33=0.34

int photons = 10000; 
... 
int m = 5; // there's 1 over 6 chances for the packet to be absorbed 
for (int i = 0; i < nphotons; ++i) { 
    float w = 1; // set the weight to 1 
    Vec3f P(0, 0, 0); 
    Vec3f V(0, 0, 1); 
    while (1) { 
        ... 
        float dw = sigma_a / sigma_t; 
        absorption += dw; 
        w -= dw; 
        if (w < 0.001) { // perform russian roulette if weight is small 
            if (drand48() < 1.0 / m) { 
                break; // we kill the packet 
            } 
            else 
                w *= m; // adjust weight 
        } 
    } 
} 
PeteUK
sumber

Jawaban:

4

Saya pikir Anda benar dan pengurangannya adalah kesalahan. Kode ini lebih baik mengalikan fraksi foton yang tidak terserap ke dalam berat. Sesuatu seperti:

float fraction_absorbed = sigma_a / sigma_t;
absorption += w * fraction_absorbed;
w *= (1.0f - fraction_absorbed);

Ini membuat absorptionfraksi total foton terserap sejauh ini, dan wfraksi foton tersisa.

Nathan Reed
sumber
2
Sebagai tambahan: Jawaban untuk pertanyaan lain ini memiliki beberapa kode sampel untuk roulette Rusia. computergraphics.stackexchange.com/questions/2316/…
RichieSams