提交 3a756e20 编写于 作者: M Matt Pharr

Remove medium samples from RaySamples used in wavefront integrator.

The previous implementation would inadvertently reuse the same sample value
for medium distance sampling when rays passed through interfaces between
different scattering media. In turn, this led to significant errors in
rendered images.

See issue #221...
上级 14e5cf4b
......@@ -55,8 +55,8 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
bool scattered = false;
RaySamples raySamples = pixelSampleState.samples[w.pixelIndex];
Float uDist = raySamples.media.uDist;
Float uMode = raySamples.media.uMode;
Float uDist = rng.Uniform<Float>();
Float uMode = rng.Uniform<Float>();
SampledSpectrum T_maj = SampleT_maj(
ray, tMax, uDist, rng, lambda,
......
......@@ -39,8 +39,6 @@ void WavefrontPathIntegrator::GenerateRaySamples(int wavefrontDepth, int sampleI
int dimension = 6 + 7 * w.depth;
if (haveSubsurface)
dimension += 3 * w.depth;
if (haveMedia)
dimension += 2 * w.depth;
// Initialize _Sampler_ for pixel, sample index, and dimension
ConcreteSampler pixelSampler = *sampler.Cast<ConcreteSampler>();
......@@ -62,12 +60,6 @@ void WavefrontPathIntegrator::GenerateRaySamples(int wavefrontDepth, int sampleI
rs.subsurface.u = pixelSampler.Get2D();
}
rs.haveMedia = haveMedia;
if (haveMedia) {
rs.media.uDist = pixelSampler.Get1D();
rs.media.uMode = pixelSampler.Get1D();
}
// Store _RaySamples_ in pixel sample state
pixelSampleState.samples[w.pixelIndex] = rs;
});
......
......@@ -35,10 +35,6 @@ struct RaySamples {
Float uc;
Point2f u;
} subsurface;
bool haveMedia;
struct {
Float uDist, uMode;
} media;
};
template <>
......@@ -62,7 +58,6 @@ struct SOA<RaySamples> {
rs.direct.uc = dir.v[2];
rs.haveSubsurface = int(dir.v[3]) & 1;
rs.haveMedia = int(dir.v[3]) & 2;
Float4 ind = Load4(indirect + i);
rs.indirect.uc = ind.v[0];
......@@ -75,11 +70,6 @@ struct SOA<RaySamples> {
rs.subsurface.u = Point2f(ss.v[1], ss.v[2]);
}
if (rs.haveMedia) {
rs.media.uDist = mediaDist[i];
rs.media.uMode = mediaMode[i];
}
return rs;
}
......@@ -89,7 +79,7 @@ struct SOA<RaySamples> {
PBRT_CPU_GPU
void operator=(RaySamples rs) {
int flags = (rs.haveSubsurface ? 1 : 0) | (rs.haveMedia ? 2 : 0);
int flags = rs.haveSubsurface ? 1 : 0;
soa->direct[index] =
Float4{rs.direct.u[0], rs.direct.u[1], rs.direct.uc, Float(flags)};
soa->indirect[index] = Float4{rs.indirect.uc, rs.indirect.rr,
......@@ -97,10 +87,6 @@ struct SOA<RaySamples> {
if (rs.haveSubsurface)
soa->subsurface[index] =
Float4{rs.subsurface.uc, rs.subsurface.u.x, rs.subsurface.u.y, 0.f};
if (rs.haveMedia) {
soa->mediaDist[index] = rs.media.uDist;
soa->mediaMode[index] = rs.media.uMode;
}
}
SOA *soa;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册