...
 
Commits (3)
    https://gitcode.net/imjiangjun/pbrt-v4/-/commit/4437d22630ace64571c78524b6746397ae8a975b Use consistent parameter name on CPU/GPU for displacment edge length 2022-12-21T06:42:41-08:00 Matt Pharr matt@pharr.org https://gitcode.net/imjiangjun/pbrt-v4/-/commit/7c8b9ffd7a74efc409c453873cd27ee2a3f7c483 Fix bug in ParameterDictionary::lookupSingle() error check 2022-12-21T06:42:58-08:00 Matt Pharr matt@pharr.org https://gitcode.net/imjiangjun/pbrt-v4/-/commit/f8f260fe3126acabaa58caeffed96dc901f6e55c wavefront/intersect.h: fix variable naming consistency 2022-12-21T06:42:58-08:00 Matt Pharr matt@pharr.org i.e., match the r_u/r_l notation used in the book and in VolPathIntegrator.
...@@ -268,7 +268,7 @@ std::map<int, TriQuadMesh> OptiXAggregate::PreparePLYMeshes( ...@@ -268,7 +268,7 @@ std::map<int, TriQuadMesh> OptiXAggregate::PreparePLYMeshes(
plyMesh.ConvertToOnlyTriangles(); plyMesh.ConvertToOnlyTriangles();
Float edgeLength = Float edgeLength =
shape.parameters.GetOneFloat("displacement.edgelength", 1.f); shape.parameters.GetOneFloat("edgelength", 1.f);
edgeLength *= Options->displacementEdgeScale; edgeLength *= Options->displacementEdgeScale;
std::string displacementTexName = shape.parameters.GetTexture("displacement"); std::string displacementTexName = shape.parameters.GetTexture("displacement");
......
...@@ -217,7 +217,7 @@ typename ParameterTypeTraits<PT>::ReturnType ParameterDictionary::lookupSingle( ...@@ -217,7 +217,7 @@ typename ParameterTypeTraits<PT>::ReturnType ParameterDictionary::lookupSingle(
// Issue error if an incorrect number of parameter values were provided // Issue error if an incorrect number of parameter values were provided
if (values.empty()) if (values.empty())
ErrorExit(&p->loc, "No values provided for parameter \"%s\".", name); ErrorExit(&p->loc, "No values provided for parameter \"%s\".", name);
if (values.size() > traits::nPerItem) if (values.size() != traits::nPerItem)
ErrorExit(&p->loc, "Expected %d values for parameter \"%s\".", ErrorExit(&p->loc, "Expected %d values for parameter \"%s\".",
traits::nPerItem, name); traits::nPerItem, name);
......
...@@ -509,18 +509,18 @@ void WavefrontPathIntegrator::HandleEscapedRays() { ...@@ -509,18 +509,18 @@ void WavefrontPathIntegrator::HandleEscapedRays() {
PBRT_DBG("depth %d specularBounce %d pdf uni %f %f %f %f " PBRT_DBG("depth %d specularBounce %d pdf uni %f %f %f %f "
"pdf nee %f %f %f %f\n", "pdf nee %f %f %f %f\n",
w.depth, w.specularBounce, w.depth, w.specularBounce,
w.inv_w_u[0], w.inv_w_u[1], w.inv_w_u[2], w.inv_w_u[3], w.r_u[0], w.r_u[1], w.r_u[2], w.r_u[3],
w.inv_w_l[0], w.inv_w_l[1], w.inv_w_l[2], w.inv_w_l[3]); w.r_l[0], w.r_l[1], w.r_l[2], w.r_l[3]);
if (w.depth == 0 || w.specularBounce) { if (w.depth == 0 || w.specularBounce) {
L += w.beta * Le / w.inv_w_u.Average(); L += w.beta * Le / w.r_u.Average();
} else { } else {
// Compute MIS-weighted radiance contribution from infinite light // Compute MIS-weighted radiance contribution from infinite light
LightSampleContext ctx = w.prevIntrCtx; LightSampleContext ctx = w.prevIntrCtx;
Float lightChoicePDF = lightSampler.PMF(ctx, light); Float lightChoicePDF = lightSampler.PMF(ctx, light);
SampledSpectrum inv_w_l = SampledSpectrum r_l =
w.inv_w_l * lightChoicePDF * light.PDF_Li(ctx, w.rayd, true); w.r_l * lightChoicePDF * light.PDF_Li(ctx, w.rayd, true);
L += w.beta * Le / (w.inv_w_u + inv_w_l).Average(); L += w.beta * Le / (w.r_u + r_l).Average();
} }
} }
} }
...@@ -550,7 +550,7 @@ void WavefrontPathIntegrator::HandleEmissiveIntersection() { ...@@ -550,7 +550,7 @@ void WavefrontPathIntegrator::HandleEmissiveIntersection() {
// Compute area light's weighted radiance contribution to the path // Compute area light's weighted radiance contribution to the path
SampledSpectrum L(0.f); SampledSpectrum L(0.f);
if (w.depth == 0 || w.specularBounce) { if (w.depth == 0 || w.specularBounce) {
L = w.beta * Le / w.inv_w_u.Average(); L = w.beta * Le / w.r_u.Average();
} else { } else {
// Compute MIS-weighted radiance contribution from area light // Compute MIS-weighted radiance contribution from area light
Vector3f wi = -w.wo; Vector3f wi = -w.wo;
...@@ -558,9 +558,9 @@ void WavefrontPathIntegrator::HandleEmissiveIntersection() { ...@@ -558,9 +558,9 @@ void WavefrontPathIntegrator::HandleEmissiveIntersection() {
Float lightChoicePDF = lightSampler.PMF(ctx, w.areaLight); Float lightChoicePDF = lightSampler.PMF(ctx, w.areaLight);
Float lightPDF = lightChoicePDF * w.areaLight.PDF_Li(ctx, wi, true); Float lightPDF = lightChoicePDF * w.areaLight.PDF_Li(ctx, wi, true);
SampledSpectrum inv_w_u = w.inv_w_u; SampledSpectrum r_u = w.r_u;
SampledSpectrum inv_w_l = w.inv_w_l * lightPDF; SampledSpectrum r_l = w.r_l * lightPDF;
L = w.beta * Le / (inv_w_u + inv_w_l).Average(); L = w.beta * Le / (r_u + r_l).Average();
} }
PBRT_DBG("Added L %f %f %f %f for pixel index %d\n", L[0], L[1], L[2], L[3], PBRT_DBG("Added L %f %f %f %f for pixel index %d\n", L[0], L[1], L[2], L[3],
......
...@@ -35,12 +35,11 @@ inline PBRT_CPU_GPU void RecordShadowRayResult(const ShadowRayWorkItem w, ...@@ -35,12 +35,11 @@ inline PBRT_CPU_GPU void RecordShadowRayResult(const ShadowRayWorkItem w,
PBRT_DBG("Shadow ray was occluded\n"); PBRT_DBG("Shadow ray was occluded\n");
return; return;
} }
SampledSpectrum Ld = w.Ld / (w.inv_w_u + w.inv_w_l).Average(); SampledSpectrum Ld = w.Ld / (w.r_u + w.r_l).Average();
PBRT_DBG("Unoccluded shadow ray. Final Ld %f %f %f %f " PBRT_DBG("Unoccluded shadow ray. Final Ld %f %f %f %f "
"(sr.Ld %f %f %f %f inv_w_u %f %f %f %f inv_w_l %f %f %f %f)\n", "(sr.Ld %f %f %f %f r_u %f %f %f %f r_l %f %f %f %f)\n",
Ld[0], Ld[1], Ld[2], Ld[3], w.Ld[0], w.Ld[1], w.Ld[2], w.Ld[3], w.inv_w_u[0], Ld[0], Ld[1], Ld[2], Ld[3], w.Ld[0], w.Ld[1], w.Ld[2], w.Ld[3], w.r_u[0],
w.inv_w_u[1], w.inv_w_u[2], w.inv_w_u[3], w.inv_w_l[0], w.inv_w_l[1], w.r_u[1], w.r_u[2], w.r_u[3], w.r_l[0], w.r_l[1], w.r_l[2], w.r_l[3]);
w.inv_w_l[2], w.inv_w_l[3]);
SampledSpectrum Lpixel = pixelSampleState->L[w.pixelIndex]; SampledSpectrum Lpixel = pixelSampleState->L[w.pixelIndex];
pixelSampleState->L[w.pixelIndex] = Lpixel + Ld; pixelSampleState->L[w.pixelIndex] = Lpixel + Ld;
...@@ -62,8 +61,8 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection( ...@@ -62,8 +61,8 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
tMax, tMax,
r.lambda, r.lambda,
r.beta, r.beta,
r.inv_w_u, r.r_u,
r.inv_w_l, r.r_l,
r.pixelIndex, r.pixelIndex,
r.prevIntrCtx, r.prevIntrCtx,
r.specularBounce, r.specularBounce,
...@@ -101,8 +100,8 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection( ...@@ -101,8 +100,8 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
PBRT_DBG("Enqueuing into medium transition queue: pixel index %d \n", PBRT_DBG("Enqueuing into medium transition queue: pixel index %d \n",
r.pixelIndex); r.pixelIndex);
Ray newRay = intr.SpawnRay(r.ray.d); Ray newRay = intr.SpawnRay(r.ray.d);
nextRayQueue->PushIndirectRay(newRay, r.depth, r.prevIntrCtx, r.beta, r.inv_w_u, nextRayQueue->PushIndirectRay(newRay, r.depth, r.prevIntrCtx, r.beta, r.r_u,
r.inv_w_l, r.lambda, r.etaScale, r.specularBounce, r.r_l, r.lambda, r.etaScale, r.specularBounce,
r.anyNonSpecularBounces, r.pixelIndex); r.anyNonSpecularBounces, r.pixelIndex);
return; return;
} }
...@@ -113,7 +112,7 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection( ...@@ -113,7 +112,7 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
// TODO: intr.wo == -ray.d? // TODO: intr.wo == -ray.d?
hitAreaLightQueue->Push(HitAreaLightWorkItem{ hitAreaLightQueue->Push(HitAreaLightWorkItem{
intr.areaLight, intr.p(), intr.n, intr.uv, intr.wo, r.lambda, r.depth, r.beta, intr.areaLight, intr.p(), intr.n, intr.uv, intr.wo, r.lambda, r.depth, r.beta,
r.inv_w_u, r.inv_w_l, r.prevIntrCtx, (int)r.specularBounce, r.pixelIndex}); r.r_u, r.r_l, r.prevIntrCtx, (int)r.specularBounce, r.pixelIndex});
} }
FloatTexture displacement = material.GetDisplacement(); FloatTexture displacement = material.GetDisplacement();
...@@ -147,7 +146,7 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection( ...@@ -147,7 +146,7 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
r.anyNonSpecularBounces, r.anyNonSpecularBounces,
intr.wo, intr.wo,
r.beta, r.beta,
r.inv_w_u, r.r_u,
r.etaScale, r.etaScale,
mediumInterface}); mediumInterface});
}; };
...@@ -176,7 +175,7 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr, ...@@ -176,7 +175,7 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
RNG rng(Hash(ray.o), Hash(ray.d)); RNG rng(Hash(ray.o), Hash(ray.d));
SampledSpectrum T_ray(1.f); SampledSpectrum T_ray(1.f);
SampledSpectrum inv_w_u(1.f), inv_w_l(1.f); SampledSpectrum r_u(1.f), r_l(1.f);
while (ray.d != Vector3f(0, 0, 0)) { while (ray.d != Vector3f(0, 0, 0)) {
PBRT_DBG( PBRT_DBG(
...@@ -208,11 +207,11 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr, ...@@ -208,11 +207,11 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
// ratio-tracking: only evaluate null scattering // ratio-tracking: only evaluate null scattering
Float pr = T_maj[0] * sigma_maj[0]; Float pr = T_maj[0] * sigma_maj[0];
T_ray *= T_maj * sigma_n / pr; T_ray *= T_maj * sigma_n / pr;
inv_w_l *= T_maj * sigma_maj / pr; r_l *= T_maj * sigma_maj / pr;
inv_w_u *= T_maj * sigma_n / pr; r_u *= T_maj * sigma_n / pr;
// Possibly terminate transmittance computation using Russian roulette // Possibly terminate transmittance computation using Russian roulette
SampledSpectrum Tr = T_ray / (inv_w_l + inv_w_u).Average(); SampledSpectrum Tr = T_ray / (r_l + r_u).Average();
if (Tr.MaxComponentValue() < 0.05f) { if (Tr.MaxComponentValue() < 0.05f) {
Float q = 0.75f; Float q = 0.75f;
if (rng.Uniform<Float>() < q) if (rng.Uniform<Float>() < q)
...@@ -227,10 +226,9 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr, ...@@ -227,10 +226,9 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
sigma_n[2], sigma_n[3], sigma_maj[0], sigma_maj[1], sigma_maj[2], sigma_n[2], sigma_n[3], sigma_maj[0], sigma_maj[1], sigma_maj[2],
sigma_maj[3]); sigma_maj[3]);
PBRT_DBG( PBRT_DBG(
"T_ray %f %f %f %f inv_w_l %f %f %f %f inv_w_u %f %f %f %f\n", "T_ray %f %f %f %f r_l %f %f %f %f r_u %f %f %f %f\n",
T_ray[0], T_ray[1], T_ray[2], T_ray[3], inv_w_l[0], inv_w_l[1], T_ray[0], T_ray[1], T_ray[2], T_ray[3], r_l[0], r_l[1],
inv_w_l[2], inv_w_l[3], inv_w_u[0], inv_w_u[1], inv_w_u[2], r_l[2], r_l[3], r_u[0], r_u[1], r_u[2], r_u[3]);
inv_w_u[3]);
if (!T_ray) if (!T_ray)
return false; return false;
...@@ -238,8 +236,8 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr, ...@@ -238,8 +236,8 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
return true; return true;
}); });
T_ray *= T_maj / T_maj[0]; T_ray *= T_maj / T_maj[0];
inv_w_l *= T_maj / T_maj[0]; r_l *= T_maj / T_maj[0];
inv_w_u *= T_maj / T_maj[0]; r_u *= T_maj / T_maj[0];
} }
if (!result.hit || !T_ray) if (!result.hit || !T_ray)
...@@ -249,24 +247,23 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr, ...@@ -249,24 +247,23 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
ray = spawnTo(pLight); ray = spawnTo(pLight);
} }
PBRT_DBG("Final T_ray %.9g %.9g %.9g %.9g sr.inv_w_u %.9g %.9g %.9g %.9g inv_w_u " PBRT_DBG("Final T_ray %.9g %.9g %.9g %.9g sr.r_u %.9g %.9g %.9g %.9g "
"%.9g %.9g %.9g %.9g\n", "r_u %.9g %.9g %.9g %.9g\n",
T_ray[0], T_ray[1], T_ray[2], T_ray[3], sr.inv_w_u[0], sr.inv_w_u[1], T_ray[0], T_ray[1], T_ray[2], T_ray[3], sr.r_u[0], sr.r_u[1],
sr.inv_w_u[2], sr.inv_w_u[3], inv_w_u[0], inv_w_u[1], inv_w_u[2], sr.r_u[2], sr.r_u[3], r_u[0], r_u[1], r_u[2], r_u[3]);
inv_w_u[3]); PBRT_DBG("sr.r_l %.9g %.9g %.9g %.9g r_l %.9g %.9g %.9g %.9g\n",
PBRT_DBG("sr.inv_w_l %.9g %.9g %.9g %.9g inv_w_l %.9g %.9g %.9g %.9g\n", sr.r_l[0], sr.r_l[1], sr.r_l[2], sr.r_l[3], r_l[0],
sr.inv_w_l[0], sr.inv_w_l[1], sr.inv_w_l[2], sr.inv_w_l[3], inv_w_l[0], r_l[1], r_l[2], r_l[3]);
inv_w_l[1], inv_w_l[2], inv_w_l[3]);
PBRT_DBG("scaled throughput %.9g %.9g %.9g %.9g\n", PBRT_DBG("scaled throughput %.9g %.9g %.9g %.9g\n",
T_ray[0] / (sr.inv_w_u * inv_w_u + sr.inv_w_l * inv_w_l).Average(), T_ray[0] / (sr.r_u * r_u + sr.r_l * r_l).Average(),
T_ray[1] / (sr.inv_w_u * inv_w_u + sr.inv_w_l * inv_w_l).Average(), T_ray[1] / (sr.r_u * r_u + sr.r_l * r_l).Average(),
T_ray[2] / (sr.inv_w_u * inv_w_u + sr.inv_w_l * inv_w_l).Average(), T_ray[2] / (sr.r_u * r_u + sr.r_l * r_l).Average(),
T_ray[3] / (sr.inv_w_u * inv_w_u + sr.inv_w_l * inv_w_l).Average()); T_ray[3] / (sr.r_u * r_u + sr.r_l * r_l).Average());
if (T_ray) { if (T_ray) {
// FIXME/reconcile: this takes inv_w_l as input while // FIXME/reconcile: this takes r_l as input while
// e.g. VolPathIntegrator::SampleLd() does not... // e.g. VolPathIntegrator::SampleLd() does not...
Ld *= T_ray / (sr.inv_w_u * inv_w_u + sr.inv_w_l * inv_w_l).Average(); Ld *= T_ray / (sr.r_u * r_u + sr.r_l * r_l).Average();
PBRT_DBG("Setting final Ld for shadow ray pixel index %d = as %f %f %f %f\n", PBRT_DBG("Setting final Ld for shadow ray pixel index %d = as %f %f %f %f\n",
sr.pixelIndex, Ld[0], Ld[1], Ld[2], Ld[3]); sr.pixelIndex, Ld[0], Ld[1], Ld[2], Ld[3]);
......
...@@ -38,17 +38,17 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) { ...@@ -38,17 +38,17 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
SampledWavelengths lambda = w.lambda; SampledWavelengths lambda = w.lambda;
SampledSpectrum beta = w.beta; SampledSpectrum beta = w.beta;
SampledSpectrum inv_w_u = w.inv_w_u; SampledSpectrum r_u = w.r_u;
SampledSpectrum inv_w_l = w.inv_w_l; SampledSpectrum r_l = w.r_l;
SampledSpectrum L(0.f); SampledSpectrum L(0.f);
RNG rng(Hash(ray.o, tMax), Hash(ray.d)); RNG rng(Hash(ray.o, tMax), Hash(ray.d));
PBRT_DBG("Lambdas %f %f %f %f\n", lambda[0], lambda[1], lambda[2], lambda[3]); PBRT_DBG("Lambdas %f %f %f %f\n", lambda[0], lambda[1], lambda[2], lambda[3]);
PBRT_DBG("Medium sample beta %f %f %f %f inv_w_u %f %f %f %f inv_w_l %f %f " PBRT_DBG("Medium sample beta %f %f %f %f r_u %f %f %f %f r_l %f %f "
"%f %f\n", "%f %f\n",
beta[0], beta[1], beta[2], beta[3], inv_w_u[0], inv_w_u[1], beta[0], beta[1], beta[2], beta[3], r_u[0], r_u[1],
inv_w_u[2], inv_w_u[3], inv_w_l[0], inv_w_l[1], inv_w_l[2], r_u[2], r_u[3], r_l[0], r_l[1], r_l[2],
inv_w_l[3]); r_l[3]);
// Sample the medium according to T_maj, the homogeneous // Sample the medium according to T_maj, the homogeneous
// transmission function based on the majorant. // transmission function based on the majorant.
...@@ -74,12 +74,12 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) { ...@@ -74,12 +74,12 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
// (without scaling) at absorption events. // (without scaling) at absorption events.
if (w.depth < maxDepth && mp.Le) { if (w.depth < maxDepth && mp.Le) {
Float pr = sigma_maj[0] * T_maj[0]; Float pr = sigma_maj[0] * T_maj[0];
SampledSpectrum inv_w_e = inv_w_u * sigma_maj * T_maj / pr; SampledSpectrum r_e = r_u * sigma_maj * T_maj / pr;
// Update _L_ for medium emission // Update _L_ for medium emission
if (inv_w_e) if (r_e)
L += beta * mp.sigma_a * T_maj * mp.Le / L += beta * mp.sigma_a * T_maj * mp.Le /
(pr * inv_w_e.Average()); (pr * r_e.Average());
} }
// Compute probabilities for each type of scattering. // Compute probabilities for each type of scattering.
...@@ -103,18 +103,18 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) { ...@@ -103,18 +103,18 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
PBRT_DBG("scattered\n"); PBRT_DBG("scattered\n");
Float pr = T_maj[0] * mp.sigma_s[0]; Float pr = T_maj[0] * mp.sigma_s[0];
beta *= T_maj * mp.sigma_s / pr; beta *= T_maj * mp.sigma_s / pr;
inv_w_u *= T_maj * mp.sigma_s / pr; r_u *= T_maj * mp.sigma_s / pr;
// Enqueue medium scattering work. // Enqueue medium scattering work.
auto enqueue = [=](auto ptr) { auto enqueue = [=](auto ptr) {
using PhaseFunction = typename std::remove_const_t< using PhaseFunction = typename std::remove_const_t<
std::remove_reference_t<decltype(*ptr)>>; std::remove_reference_t<decltype(*ptr)>>;
mediumScatterQueue->Push(MediumScatterWorkItem<PhaseFunction>{ mediumScatterQueue->Push(MediumScatterWorkItem<PhaseFunction>{
p, w.depth, lambda, beta, inv_w_u, ptr, -ray.d, ray.time, p, w.depth, lambda, beta, r_u, ptr, -ray.d, ray.time,
w.etaScale, ray.medium, w.pixelIndex}); w.etaScale, ray.medium, w.pixelIndex});
}; };
DCHECK_RARE(1e-6f, !beta); DCHECK_RARE(1e-6f, !beta);
if (beta && inv_w_u) if (beta && r_u)
mp.phase.Dispatch(enqueue); mp.phase.Dispatch(enqueue);
scattered = true; scattered = true;
...@@ -130,25 +130,25 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) { ...@@ -130,25 +130,25 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
beta *= T_maj * sigma_n / pr; beta *= T_maj * sigma_n / pr;
if (pr == 0) if (pr == 0)
beta = SampledSpectrum(0.f); beta = SampledSpectrum(0.f);
inv_w_u *= T_maj * sigma_n / pr; r_u *= T_maj * sigma_n / pr;
inv_w_l *= T_maj * sigma_maj / pr; r_l *= T_maj * sigma_maj / pr;
uMode = rng.Uniform<Float>(); uMode = rng.Uniform<Float>();
return beta && inv_w_u; return beta && r_u;
} }
}); });
if (!scattered && beta) { if (!scattered && beta) {
beta *= T_maj / T_maj[0]; beta *= T_maj / T_maj[0];
inv_w_u *= T_maj / T_maj[0]; r_u *= T_maj / T_maj[0];
inv_w_l *= T_maj / T_maj[0]; r_l *= T_maj / T_maj[0];
} }
PBRT_DBG("Post ray medium sample L %f %f %f %f beta %f %f %f %f\n", L[0], PBRT_DBG("Post ray medium sample L %f %f %f %f beta %f %f %f %f\n", L[0],
L[1], L[2], L[3], beta[0], beta[1], beta[2], beta[3]); L[1], L[2], L[3], beta[0], beta[1], beta[2], beta[3]);
PBRT_DBG("Post ray medium sample inv_w_u %f %f %f %f inv_w_l %f %f %f %f\n", PBRT_DBG("Post ray medium sample r_u %f %f %f %f r_l %f %f %f %f\n",
inv_w_u[0], inv_w_u[1], inv_w_u[2], inv_w_u[3], inv_w_l[0], r_u[0], r_u[1], r_u[2], r_u[3], r_l[0],
inv_w_l[1], inv_w_l[2], inv_w_l[3]); r_l[1], r_l[2], r_l[3]);
// Add any emission found to its pixel sample's L value. // Add any emission found to its pixel sample's L value.
if (L) { if (L) {
...@@ -160,7 +160,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) { ...@@ -160,7 +160,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
// There's no more work to do if there was a scattering event in // There's no more work to do if there was a scattering event in
// the medium. // the medium.
if (scattered || !beta || !inv_w_u || w.depth == maxDepth) if (scattered || !beta || !r_u || w.depth == maxDepth)
return; return;
// Otherwise, enqueue bump and medium stuff... // Otherwise, enqueue bump and medium stuff...
...@@ -172,7 +172,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) { ...@@ -172,7 +172,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
w.pixelIndex, w.depth); w.pixelIndex, w.depth);
escapedRayQueue->Push(EscapedRayWorkItem{ escapedRayQueue->Push(EscapedRayWorkItem{
ray.o, ray.d, w.depth, lambda, w.pixelIndex, beta, ray.o, ray.d, w.depth, lambda, w.pixelIndex, beta,
(int)w.specularBounce, inv_w_u, inv_w_l, w.prevIntrCtx}); (int)w.specularBounce, r_u, r_l, w.prevIntrCtx});
} }
return; return;
} }
...@@ -194,7 +194,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) { ...@@ -194,7 +194,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
intr.mediumInterface = &w.mediumInterface; intr.mediumInterface = &w.mediumInterface;
Ray newRay = intr.SpawnRay(ray.d); Ray newRay = intr.SpawnRay(ray.d);
nextRayQueue->PushIndirectRay( nextRayQueue->PushIndirectRay(
newRay, w.depth, w.prevIntrCtx, beta, inv_w_u, inv_w_l, lambda, newRay, w.depth, w.prevIntrCtx, beta, r_u, r_l, lambda,
w.etaScale, w.specularBounce, w.anyNonSpecularBounces, w.pixelIndex); w.etaScale, w.specularBounce, w.anyNonSpecularBounces, w.pixelIndex);
return; return;
} }
...@@ -206,7 +206,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) { ...@@ -206,7 +206,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
w.pixelIndex, w.depth); w.pixelIndex, w.depth);
hitAreaLightQueue->Push(HitAreaLightWorkItem{ hitAreaLightQueue->Push(HitAreaLightWorkItem{
w.areaLight, Point3f(w.pi), w.n, w.uv, -ray.d, lambda, w.depth, beta, w.areaLight, Point3f(w.pi), w.n, w.uv, -ray.d, lambda, w.depth, beta,
inv_w_u, inv_w_l, w.prevIntrCtx, w.specularBounce, w.pixelIndex}); r_u, r_l, w.prevIntrCtx, w.specularBounce, w.pixelIndex});
} }
FloatTexture displacement = material.GetDisplacement(); FloatTexture displacement = material.GetDisplacement();
...@@ -242,7 +242,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) { ...@@ -242,7 +242,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
w.anyNonSpecularBounces, w.anyNonSpecularBounces,
-ray.d, -ray.d,
beta, beta,
inv_w_u, r_u,
w.etaScale, w.etaScale,
w.mediumInterface}); w.mediumInterface});
}; };
...@@ -293,23 +293,23 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) { ...@@ -293,23 +293,23 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) {
Float lightPDF = ls->pdf * sampledLight->p; Float lightPDF = ls->pdf * sampledLight->p;
Float phasePDF = Float phasePDF =
IsDeltaLight(light.Type()) ? 0.f : w.phase->PDF(wo, wi); IsDeltaLight(light.Type()) ? 0.f : w.phase->PDF(wo, wi);
SampledSpectrum inv_w_u = w.inv_w_u * phasePDF; SampledSpectrum r_u = w.r_u * phasePDF;
SampledSpectrum inv_w_l = w.inv_w_u * lightPDF; SampledSpectrum r_l = w.r_u * lightPDF;
SampledSpectrum Ld = beta * ls->L; SampledSpectrum Ld = beta * ls->L;
Ray ray(w.p, ls->pLight.p() - w.p, w.time, w.medium); Ray ray(w.p, ls->pLight.p() - w.p, w.time, w.medium);
// Enqueue shadow ray // Enqueue shadow ray
shadowRayQueue->Push(ShadowRayWorkItem{ray, 1 - ShadowEpsilon, shadowRayQueue->Push(ShadowRayWorkItem{ray, 1 - ShadowEpsilon,
w.lambda, Ld, inv_w_u, inv_w_l, w.lambda, Ld, r_u, r_l,
w.pixelIndex}); w.pixelIndex});
PBRT_DBG("Enqueued medium shadow ray depth %d " PBRT_DBG("Enqueued medium shadow ray depth %d "
"Ld %f %f %f %f inv_w_u %f %f %f %f " "Ld %f %f %f %f r_u %f %f %f %f "
"inv_w_l %f %f %f %f pixel index %d\n", "r_l %f %f %f %f pixel index %d\n",
w.depth, Ld[0], Ld[1], Ld[2], Ld[3], inv_w_u[0], inv_w_u[1], w.depth, Ld[0], Ld[1], Ld[2], Ld[3], r_u[0], r_u[1],
inv_w_u[2], inv_w_u[3], inv_w_l[0], inv_w_l[1], inv_w_l[2], r_u[2], r_u[3], r_l[0], r_l[1], r_l[2],
inv_w_l[3], w.pixelIndex); r_l[3], w.pixelIndex);
} }
} }
...@@ -320,14 +320,14 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) { ...@@ -320,14 +320,14 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) {
return; return;
SampledSpectrum beta = w.beta * phaseSample->p / phaseSample->pdf; SampledSpectrum beta = w.beta * phaseSample->p / phaseSample->pdf;
SampledSpectrum inv_w_u = w.inv_w_u; SampledSpectrum r_u = w.r_u;
SampledSpectrum inv_w_l = w.inv_w_u / phaseSample->pdf; SampledSpectrum r_l = w.r_u / phaseSample->pdf;
// Russian roulette // Russian roulette
// TODO: should we even bother? Generally beta is one here, // TODO: should we even bother? Generally beta is one here,
// due to the way scattering events are scattered and because we're // due to the way scattering events are scattered and because we're
// sampling exactly from the phase function's distribution... // sampling exactly from the phase function's distribution...
SampledSpectrum rrBeta = beta * w.etaScale / inv_w_u.Average(); SampledSpectrum rrBeta = beta * w.etaScale / r_u.Average();
if (rrBeta.MaxComponentValue() < 1 && w.depth >= 1) { if (rrBeta.MaxComponentValue() < 1 && w.depth >= 1) {
Float q = std::max<Float>(0, 1 - rrBeta.MaxComponentValue()); Float q = std::max<Float>(0, 1 - rrBeta.MaxComponentValue());
if (raySamples.indirect.rr < q) { if (raySamples.indirect.rr < q) {
...@@ -343,7 +343,7 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) { ...@@ -343,7 +343,7 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) {
bool anyNonSpecularBounces = true; bool anyNonSpecularBounces = true;
// Spawn indirect ray. // Spawn indirect ray.
nextRayQueue->PushIndirectRay(ray, w.depth + 1, ctx, beta, inv_w_u, inv_w_l, nextRayQueue->PushIndirectRay(ray, w.depth + 1, ctx, beta, r_u, r_l,
w.lambda, w.etaScale, specularBounce, w.lambda, w.etaScale, specularBounce,
anyNonSpecularBounces, w.pixelIndex); anyNonSpecularBounces, w.pixelIndex);
PBRT_DBG("Enqueuing indirect medium ray at depth %d pixel index %d\n", PBRT_DBG("Enqueuing indirect medium ray at depth %d pixel index %d\n",
......
...@@ -37,7 +37,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) { ...@@ -37,7 +37,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
pstd::optional<BSSRDFProbeSegment> probeSeg = bssrdf.SampleSp(uc, u); pstd::optional<BSSRDFProbeSegment> probeSeg = bssrdf.SampleSp(uc, u);
if (probeSeg) if (probeSeg)
subsurfaceScatterQueue->Push(probeSeg->p0, probeSeg->p1, w.depth, subsurfaceScatterQueue->Push(probeSeg->p0, probeSeg->p1, w.depth,
material, bssrdf, lambda, w.beta, w.inv_w_u, material, bssrdf, lambda, w.beta, w.r_u,
w.mediumInterface, w.etaScale, w.pixelIndex); w.mediumInterface, w.etaScale, w.pixelIndex);
}); });
...@@ -62,7 +62,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) { ...@@ -62,7 +62,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
Float pr = w.reservoirPDF * bssrdfSample.pdf[0]; Float pr = w.reservoirPDF * bssrdfSample.pdf[0];
SampledSpectrum betap = w.beta * bssrdfSample.Sp / pr; SampledSpectrum betap = w.beta * bssrdfSample.Sp / pr;
SampledSpectrum inv_w_u = w.inv_w_u * bssrdfSample.pdf / bssrdfSample.pdf[0]; SampledSpectrum r_u = w.r_u * bssrdfSample.pdf / bssrdfSample.pdf[0];
SampledWavelengths lambda = w.lambda; SampledWavelengths lambda = w.lambda;
RaySamples raySamples = pixelSampleState.samples[w.pixelIndex]; RaySamples raySamples = pixelSampleState.samples[w.pixelIndex];
Vector3f wo = bssrdfSample.wo; Vector3f wo = bssrdfSample.wo;
...@@ -83,25 +83,25 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) { ...@@ -83,25 +83,25 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
Vector3f wi = bsdfSample->wi; Vector3f wi = bsdfSample->wi;
SampledSpectrum beta = SampledSpectrum beta =
betap * bsdfSample->f * AbsDot(wi, intr.ns) / bsdfSample->pdf; betap * bsdfSample->f * AbsDot(wi, intr.ns) / bsdfSample->pdf;
SampledSpectrum indir_inv_w_u = inv_w_u; SampledSpectrum indir_r_u = r_u;
PBRT_DBG("%s f*cos[0] %f bsdfSample->pdf %f f*cos/pdf %f\n", PBRT_DBG("%s f*cos[0] %f bsdfSample->pdf %f f*cos/pdf %f\n",
ConcreteBxDF::Name(), bsdfSample->f[0] * AbsDot(wi, intr.ns), ConcreteBxDF::Name(), bsdfSample->f[0] * AbsDot(wi, intr.ns),
bsdfSample->pdf, bsdfSample->pdf,
bsdfSample->f[0] * AbsDot(wi, intr.ns) / bsdfSample->pdf); bsdfSample->f[0] * AbsDot(wi, intr.ns) / bsdfSample->pdf);
SampledSpectrum inv_w_l; SampledSpectrum r_l;
if (bsdfSample->pdfIsProportional) if (bsdfSample->pdfIsProportional)
inv_w_l = inv_w_u / bsdf.PDF<ConcreteBxDF>(wo, bsdfSample->wi); r_l = r_u / bsdf.PDF<ConcreteBxDF>(wo, bsdfSample->wi);
else else
inv_w_l = inv_w_u / bsdfSample->pdf; r_l = r_u / bsdfSample->pdf;
Float etaScale = w.etaScale; Float etaScale = w.etaScale;
if (bsdfSample->IsTransmission()) if (bsdfSample->IsTransmission())
etaScale *= Sqr(bsdfSample->eta); etaScale *= Sqr(bsdfSample->eta);
// Russian roulette // Russian roulette
SampledSpectrum rrBeta = beta * etaScale / indir_inv_w_u.Average(); SampledSpectrum rrBeta = beta * etaScale / indir_r_u.Average();
if (rrBeta.MaxComponentValue() < 1 && w.depth > 1) { if (rrBeta.MaxComponentValue() < 1 && w.depth > 1) {
Float q = std::max<Float>(0, 1 - rrBeta.MaxComponentValue()); Float q = std::max<Float>(0, 1 - rrBeta.MaxComponentValue());
if (raySamples.indirect.rr < q) { if (raySamples.indirect.rr < q) {
...@@ -125,23 +125,23 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) { ...@@ -125,23 +125,23 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
LightSampleContext ctx(intr.pi, intr.n, intr.ns); LightSampleContext ctx(intr.pi, intr.n, intr.ns);
nextRayQueue->PushIndirectRay( nextRayQueue->PushIndirectRay(
ray, w.depth + 1, ctx, beta, indir_inv_w_u, inv_w_l, lambda, ray, w.depth + 1, ctx, beta, indir_r_u, r_l, lambda,
etaScale, bsdfSample->IsSpecular(), anyNonSpecularBounces, etaScale, bsdfSample->IsSpecular(), anyNonSpecularBounces,
w.pixelIndex); w.pixelIndex);
PBRT_DBG("Spawned indirect ray at depth %d. " PBRT_DBG("Spawned indirect ray at depth %d. "
"Specular %d beta %f %f %f %f indir_inv_w_u %f %f %f %f " "Specular %d beta %f %f %f %f indir_r_u %f %f %f %f "
"inv_w_l %f " "r_l %f "
"%f %f %f " "%f %f %f "
"beta/indir_inv_w_u %f %f %f %f\n", "beta/indir_r_u %f %f %f %f\n",
w.depth + 1, int(bsdfSample->IsSpecular()), beta[0], w.depth + 1, int(bsdfSample->IsSpecular()), beta[0],
beta[1], beta[2], beta[3], indir_inv_w_u[0], beta[1], beta[2], beta[3], indir_r_u[0],
indir_inv_w_u[1], indir_inv_w_u[2], indir_inv_w_u[3], indir_r_u[1], indir_r_u[2], indir_r_u[3],
inv_w_l[0], inv_w_l[1], inv_w_l[2], inv_w_l[3], r_l[0], r_l[1], r_l[2], r_l[3],
SafeDiv(beta, indir_inv_w_u)[0], SafeDiv(beta, indir_r_u)[0],
SafeDiv(beta, indir_inv_w_u)[1], SafeDiv(beta, indir_r_u)[1],
SafeDiv(beta, indir_inv_w_u)[2], SafeDiv(beta, indir_r_u)[2],
SafeDiv(beta, indir_inv_w_u)[3]); SafeDiv(beta, indir_r_u)[3]);
} }
} }
} }
...@@ -174,22 +174,22 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) { ...@@ -174,22 +174,22 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
ls->L[0], ls->L[1], ls->L[2], ls->L[3], ls->pdf); ls->L[0], ls->L[1], ls->L[2], ls->L[3], ls->pdf);
Float lightPDF = ls->pdf * sampledLight->p; Float lightPDF = ls->pdf * sampledLight->p;
// This causes inv_w_u to be zero for the shadow ray, so that // This causes r_u to be zero for the shadow ray, so that
// part of MIS just becomes a no-op. // part of MIS just becomes a no-op.
Float bsdfPDF = Float bsdfPDF =
IsDeltaLight(light.Type()) ? 0.f : bsdf.PDF<ConcreteBxDF>(wo, wi); IsDeltaLight(light.Type()) ? 0.f : bsdf.PDF<ConcreteBxDF>(wo, wi);
SampledSpectrum inv_w_l = inv_w_u * lightPDF; SampledSpectrum r_l = r_u * lightPDF;
inv_w_u *= bsdfPDF; r_u *= bsdfPDF;
SampledSpectrum Ld = beta * ls->L; SampledSpectrum Ld = beta * ls->L;
PBRT_DBG("depth %d Ld %f %f %f %f " PBRT_DBG("depth %d Ld %f %f %f %f "
"new beta %f %f %f %f beta/uni %f %f %f %f Ld/uni %f %f %f %f\n", "new beta %f %f %f %f beta/uni %f %f %f %f Ld/uni %f %f %f %f\n",
w.depth, Ld[0], Ld[1], Ld[2], Ld[3], beta[0], beta[1], beta[2], w.depth, Ld[0], Ld[1], Ld[2], Ld[3], beta[0], beta[1], beta[2],
beta[3], SafeDiv(beta, inv_w_u)[0], SafeDiv(beta, inv_w_u)[1], beta[3], SafeDiv(beta, r_u)[0], SafeDiv(beta, r_u)[1],
SafeDiv(beta, inv_w_u)[2], SafeDiv(beta, inv_w_u)[3], SafeDiv(beta, r_u)[2], SafeDiv(beta, r_u)[3],
SafeDiv(Ld, inv_w_u)[0], SafeDiv(Ld, inv_w_u)[1], SafeDiv(Ld, r_u)[0], SafeDiv(Ld, r_u)[1],
SafeDiv(Ld, inv_w_u)[2], SafeDiv(Ld, inv_w_u)[3]); SafeDiv(Ld, r_u)[2], SafeDiv(Ld, r_u)[3]);
Ray ray = SpawnRayTo(intr.pi, intr.n, time, ls->pLight.pi, ls->pLight.n); Ray ray = SpawnRayTo(intr.pi, intr.n, time, ls->pLight.pi, ls->pLight.n);
if (haveMedia) if (haveMedia)
...@@ -198,7 +198,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) { ...@@ -198,7 +198,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
: w.mediumInterface.inside; : w.mediumInterface.inside;
shadowRayQueue->Push(ShadowRayWorkItem{ray, 1 - ShadowEpsilon, lambda, Ld, shadowRayQueue->Push(ShadowRayWorkItem{ray, 1 - ShadowEpsilon, lambda, Ld,
inv_w_u, inv_w_l, w.pixelIndex}); r_u, r_l, w.pixelIndex});
} }
}); });
......
...@@ -189,18 +189,18 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue ...@@ -189,18 +189,18 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
Vector3f wi = bsdfSample->wi; Vector3f wi = bsdfSample->wi;
SampledSpectrum beta = SampledSpectrum beta =
w.beta * bsdfSample->f * AbsDot(wi, ns) / bsdfSample->pdf; w.beta * bsdfSample->f * AbsDot(wi, ns) / bsdfSample->pdf;
SampledSpectrum inv_w_u = w.inv_w_u, inv_w_l; SampledSpectrum r_u = w.r_u, r_l;
PBRT_DBG("%s f*cos[0] %f bsdfSample->pdf %f f*cos/pdf %f\n", PBRT_DBG("%s f*cos[0] %f bsdfSample->pdf %f f*cos/pdf %f\n",
ConcreteBxDF::Name(), bsdfSample->f[0] * AbsDot(wi, ns), ConcreteBxDF::Name(), bsdfSample->f[0] * AbsDot(wi, ns),
bsdfSample->pdf, bsdfSample->pdf,
bsdfSample->f[0] * AbsDot(wi, ns) / bsdfSample->pdf); bsdfSample->f[0] * AbsDot(wi, ns) / bsdfSample->pdf);
// Update _inv_w_u_ based on BSDF sample PDF // Update _r_u_ based on BSDF sample PDF
if (bsdfSample->pdfIsProportional) if (bsdfSample->pdfIsProportional)
inv_w_l = inv_w_u / bsdf.PDF<ConcreteBxDF>(wo, bsdfSample->wi); r_l = r_u / bsdf.PDF<ConcreteBxDF>(wo, bsdfSample->wi);
else else
inv_w_l = inv_w_u / bsdfSample->pdf; r_l = r_u / bsdfSample->pdf;
// Update _etaScale_ accounting for BSDF scattering // Update _etaScale_ accounting for BSDF scattering
Float etaScale = w.etaScale; Float etaScale = w.etaScale;
...@@ -209,7 +209,7 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue ...@@ -209,7 +209,7 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
// Apply Russian roulette to indirect ray based on weighted path // Apply Russian roulette to indirect ray based on weighted path
// throughput // throughput
SampledSpectrum rrBeta = beta * etaScale / inv_w_u.Average(); SampledSpectrum rrBeta = beta * etaScale / r_u.Average();
// Note: depth >= 1 here to match VolPathIntegrator (which increments // Note: depth >= 1 here to match VolPathIntegrator (which increments
// depth earlier). // depth earlier).
if (rrBeta.MaxComponentValue() < 1 && w.depth >= 1) { if (rrBeta.MaxComponentValue() < 1 && w.depth >= 1) {
...@@ -225,7 +225,7 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue ...@@ -225,7 +225,7 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
// Initialize spawned ray and enqueue for next ray depth // Initialize spawned ray and enqueue for next ray depth
if (bsdfSample->IsTransmission() && if (bsdfSample->IsTransmission() &&
w.material->HasSubsurfaceScattering()) { w.material->HasSubsurfaceScattering()) {
bssrdfEvalQueue->Push(w.material, lambda, beta, inv_w_u, bssrdfEvalQueue->Push(w.material, lambda, beta, r_u,
Point3f(w.pi), wo, w.n, ns, dpdus, w.uv, Point3f(w.pi), wo, w.n, ns, dpdus, w.uv,
w.depth, w.mediumInterface, etaScale, w.depth, w.mediumInterface, etaScale,
w.pixelIndex); w.pixelIndex);
...@@ -241,20 +241,20 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue ...@@ -241,20 +241,20 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
// NOTE: slightly different than context below. Problem? // NOTE: slightly different than context below. Problem?
LightSampleContext ctx(w.pi, w.n, ns); LightSampleContext ctx(w.pi, w.n, ns);
nextRayQueue->PushIndirectRay( nextRayQueue->PushIndirectRay(
ray, w.depth + 1, ctx, beta, inv_w_u, inv_w_l, lambda, ray, w.depth + 1, ctx, beta, r_u, r_l, lambda,
etaScale, bsdfSample->IsSpecular(), anyNonSpecularBounces, etaScale, bsdfSample->IsSpecular(), anyNonSpecularBounces,
w.pixelIndex); w.pixelIndex);
PBRT_DBG( PBRT_DBG(
"Spawned indirect ray at depth %d from w.index %d. " "Spawned indirect ray at depth %d from w.index %d. "
"Specular %d beta %f %f %f %f inv_w_u %f %f %f %f inv_w_l %f " "Specular %d beta %f %f %f %f r_u %f %f %f %f r_l %f "
"%f %f %f beta/inv_w_u %f %f %f %f\n", "%f %f %f beta/r_u %f %f %f %f\n",
w.depth + 1, w.pixelIndex, int(bsdfSample->IsSpecular()), w.depth + 1, w.pixelIndex, int(bsdfSample->IsSpecular()),
beta[0], beta[1], beta[2], beta[3], inv_w_u[0], inv_w_u[1], beta[0], beta[1], beta[2], beta[3], r_u[0], r_u[1],
inv_w_u[2], inv_w_u[3], inv_w_l[0], inv_w_l[1], inv_w_l[2], r_u[2], r_u[3], r_l[0], r_l[1], r_l[2],
inv_w_l[3], SafeDiv(beta, inv_w_u)[0], r_l[3], SafeDiv(beta, r_u)[0],
SafeDiv(beta, inv_w_u)[1], SafeDiv(beta, inv_w_u)[2], SafeDiv(beta, r_u)[1], SafeDiv(beta, r_u)[2],
SafeDiv(beta, inv_w_u)[3]); SafeDiv(beta, r_u)[3]);
} }
} }
} }
...@@ -297,12 +297,12 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue ...@@ -297,12 +297,12 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
f[2], f[3], ls->L[0], ls->L[1], ls->L[2], ls->L[3], ls->pdf); f[2], f[3], ls->L[0], ls->L[1], ls->L[2], ls->L[3], ls->pdf);
Float lightPDF = ls->pdf * sampledLight->p; Float lightPDF = ls->pdf * sampledLight->p;
// This causes inv_w_u to be zero for the shadow ray, so that // This causes r_u to be zero for the shadow ray, so that
// part of MIS just becomes a no-op. // part of MIS just becomes a no-op.
Float bsdfPDF = Float bsdfPDF =
IsDeltaLight(light.Type()) ? 0.f : bsdf.PDF<ConcreteBxDF>(wo, wi); IsDeltaLight(light.Type()) ? 0.f : bsdf.PDF<ConcreteBxDF>(wo, wi);
SampledSpectrum inv_w_u = w.inv_w_u * bsdfPDF; SampledSpectrum r_u = w.r_u * bsdfPDF;
SampledSpectrum inv_w_l = w.inv_w_u * lightPDF; SampledSpectrum r_l = w.r_u * lightPDF;
// Enqueue shadow ray with tentative radiance contribution // Enqueue shadow ray with tentative radiance contribution
SampledSpectrum Ld = beta * ls->L; SampledSpectrum Ld = beta * ls->L;
...@@ -313,16 +313,16 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue ...@@ -313,16 +313,16 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
: w.mediumInterface.inside; : w.mediumInterface.inside;
shadowRayQueue->Push(ShadowRayWorkItem{ray, 1 - ShadowEpsilon, lambda, Ld, shadowRayQueue->Push(ShadowRayWorkItem{ray, 1 - ShadowEpsilon, lambda, Ld,
inv_w_u, inv_w_l, w.pixelIndex}); r_u, r_l, w.pixelIndex});
PBRT_DBG("w.index %d spawned shadow ray depth %d Ld %f %f %f %f " PBRT_DBG("w.index %d spawned shadow ray depth %d Ld %f %f %f %f "
"new beta %f %f %f %f beta/uni %f %f %f %f Ld/uni %f %f %f %f\n", "new beta %f %f %f %f beta/uni %f %f %f %f Ld/uni %f %f %f %f\n",
w.pixelIndex, w.depth, Ld[0], Ld[1], Ld[2], Ld[3], beta[0], w.pixelIndex, w.depth, Ld[0], Ld[1], Ld[2], Ld[3], beta[0],
beta[1], beta[2], beta[3], SafeDiv(beta, inv_w_u)[0], beta[1], beta[2], beta[3], SafeDiv(beta, r_u)[0],
SafeDiv(beta, inv_w_u)[1], SafeDiv(beta, inv_w_u)[2], SafeDiv(beta, r_u)[1], SafeDiv(beta, r_u)[2],
SafeDiv(beta, inv_w_u)[3], SafeDiv(Ld, inv_w_u)[0], SafeDiv(beta, r_u)[3], SafeDiv(Ld, r_u)[0],
SafeDiv(Ld, inv_w_u)[1], SafeDiv(Ld, inv_w_u)[2], SafeDiv(Ld, r_u)[1], SafeDiv(Ld, r_u)[2],
SafeDiv(Ld, inv_w_u)[3]); SafeDiv(Ld, r_u)[3]);
} }
}); });
} }
......
...@@ -122,7 +122,7 @@ struct RayWorkItem { ...@@ -122,7 +122,7 @@ struct RayWorkItem {
int depth; int depth;
SampledWavelengths lambda; SampledWavelengths lambda;
int pixelIndex; int pixelIndex;
SampledSpectrum beta, inv_w_u, inv_w_l; SampledSpectrum beta, r_u, r_l;
LightSampleContext prevIntrCtx; LightSampleContext prevIntrCtx;
Float etaScale; Float etaScale;
int specularBounce; int specularBounce;
...@@ -139,7 +139,7 @@ struct EscapedRayWorkItem { ...@@ -139,7 +139,7 @@ struct EscapedRayWorkItem {
int pixelIndex; int pixelIndex;
SampledSpectrum beta; SampledSpectrum beta;
int specularBounce; int specularBounce;
SampledSpectrum inv_w_u, inv_w_l; SampledSpectrum r_u, r_l;
LightSampleContext prevIntrCtx; LightSampleContext prevIntrCtx;
}; };
...@@ -153,7 +153,7 @@ struct HitAreaLightWorkItem { ...@@ -153,7 +153,7 @@ struct HitAreaLightWorkItem {
Vector3f wo; Vector3f wo;
SampledWavelengths lambda; SampledWavelengths lambda;
int depth; int depth;
SampledSpectrum beta, inv_w_u, inv_w_l; SampledSpectrum beta, r_u, r_l;
LightSampleContext prevIntrCtx; LightSampleContext prevIntrCtx;
int specularBounce; int specularBounce;
int pixelIndex; int pixelIndex;
...@@ -167,7 +167,7 @@ struct ShadowRayWorkItem { ...@@ -167,7 +167,7 @@ struct ShadowRayWorkItem {
Ray ray; Ray ray;
Float tMax; Float tMax;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum Ld, inv_w_u, inv_w_l; SampledSpectrum Ld, r_u, r_l;
int pixelIndex; int pixelIndex;
}; };
...@@ -187,7 +187,7 @@ struct GetBSSRDFAndProbeRayWorkItem { ...@@ -187,7 +187,7 @@ struct GetBSSRDFAndProbeRayWorkItem {
Material material; Material material;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u; SampledSpectrum beta, r_u;
Point3f p; Point3f p;
Vector3f wo; Vector3f wo;
Normal3f n, ns; Normal3f n, ns;
...@@ -206,7 +206,7 @@ struct SubsurfaceScatterWorkItem { ...@@ -206,7 +206,7 @@ struct SubsurfaceScatterWorkItem {
Material material; Material material;
TabulatedBSSRDF bssrdf; TabulatedBSSRDF bssrdf;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u; SampledSpectrum beta, r_u;
Float reservoirPDF; Float reservoirPDF;
Float uLight; Float uLight;
SubsurfaceInteraction ssi; SubsurfaceInteraction ssi;
...@@ -223,8 +223,8 @@ struct MediumSampleWorkItem { ...@@ -223,8 +223,8 @@ struct MediumSampleWorkItem {
Float tMax; Float tMax;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta; SampledSpectrum beta;
SampledSpectrum inv_w_u; SampledSpectrum r_u;
SampledSpectrum inv_w_l; SampledSpectrum r_l;
int pixelIndex; int pixelIndex;
LightSampleContext prevIntrCtx; LightSampleContext prevIntrCtx;
int specularBounce; int specularBounce;
...@@ -252,7 +252,7 @@ struct MediumScatterWorkItem { ...@@ -252,7 +252,7 @@ struct MediumScatterWorkItem {
Point3f p; Point3f p;
int depth; int depth;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u; SampledSpectrum beta, r_u;
const PhaseFunction *phase; const PhaseFunction *phase;
Vector3f wo; Vector3f wo;
Float time; Float time;
...@@ -319,7 +319,7 @@ struct MaterialEvalWorkItem { ...@@ -319,7 +319,7 @@ struct MaterialEvalWorkItem {
int pixelIndex; int pixelIndex;
int anyNonSpecularBounces; int anyNonSpecularBounces;
Vector3f wo; Vector3f wo;
SampledSpectrum beta, inv_w_u; SampledSpectrum beta, r_u;
Float etaScale; Float etaScale;
MediumInterface mediumInterface; MediumInterface mediumInterface;
}; };
...@@ -336,8 +336,8 @@ class RayQueue : public WorkQueue<RayWorkItem> { ...@@ -336,8 +336,8 @@ class RayQueue : public WorkQueue<RayWorkItem> {
PBRT_CPU_GPU PBRT_CPU_GPU
int PushIndirectRay(const Ray &ray, int depth, const LightSampleContext &prevIntrCtx, int PushIndirectRay(const Ray &ray, int depth, const LightSampleContext &prevIntrCtx,
const SampledSpectrum &beta, const SampledSpectrum &inv_w_u, const SampledSpectrum &beta, const SampledSpectrum &r_u,
const SampledSpectrum &inv_w_l, const SampledWavelengths &lambda, const SampledSpectrum &r_l, const SampledWavelengths &lambda,
Float etaScale, bool specularBounce, bool anyNonSpecularBounces, Float etaScale, bool specularBounce, bool anyNonSpecularBounces,
int pixelIndex); int pixelIndex);
}; };
...@@ -354,8 +354,8 @@ inline int RayQueue::PushCameraRay(const Ray &ray, const SampledWavelengths &lam ...@@ -354,8 +354,8 @@ inline int RayQueue::PushCameraRay(const Ray &ray, const SampledWavelengths &lam
this->beta[index] = SampledSpectrum(1.f); this->beta[index] = SampledSpectrum(1.f);
this->etaScale[index] = 1.f; this->etaScale[index] = 1.f;
this->anyNonSpecularBounces[index] = false; this->anyNonSpecularBounces[index] = false;
this->inv_w_u[index] = SampledSpectrum(1.f); this->r_u[index] = SampledSpectrum(1.f);
this->inv_w_l[index] = SampledSpectrum(1.f); this->r_l[index] = SampledSpectrum(1.f);
this->specularBounce[index] = false; this->specularBounce[index] = false;
return index; return index;
} }
...@@ -363,8 +363,8 @@ inline int RayQueue::PushCameraRay(const Ray &ray, const SampledWavelengths &lam ...@@ -363,8 +363,8 @@ inline int RayQueue::PushCameraRay(const Ray &ray, const SampledWavelengths &lam
PBRT_CPU_GPU PBRT_CPU_GPU
inline int RayQueue::PushIndirectRay( inline int RayQueue::PushIndirectRay(
const Ray &ray, int depth, const LightSampleContext &prevIntrCtx, const Ray &ray, int depth, const LightSampleContext &prevIntrCtx,
const SampledSpectrum &beta, const SampledSpectrum &inv_w_u, const SampledSpectrum &beta, const SampledSpectrum &r_u,
const SampledSpectrum &inv_w_l, const SampledWavelengths &lambda, Float etaScale, const SampledSpectrum &r_l, const SampledWavelengths &lambda, Float etaScale,
bool specularBounce, bool anyNonSpecularBounces, int pixelIndex) { bool specularBounce, bool anyNonSpecularBounces, int pixelIndex) {
int index = AllocateEntry(); int index = AllocateEntry();
DCHECK(!ray.HasNaN()); DCHECK(!ray.HasNaN());
...@@ -373,8 +373,8 @@ inline int RayQueue::PushIndirectRay( ...@@ -373,8 +373,8 @@ inline int RayQueue::PushIndirectRay(
this->pixelIndex[index] = pixelIndex; this->pixelIndex[index] = pixelIndex;
this->prevIntrCtx[index] = prevIntrCtx; this->prevIntrCtx[index] = prevIntrCtx;
this->beta[index] = beta; this->beta[index] = beta;
this->inv_w_u[index] = inv_w_u; this->r_u[index] = r_u;
this->inv_w_l[index] = inv_w_l; this->r_l[index] = r_l;
this->lambda[index] = lambda; this->lambda[index] = lambda;
this->anyNonSpecularBounces[index] = anyNonSpecularBounces; this->anyNonSpecularBounces[index] = anyNonSpecularBounces;
this->specularBounce[index] = specularBounce; this->specularBounce[index] = specularBounce;
...@@ -399,7 +399,7 @@ class EscapedRayQueue : public WorkQueue<EscapedRayWorkItem> { ...@@ -399,7 +399,7 @@ class EscapedRayQueue : public WorkQueue<EscapedRayWorkItem> {
inline int EscapedRayQueue::Push(RayWorkItem r) { inline int EscapedRayQueue::Push(RayWorkItem r) {
return Push(EscapedRayWorkItem{r.ray.o, r.ray.d, r.depth, r.lambda, r.pixelIndex, return Push(EscapedRayWorkItem{r.ray.o, r.ray.d, r.depth, r.lambda, r.pixelIndex,
r.beta, (int)r.specularBounce, r.inv_w_u, r.inv_w_l, r.beta, (int)r.specularBounce, r.r_u, r.r_l,
r.prevIntrCtx}); r.prevIntrCtx});
} }
...@@ -410,14 +410,14 @@ class GetBSSRDFAndProbeRayQueue : public WorkQueue<GetBSSRDFAndProbeRayWorkItem> ...@@ -410,14 +410,14 @@ class GetBSSRDFAndProbeRayQueue : public WorkQueue<GetBSSRDFAndProbeRayWorkItem>
PBRT_CPU_GPU PBRT_CPU_GPU
int Push(Material material, SampledWavelengths lambda, SampledSpectrum beta, int Push(Material material, SampledWavelengths lambda, SampledSpectrum beta,
SampledSpectrum inv_w_u, Point3f p, Vector3f wo, Normal3f n, Normal3f ns, SampledSpectrum r_u, Point3f p, Vector3f wo, Normal3f n, Normal3f ns,
Vector3f dpdus, Point2f uv, int depth, MediumInterface mediumInterface, Vector3f dpdus, Point2f uv, int depth, MediumInterface mediumInterface,
Float etaScale, int pixelIndex) { Float etaScale, int pixelIndex) {
int index = AllocateEntry(); int index = AllocateEntry();
this->material[index] = material; this->material[index] = material;
this->lambda[index] = lambda; this->lambda[index] = lambda;
this->beta[index] = beta; this->beta[index] = beta;
this->inv_w_u[index] = inv_w_u; this->r_u[index] = r_u;
this->p[index] = p; this->p[index] = p;
this->wo[index] = wo; this->wo[index] = wo;
this->n[index] = n; this->n[index] = n;
...@@ -439,7 +439,7 @@ class SubsurfaceScatterQueue : public WorkQueue<SubsurfaceScatterWorkItem> { ...@@ -439,7 +439,7 @@ class SubsurfaceScatterQueue : public WorkQueue<SubsurfaceScatterWorkItem> {
PBRT_CPU_GPU PBRT_CPU_GPU
int Push(Point3f p0, Point3f p1, int depth, Material material, TabulatedBSSRDF bssrdf, int Push(Point3f p0, Point3f p1, int depth, Material material, TabulatedBSSRDF bssrdf,
SampledWavelengths lambda, SampledSpectrum beta, SampledSpectrum inv_w_u, SampledWavelengths lambda, SampledSpectrum beta, SampledSpectrum r_u,
MediumInterface mediumInterface, Float etaScale, int pixelIndex) { MediumInterface mediumInterface, Float etaScale, int pixelIndex) {
int index = AllocateEntry(); int index = AllocateEntry();
this->p0[index] = p0; this->p0[index] = p0;
...@@ -449,7 +449,7 @@ class SubsurfaceScatterQueue : public WorkQueue<SubsurfaceScatterWorkItem> { ...@@ -449,7 +449,7 @@ class SubsurfaceScatterQueue : public WorkQueue<SubsurfaceScatterWorkItem> {
this->bssrdf[index] = bssrdf; this->bssrdf[index] = bssrdf;
this->lambda[index] = lambda; this->lambda[index] = lambda;
this->beta[index] = beta; this->beta[index] = beta;
this->inv_w_u[index] = inv_w_u; this->r_u[index] = r_u;
this->mediumInterface[index] = mediumInterface; this->mediumInterface[index] = mediumInterface;
this->etaScale[index] = etaScale; this->etaScale[index] = etaScale;
this->pixelIndex[index] = pixelIndex; this->pixelIndex[index] = pixelIndex;
...@@ -466,7 +466,7 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> { ...@@ -466,7 +466,7 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> {
PBRT_CPU_GPU PBRT_CPU_GPU
int Push(Ray ray, Float tMax, SampledWavelengths lambda, SampledSpectrum beta, int Push(Ray ray, Float tMax, SampledWavelengths lambda, SampledSpectrum beta,
SampledSpectrum inv_w_u, SampledSpectrum inv_w_l, int pixelIndex, SampledSpectrum r_u, SampledSpectrum r_l, int pixelIndex,
LightSampleContext prevIntrCtx, int specularBounce, LightSampleContext prevIntrCtx, int specularBounce,
int anyNonSpecularBounces, Float etaScale) { int anyNonSpecularBounces, Float etaScale) {
int index = AllocateEntry(); int index = AllocateEntry();
...@@ -474,8 +474,8 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> { ...@@ -474,8 +474,8 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> {
this->tMax[index] = tMax; this->tMax[index] = tMax;
this->lambda[index] = lambda; this->lambda[index] = lambda;
this->beta[index] = beta; this->beta[index] = beta;
this->inv_w_u[index] = inv_w_u; this->r_u[index] = r_u;
this->inv_w_l[index] = inv_w_l; this->r_l[index] = r_l;
this->pixelIndex[index] = pixelIndex; this->pixelIndex[index] = pixelIndex;
this->prevIntrCtx[index] = prevIntrCtx; this->prevIntrCtx[index] = prevIntrCtx;
this->specularBounce[index] = specularBounce; this->specularBounce[index] = specularBounce;
...@@ -486,7 +486,7 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> { ...@@ -486,7 +486,7 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> {
PBRT_CPU_GPU PBRT_CPU_GPU
int Push(RayWorkItem r, Float tMax) { int Push(RayWorkItem r, Float tMax) {
return Push(r.ray, tMax, r.lambda, r.beta, r.inv_w_u, r.inv_w_l, r.pixelIndex, return Push(r.ray, tMax, r.lambda, r.beta, r.r_u, r.r_l, r.pixelIndex,
r.prevIntrCtx, r.specularBounce, r.anyNonSpecularBounces, r.etaScale); r.prevIntrCtx, r.specularBounce, r.anyNonSpecularBounces, r.etaScale);
} }
}; };
......
...@@ -42,7 +42,7 @@ soa RayWorkItem { ...@@ -42,7 +42,7 @@ soa RayWorkItem {
int depth; int depth;
int pixelIndex; int pixelIndex;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u, inv_w_l; SampledSpectrum beta, r_u, r_l;
LightSampleContext prevIntrCtx; LightSampleContext prevIntrCtx;
Float etaScale; Float etaScale;
int specularBounce; int specularBounce;
...@@ -53,7 +53,7 @@ soa EscapedRayWorkItem { ...@@ -53,7 +53,7 @@ soa EscapedRayWorkItem {
Point3f rayo; Point3f rayo;
Vector3f rayd; Vector3f rayd;
int depth; int depth;
SampledSpectrum beta, inv_w_u, inv_w_l; SampledSpectrum beta, r_u, r_l;
SampledWavelengths lambda; SampledWavelengths lambda;
LightSampleContext prevIntrCtx; LightSampleContext prevIntrCtx;
int specularBounce; int specularBounce;
...@@ -63,7 +63,7 @@ soa EscapedRayWorkItem { ...@@ -63,7 +63,7 @@ soa EscapedRayWorkItem {
soa HitAreaLightWorkItem { soa HitAreaLightWorkItem {
Light areaLight; Light areaLight;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u, inv_w_l; SampledSpectrum beta, r_u, r_l;
Point3f p; Point3f p;
Normal3f n; Normal3f n;
Point2f uv; Point2f uv;
...@@ -78,14 +78,14 @@ soa ShadowRayWorkItem { ...@@ -78,14 +78,14 @@ soa ShadowRayWorkItem {
Ray ray; Ray ray;
Float tMax; Float tMax;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum Ld, inv_w_u, inv_w_l; SampledSpectrum Ld, r_u, r_l;
int pixelIndex; int pixelIndex;
}; };
soa GetBSSRDFAndProbeRayWorkItem { soa GetBSSRDFAndProbeRayWorkItem {
Material material; Material material;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u; SampledSpectrum beta, r_u;
Point3f p; Point3f p;
Vector3f wo; Vector3f wo;
Normal3f n, ns; Normal3f n, ns;
...@@ -104,7 +104,7 @@ soa SubsurfaceScatterWorkItem { ...@@ -104,7 +104,7 @@ soa SubsurfaceScatterWorkItem {
Material material; Material material;
TabulatedBSSRDF bssrdf; TabulatedBSSRDF bssrdf;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u; SampledSpectrum beta, r_u;
MediumInterface mediumInterface; MediumInterface mediumInterface;
Float etaScale; Float etaScale;
int pixelIndex; int pixelIndex;
...@@ -120,7 +120,7 @@ soa MediumSampleWorkItem { ...@@ -120,7 +120,7 @@ soa MediumSampleWorkItem {
int depth; int depth;
Float tMax; Float tMax;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u, inv_w_l; SampledSpectrum beta, r_u, r_l;
int pixelIndex; int pixelIndex;
Light areaLight; Light areaLight;
Point3fi pi; Point3fi pi;
...@@ -144,7 +144,7 @@ soa MediumScatterWorkItem<ConcretePhaseFunction> { ...@@ -144,7 +144,7 @@ soa MediumScatterWorkItem<ConcretePhaseFunction> {
Point3f p; Point3f p;
int depth; int depth;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u; SampledSpectrum beta, r_u;
const ConcretePhaseFunction *phase; const ConcretePhaseFunction *phase;
Vector3f wo; Vector3f wo;
Float time; Float time;
...@@ -156,7 +156,7 @@ soa MediumScatterWorkItem<ConcretePhaseFunction> { ...@@ -156,7 +156,7 @@ soa MediumScatterWorkItem<ConcretePhaseFunction> {
soa MaterialEvalWorkItem<ConcreteMaterial> { soa MaterialEvalWorkItem<ConcreteMaterial> {
const ConcreteMaterial *material; const ConcreteMaterial *material;
SampledWavelengths lambda; SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u; SampledSpectrum beta, r_u;
Point3fi pi; Point3fi pi;
Normal3f n, ns; Normal3f n, ns;
Vector3f dpdu, dpdv; Vector3f dpdu, dpdv;
......