Este código da roleta russa está correto?

8

Estou usando www.scratchapixel.com entre outros recursos para me ajudar a aprender como implementar um renderizador. Estou observando o código a seguir nesta página, em que um pacote de fótons que se move através de um material está sendo considerado. Para cada pacote de fótons, o peso é inicializado em . é a probabilidade de absorção.w1dw

A parte confusa para mim é quando é subtraído de . Percebo que isso faria sentido quando o pacote tiver peso total de porque é a proporção não absorvida de fótons. Por exemplo, se a probabilidade de absorção for então e dos fótons permanecem. Não vejo como isso faz sentido nas iterações subseqüentes. Por exemplo, na iteração dois, portanto metade dos fótons são absorvidos nessa iteração, e não um terço.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
fonte

Respostas:

4

Eu acho que você está certo e a subtração é um erro. O código deveria multiplicar a fração de fótons não absorvidos pelo peso. Algo como:

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

Isso faz com que absorptiona fração total de fótons seja absorvida até o momento e wa fração de fótons restantes.

Nathan Reed
fonte
2
Como um adendo: a resposta a essa outra pergunta tem um código de exemplo para a roleta russa. computergraphics.stackexchange.com/questions/2316/…
RichieSams 14/16