Então a equação de transferência fica assim
Para os metodos de Transmittancia() e L_i() temos que:
00019 EmissionIntegrator(float ss) { stepSize = ss; }
00025 float stepSize;
Transmittance():
O Tau() de VolumeRegions calcula a espessura óptica
. O único trabalho para o integrador aqui é
escolher o tamanho de passo, dar um valor de amostra
simples e calcular .
00035 Spectrum EmissionIntegrator::Transmittance(const Scene *scene, 00036 const Ray &ray, const Sample *sample, 00037 float *alpha) const { 00038 if (!scene->volumeRegion) return Spectrum(1.f); 00039 float step = sample ? stepSize : 4.f * stepSize; 00040 float offset = 00041 sample ? sample->oneD[tauSampleOffset][0] : 00042 RandomFloat(); 00043 Spectrum tau = 00044 scene->volumeRegion->Tau(ray, step, offset); 00045 return Exp(-tau); 00046 }
O método calcula a integral
Onde é ponto onde o raio entra no meio
participativo, ou o começo do raio andando.
Similarmente, o fim, , é o mínimo dos pontos onde
o raio existe no meio, ou o ponto onde interseta a
superfície.
Podemos encontrar a integral selecionando aleatoriamente pontos
ao longo do raio entre e e avaliando o estimador
como
cobre uma menor
distanância que
menos amostras podem
ser
usadas para estimar seu valor se é avaliado por Monte Carlo.
Processo
00056 int N = Ceil2Int((t1-t0) / stepSize); 00057 float step = (t1 - t0) / N; 00058 Spectrum Tr(1.f); 00059 Point p = ray(t0), pPrev; 00060 Vector w = -ray.d; 00061 if (sample) 00062 t0 += sample->oneD[scatterSampleOffset][0] * step; 00063 else 00064 t0 += RandomFloat() * step; 00065 for (int i = 0; i < N; ++i, t0 += step) {
Para encontrar todas as transmissões em um ponto de corrente, somente
é necessário achar a transmissão do ponto prévio ao ponto
corrente e multiplicar lo pela transmissão da origem do raio ao ponto
prévio.
00067 pPrev = p; 00068 p = ray(t0); 00069 Spectrum stepTau = vr->Tau(Ray(pPrev, p - pPrev, 0, 1), 00070 .5f * stepSize, RandomFloat()); 00071 Tr *= Exp(-stepTau);
Em um meio denso, a transmissão pode chegar a ser muito baixa depois
que o raio tem passado uma distância suficiente através do meio.
Para reduzir o tempo gastado calculando os valores do termo fonte que
são requeridos e estes provavelmente tenham menor contribuição
na radiância da origem do raio. O processo é aleatoriamente
terminado com a roleta-russa quando a transmissão é suficientemente
pequena.
00073 if (Tr.y() < 1e-3) { 00074 const float continueProb = .5f; 00075 if (RandomFloat() > continueProb) break; 00076 Tr /= continueProb; 00077 }
Tendo feito este trabalho, calcular o termo fonte é
trivial.
00079 Lv += Tr * vr->Lve(p, w);