Questo codice di roulette russo è corretto?


8

Sto usando www.scratchapixel.com tra le altre risorse per aiutarmi a imparare come implementare un renderer. Sto guardando il seguente codice da questa pagina in cui viene preso in considerazione un pacchetto di fotoni che si muovono attraverso un materiale. Per ogni pacchetto di fotoni, il pesow è inizializzato a 1. dw è la probabilità di assorbimento.

La parte confusa per me è quando dw viene sottratto da w. Vedo che questo avrebbe senso quando il pacchetto avesse il peso di1 perché 1dwè la proporzione non assorbita dei fotoni. Ad esempio, se la probabilità di assorbimento è33% poi w=10.33=0.67 e 67%dei fotoni rimangono. Non riesco a vedere come questo abbia senso nelle iterazioni successive. Ad esempio, sull'iterazione due,w=0.670.33=0.34 così metà dei fotoni sono assorbiti da questa iterazione, non un terzo.

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 
        } 
    } 
} 

Risposte:


4

Penso che tu abbia ragione e che la sottrazione sia un errore. Il codice dovrebbe piuttosto moltiplicare la frazione di fotoni non assorbiti nel peso. Qualcosa di simile a:

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

Questo rende absorptionla frazione totale di fotoni assorbita finora e wla frazione di fotoni rimanente.


2
Come addendum: la risposta a questa altra domanda ha un codice di esempio per la roulette russa. computergraphics.stackexchange.com/questions/2316/…
RichieSams
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.