Ce code de roulette russe est-il correct?

8

J'utilise www.scratchapixel.com entre autres ressources pour m'aider à apprendre à implémenter un moteur de rendu. Je regarde le code suivant de cette page où un paquet de photons se déplaçant à travers un matériau est envisagé. Pour chaque paquet de photons, le poidsw est initialisé à 1. dw est la probabilité d'absorption.

La partie déroutante pour moi, c'est quand dw est soustrait de w. Je peux voir que cela aurait du sens lorsque le paquet a un poids total de1 parce que 1dwest la proportion non absorbée de photons. Par exemple, si la probabilité d'absorption est33% puis w=10.33=0.67 et 67%des photons restent. Je ne vois pas comment cela a du sens sur les itérations suivantes. Par exemple, à l'itération deux,w=0.670.33=0.34 donc la moitié des photons sont absorbés lors de cette itération, pas un tiers.

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
la source

Réponses:

4

Je pense que vous avez raison et la soustraction est une erreur. Le code devrait plutôt multiplier la fraction de photons non absorbée dans le poids. Quelque chose comme:

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

Cela rend absorptionla fraction totale de photons absorbée jusqu'à présent et wla fraction de photons restante.

Nathan Reed
la source
2
En complément: la réponse à cette autre question contient un exemple de code pour la roulette russe. computergraphics.stackexchange.com/questions/2316/…
RichieSams