next up previous
Seguinte: Integrador de Dispersão Simples. Acima: Análise da Radiância em Anterior: Integradores

Integrador somente de Emissão

É o integrador volumétrico mas simples. Ignora a dispersão para dentro (In-scattering) e somente considera emissão e atenuação.

Então a equação de transferência fica assim

$ L_i(r,\omega) = T(s\rightarrow r)L_o(s,\omega) + \int_0^h
T(r-z\omega\rightarrow
r)L_{ve}(r - z\omega, \omega)dz$
O EmissionIntegrator usa integração de Monte Carlo para resolver esta equação.

Para os metodos de Transmittancia() e L_i() temos que:


00019 EmissionIntegrator(float ss) { stepSize = ss; }
$ \langle EmissionIntegrator\ Private\ Data\rangle$
00025         float stepSize;


Transmittance():


O Tau() de VolumeRegions calcula a espessura óptica $ \tau$. O único trabalho para o integrador aqui é escolher o tamanho de passo, dar um valor de amostra simples e calcular $ e^{-\tau}$.

$ \langle EmissionIntegrator\ Method\ Definitions\rangle$

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 $ L_i$ calcula a integral

$ \int_{t_0}^{t_1} T(r-z\omega\rightarrow
r)L_{ve}(r - z\omega, \omega)dz$

Onde $ t_0$ é ponto onde o raio entra no meio participativo, ou o começo do raio andando. Similarmente, o fim, $ t_1$, é 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 $ p_i$ ao longo do raio entre $ t_0$ e $ t_1$ e avaliando o estimador

$ \dfrac{1}{N}\sum \dfrac{T(r_i\rightarrow r)L_{ve}(r_i,w)}{p(r_i)} =
\dfrac{t_1-t_0}{N}\sum_i
T(r_i\rightarrow r)L_{ve}(r_i,w)$
para pontos uniformes temos $ p(r_i)=\dfrac{1}{t_1-t_0}$, $ L_{ve}$ e $ T$ é avaliado por o estimador em VolumeRegion.
A implementação de L_i() começa encontrando o $ z$ para a integral entre $ t_0$ e $ t_1$.Duas técnicas são usadas aqui

  1. VolumeRegions::Tau() usa passos uniformes entre os pontos das amostras.
  2. A transmissão do raio pode ser avaliada eficientemente se os pontos $ r_i$ são sorteados perto da origem do raio $ r$ que longe dela.

A propriedade multiplicativa de $ T$ pode ser usada para calcular $ T$ por passos.

$ T(r_i\rightarrow r)=T(r_{i-1}\rightarrow r)T(r_{i}\rightarrow
r_{i-1})$

como cobre uma menor distanância que $ T(r_i\rightarrow r)$ menos amostras podem ser usadas para estimar seu valor se é avaliado por Monte Carlo.

Processo

  1. A extensão do raio de $ t_0$ ate $ t_1$ é subdividido em um número de segmentos baseado em o parametro passo de StepSize. Uma amostra simples é tomada em cada segmento, onde a primeira amostra é localizada aleatoriamente no primeiro segmento e todas as outras amostras são offset por igual tamanho de passos.

  2. A marcha do raio (ray-marching) rastreia o ponto anterior no qual a transmissão foi calculada, pPrev também como o ponto de corrente $ r$. Inicialmente, pPrev é o ponto por onde o raio entra ao volume.

  3. Em cada passo seguinte a transmissão do raio é calculado como o produto da transmissão em pPrev vezes a transmissão adicional de pPrev ate $ r$.
$ \langle Prepare\ for\ volume\ integration\ stepping \rangle=$
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.

$ \langle Advance\ to\ sample\ at\ \_ \ t0\_\ and\ update\ \_T\_\
\rangle$

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.

$ \langle Possibly\ terminate\ raymarching\ if\ transmittance\ is\
small\rangle=$

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);


next up previous
Seguinte: Integrador de Dispersão Simples. Acima: Análise da Radiância em Anterior: Integradores
Dalia Melissa Bonilla Correa 2006-09-08