¿Es correcto este código de ruleta rusa?


8

Estoy usando www.scratchapixel.com entre otros recursos para ayudarme a aprender cómo implementar un renderizador. Estoy mirando el siguiente código de esta página donde se está considerando un paquete de fotones que se mueven a través de un material. Para cada paquete de fotones, el peso se inicializa a . es la probabilidad de absorción.w1dw

La parte confusa para mí es cuando se resta de . Puedo ver que esto tendría sentido cuando el paquete tiene un peso total de porque es la proporción no absorbida de fotones. Por ejemplo, si la probabilidad de absorción es entonces y queda el de los fotones. No puedo ver cómo esto tiene sentido en las iteraciones posteriores. Por ejemplo, en la iteración dos, por lo que la mitad de los fotones se absorben en esta iteración, no un tercero.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 
        } 
    } 
} 

Respuestas:


4

Creo que tienes razón y la resta es un error. El código debería multiplicar la fracción de fotones no absorbidos por el peso. Algo como:

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

Esto hace que absorptionla fracción total de fotones absorbidos hasta el momento, y wla fracción de fotones restantes.


2
Como anexo: la respuesta a esta otra pregunta tiene un código de muestra para la ruleta rusa. computergraphics.stackexchange.com/questions/2316/…
RichieSams
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.