Ist dieser russische Roulette-Code korrekt?

8

Ich verwende unter anderem www.scratchapixel.com, um zu lernen, wie man einen Renderer implementiert. Ich betrachte den folgenden Code von dieser Seite, in dem ein Paket von Photonen betrachtet wird, die sich durch ein Material bewegen. Für jedes Photonenpaket wird das Gewicht auf initialisiert . ist die Absorptionswahrscheinlichkeit.w1dw

Der verwirrende Teil für mich ist, wenn von subtrahiert wird . Ich kann sehen, dass dies sinnvoll wäre, wenn das Paket das volle Gewicht von da der nicht absorbierte Anteil der Photonen ist. Wenn zB Absorptionswahrscheinlichkeit ist dann und der Photonen bleiben. Ich kann nicht sehen, wie sinnvoll dies bei nachfolgenden Iterationen ist. Zum Beispiel ist bei Iteration zwei so dass die Hälfte der Photonen bei dieser Iteration absorbiert wird, nicht ein Drittel.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
quelle

Antworten:

4

Ich denke du hast recht und die Subtraktion ist ein Fehler. Der Code sollte vielmehr den Anteil der nicht vom Gewicht absorbierten Photonen multiplizieren. Etwas wie:

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

Dadurch wird absorptionder Gesamtanteil der bisher absorbierten Photonen und wder Anteil der verbleibenden Photonen absorbiert .

Nathan Reed
quelle
2
Als Nachtrag: Die Antwort auf diese andere Frage enthält einen Beispielcode für russisches Roulette. computergraphics.stackexchange.com/questions/2316/…
RichieSams