...
 
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(
plyMesh.ConvertToOnlyTriangles();
Float edgeLength =
shape.parameters.GetOneFloat("displacement.edgelength", 1.f);
shape.parameters.GetOneFloat("edgelength", 1.f);
edgeLength *= Options->displacementEdgeScale;
std::string displacementTexName = shape.parameters.GetTexture("displacement");
......
......@@ -217,7 +217,7 @@ typename ParameterTypeTraits<PT>::ReturnType ParameterDictionary::lookupSingle(
// Issue error if an incorrect number of parameter values were provided
if (values.empty())
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\".",
traits::nPerItem, name);
......
......@@ -509,18 +509,18 @@ void WavefrontPathIntegrator::HandleEscapedRays() {
PBRT_DBG("depth %d specularBounce %d pdf uni %f %f %f %f "
"pdf nee %f %f %f %f\n",
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.inv_w_l[0], w.inv_w_l[1], w.inv_w_l[2], w.inv_w_l[3]);
w.r_u[0], 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]);
if (w.depth == 0 || w.specularBounce) {
L += w.beta * Le / w.inv_w_u.Average();
L += w.beta * Le / w.r_u.Average();
} else {
// Compute MIS-weighted radiance contribution from infinite light
LightSampleContext ctx = w.prevIntrCtx;
Float lightChoicePDF = lightSampler.PMF(ctx, light);
SampledSpectrum inv_w_l =
w.inv_w_l * lightChoicePDF * light.PDF_Li(ctx, w.rayd, true);
L += w.beta * Le / (w.inv_w_u + inv_w_l).Average();
SampledSpectrum r_l =
w.r_l * lightChoicePDF * light.PDF_Li(ctx, w.rayd, true);
L += w.beta * Le / (w.r_u + r_l).Average();
}
}
}
......@@ -550,7 +550,7 @@ void WavefrontPathIntegrator::HandleEmissiveIntersection() {
// Compute area light's weighted radiance contribution to the path
SampledSpectrum L(0.f);
if (w.depth == 0 || w.specularBounce) {
L = w.beta * Le / w.inv_w_u.Average();
L = w.beta * Le / w.r_u.Average();
} else {
// Compute MIS-weighted radiance contribution from area light
Vector3f wi = -w.wo;
......@@ -558,9 +558,9 @@ void WavefrontPathIntegrator::HandleEmissiveIntersection() {
Float lightChoicePDF = lightSampler.PMF(ctx, w.areaLight);
Float lightPDF = lightChoicePDF * w.areaLight.PDF_Li(ctx, wi, true);
SampledSpectrum inv_w_u = w.inv_w_u;
SampledSpectrum inv_w_l = w.inv_w_l * lightPDF;
L = w.beta * Le / (inv_w_u + inv_w_l).Average();
SampledSpectrum r_u = w.r_u;
SampledSpectrum r_l = w.r_l * lightPDF;
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],
......
......@@ -35,12 +35,11 @@ inline PBRT_CPU_GPU void RecordShadowRayResult(const ShadowRayWorkItem w,
PBRT_DBG("Shadow ray was occluded\n");
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 "
"(sr.Ld %f %f %f %f inv_w_u %f %f %f %f inv_w_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],
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.inv_w_l[2], w.inv_w_l[3]);
"(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.r_u[0],
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]);
SampledSpectrum Lpixel = pixelSampleState->L[w.pixelIndex];
pixelSampleState->L[w.pixelIndex] = Lpixel + Ld;
......@@ -62,8 +61,8 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
tMax,
r.lambda,
r.beta,
r.inv_w_u,
r.inv_w_l,
r.r_u,
r.r_l,
r.pixelIndex,
r.prevIntrCtx,
r.specularBounce,
......@@ -101,8 +100,8 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
PBRT_DBG("Enqueuing into medium transition queue: pixel index %d \n",
r.pixelIndex);
Ray newRay = intr.SpawnRay(r.ray.d);
nextRayQueue->PushIndirectRay(newRay, r.depth, r.prevIntrCtx, r.beta, r.inv_w_u,
r.inv_w_l, r.lambda, r.etaScale, r.specularBounce,
nextRayQueue->PushIndirectRay(newRay, r.depth, r.prevIntrCtx, r.beta, r.r_u,
r.r_l, r.lambda, r.etaScale, r.specularBounce,
r.anyNonSpecularBounces, r.pixelIndex);
return;
}
......@@ -113,7 +112,7 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
// TODO: intr.wo == -ray.d?
hitAreaLightQueue->Push(HitAreaLightWorkItem{
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();
......@@ -147,7 +146,7 @@ inline PBRT_CPU_GPU void EnqueueWorkAfterIntersection(
r.anyNonSpecularBounces,
intr.wo,
r.beta,
r.inv_w_u,
r.r_u,
r.etaScale,
mediumInterface});
};
......@@ -176,7 +175,7 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
RNG rng(Hash(ray.o), Hash(ray.d));
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)) {
PBRT_DBG(
......@@ -208,11 +207,11 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
// ratio-tracking: only evaluate null scattering
Float pr = T_maj[0] * sigma_maj[0];
T_ray *= T_maj * sigma_n / pr;
inv_w_l *= T_maj * sigma_maj / pr;
inv_w_u *= T_maj * sigma_n / pr;
r_l *= T_maj * sigma_maj / pr;
r_u *= T_maj * sigma_n / pr;
// 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) {
Float q = 0.75f;
if (rng.Uniform<Float>() < q)
......@@ -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_maj[3]);
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[0], T_ray[1], T_ray[2], T_ray[3], inv_w_l[0], inv_w_l[1],
inv_w_l[2], inv_w_l[3], inv_w_u[0], inv_w_u[1], inv_w_u[2],
inv_w_u[3]);
"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], r_l[0], r_l[1],
r_l[2], r_l[3], r_u[0], r_u[1], r_u[2], r_u[3]);
if (!T_ray)
return false;
......@@ -238,8 +236,8 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
return true;
});
T_ray *= T_maj / T_maj[0];
inv_w_l *= T_maj / T_maj[0];
inv_w_u *= T_maj / T_maj[0];
r_l *= T_maj / T_maj[0];
r_u *= T_maj / T_maj[0];
}
if (!result.hit || !T_ray)
......@@ -249,24 +247,23 @@ inline PBRT_CPU_GPU void TraceTransmittance(ShadowRayWorkItem sr,
ray = spawnTo(pLight);
}
PBRT_DBG("Final T_ray %.9g %.9g %.9g %.9g sr.inv_w_u %.9g %.9g %.9g %.9g inv_w_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],
sr.inv_w_u[2], sr.inv_w_u[3], inv_w_u[0], inv_w_u[1], inv_w_u[2],
inv_w_u[3]);
PBRT_DBG("sr.inv_w_l %.9g %.9g %.9g %.9g inv_w_l %.9g %.9g %.9g %.9g\n",
sr.inv_w_l[0], sr.inv_w_l[1], sr.inv_w_l[2], sr.inv_w_l[3], inv_w_l[0],
inv_w_l[1], inv_w_l[2], inv_w_l[3]);
PBRT_DBG("Final T_ray %.9g %.9g %.9g %.9g sr.r_u %.9g %.9g %.9g %.9g "
"r_u %.9g %.9g %.9g %.9g\n",
T_ray[0], T_ray[1], T_ray[2], T_ray[3], sr.r_u[0], sr.r_u[1],
sr.r_u[2], sr.r_u[3], r_u[0], r_u[1], r_u[2], r_u[3]);
PBRT_DBG("sr.r_l %.9g %.9g %.9g %.9g r_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],
r_l[1], r_l[2], r_l[3]);
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[1] / (sr.inv_w_u * inv_w_u + sr.inv_w_l * inv_w_l).Average(),
T_ray[2] / (sr.inv_w_u * inv_w_u + sr.inv_w_l * inv_w_l).Average(),
T_ray[3] / (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.r_u * r_u + sr.r_l * r_l).Average(),
T_ray[2] / (sr.r_u * r_u + sr.r_l * r_l).Average(),
T_ray[3] / (sr.r_u * r_u + sr.r_l * r_l).Average());
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...
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",
sr.pixelIndex, Ld[0], Ld[1], Ld[2], Ld[3]);
......
......@@ -38,17 +38,17 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
SampledWavelengths lambda = w.lambda;
SampledSpectrum beta = w.beta;
SampledSpectrum inv_w_u = w.inv_w_u;
SampledSpectrum inv_w_l = w.inv_w_l;
SampledSpectrum r_u = w.r_u;
SampledSpectrum r_l = w.r_l;
SampledSpectrum L(0.f);
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("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",
beta[0], beta[1], beta[2], beta[3], inv_w_u[0], inv_w_u[1],
inv_w_u[2], inv_w_u[3], inv_w_l[0], inv_w_l[1], inv_w_l[2],
inv_w_l[3]);
beta[0], beta[1], beta[2], beta[3], r_u[0], r_u[1],
r_u[2], r_u[3], r_l[0], r_l[1], r_l[2],
r_l[3]);
// Sample the medium according to T_maj, the homogeneous
// transmission function based on the majorant.
......@@ -74,12 +74,12 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
// (without scaling) at absorption events.
if (w.depth < maxDepth && mp.Le) {
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
if (inv_w_e)
if (r_e)
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.
......@@ -103,18 +103,18 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
PBRT_DBG("scattered\n");
Float pr = T_maj[0] * mp.sigma_s[0];
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.
auto enqueue = [=](auto ptr) {
using PhaseFunction = typename std::remove_const_t<
std::remove_reference_t<decltype(*ptr)>>;
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});
};
DCHECK_RARE(1e-6f, !beta);
if (beta && inv_w_u)
if (beta && r_u)
mp.phase.Dispatch(enqueue);
scattered = true;
......@@ -130,25 +130,25 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
beta *= T_maj * sigma_n / pr;
if (pr == 0)
beta = SampledSpectrum(0.f);
inv_w_u *= T_maj * sigma_n / pr;
inv_w_l *= T_maj * sigma_maj / pr;
r_u *= T_maj * sigma_n / pr;
r_l *= T_maj * sigma_maj / pr;
uMode = rng.Uniform<Float>();
return beta && inv_w_u;
return beta && r_u;
}
});
if (!scattered && beta) {
beta *= T_maj / T_maj[0];
inv_w_u *= T_maj / T_maj[0];
inv_w_l *= T_maj / T_maj[0];
r_u *= 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],
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",
inv_w_u[0], inv_w_u[1], inv_w_u[2], inv_w_u[3], inv_w_l[0],
inv_w_l[1], inv_w_l[2], inv_w_l[3]);
PBRT_DBG("Post ray medium sample r_u %f %f %f %f r_l %f %f %f %f\n",
r_u[0], r_u[1], r_u[2], r_u[3], r_l[0],
r_l[1], r_l[2], r_l[3]);
// Add any emission found to its pixel sample's L value.
if (L) {
......@@ -160,7 +160,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
// There's no more work to do if there was a scattering event in
// the medium.
if (scattered || !beta || !inv_w_u || w.depth == maxDepth)
if (scattered || !beta || !r_u || w.depth == maxDepth)
return;
// Otherwise, enqueue bump and medium stuff...
......@@ -172,7 +172,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
w.pixelIndex, w.depth);
escapedRayQueue->Push(EscapedRayWorkItem{
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;
}
......@@ -194,7 +194,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
intr.mediumInterface = &w.mediumInterface;
Ray newRay = intr.SpawnRay(ray.d);
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);
return;
}
......@@ -206,7 +206,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
w.pixelIndex, w.depth);
hitAreaLightQueue->Push(HitAreaLightWorkItem{
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();
......@@ -242,7 +242,7 @@ void WavefrontPathIntegrator::SampleMediumInteraction(int wavefrontDepth) {
w.anyNonSpecularBounces,
-ray.d,
beta,
inv_w_u,
r_u,
w.etaScale,
w.mediumInterface});
};
......@@ -293,23 +293,23 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) {
Float lightPDF = ls->pdf * sampledLight->p;
Float phasePDF =
IsDeltaLight(light.Type()) ? 0.f : w.phase->PDF(wo, wi);
SampledSpectrum inv_w_u = w.inv_w_u * phasePDF;
SampledSpectrum inv_w_l = w.inv_w_u * lightPDF;
SampledSpectrum r_u = w.r_u * phasePDF;
SampledSpectrum r_l = w.r_u * lightPDF;
SampledSpectrum Ld = beta * ls->L;
Ray ray(w.p, ls->pLight.p() - w.p, w.time, w.medium);
// Enqueue shadow ray
shadowRayQueue->Push(ShadowRayWorkItem{ray, 1 - ShadowEpsilon,
w.lambda, Ld, inv_w_u, inv_w_l,
w.lambda, Ld, r_u, r_l,
w.pixelIndex});
PBRT_DBG("Enqueued medium shadow ray depth %d "
"Ld %f %f %f %f inv_w_u %f %f %f %f "
"inv_w_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],
inv_w_u[2], inv_w_u[3], inv_w_l[0], inv_w_l[1], inv_w_l[2],
inv_w_l[3], w.pixelIndex);
"Ld %f %f %f %f r_u %f %f %f %f "
"r_l %f %f %f %f pixel index %d\n",
w.depth, Ld[0], Ld[1], Ld[2], Ld[3], r_u[0], r_u[1],
r_u[2], r_u[3], r_l[0], r_l[1], r_l[2],
r_l[3], w.pixelIndex);
}
}
......@@ -320,14 +320,14 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) {
return;
SampledSpectrum beta = w.beta * phaseSample->p / phaseSample->pdf;
SampledSpectrum inv_w_u = w.inv_w_u;
SampledSpectrum inv_w_l = w.inv_w_u / phaseSample->pdf;
SampledSpectrum r_u = w.r_u;
SampledSpectrum r_l = w.r_u / phaseSample->pdf;
// Russian roulette
// TODO: should we even bother? Generally beta is one here,
// due to the way scattering events are scattered and because we're
// 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) {
Float q = std::max<Float>(0, 1 - rrBeta.MaxComponentValue());
if (raySamples.indirect.rr < q) {
......@@ -343,7 +343,7 @@ void WavefrontPathIntegrator::SampleMediumScattering(int wavefrontDepth) {
bool anyNonSpecularBounces = true;
// 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,
anyNonSpecularBounces, w.pixelIndex);
PBRT_DBG("Enqueuing indirect medium ray at depth %d pixel index %d\n",
......
......@@ -37,7 +37,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
pstd::optional<BSSRDFProbeSegment> probeSeg = bssrdf.SampleSp(uc, u);
if (probeSeg)
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);
});
......@@ -62,7 +62,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
Float pr = w.reservoirPDF * bssrdfSample.pdf[0];
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;
RaySamples raySamples = pixelSampleState.samples[w.pixelIndex];
Vector3f wo = bssrdfSample.wo;
......@@ -83,25 +83,25 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
Vector3f wi = bsdfSample->wi;
SampledSpectrum beta =
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",
ConcreteBxDF::Name(), 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)
inv_w_l = inv_w_u / bsdf.PDF<ConcreteBxDF>(wo, bsdfSample->wi);
r_l = r_u / bsdf.PDF<ConcreteBxDF>(wo, bsdfSample->wi);
else
inv_w_l = inv_w_u / bsdfSample->pdf;
r_l = r_u / bsdfSample->pdf;
Float etaScale = w.etaScale;
if (bsdfSample->IsTransmission())
etaScale *= Sqr(bsdfSample->eta);
// 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) {
Float q = std::max<Float>(0, 1 - rrBeta.MaxComponentValue());
if (raySamples.indirect.rr < q) {
......@@ -125,23 +125,23 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
LightSampleContext ctx(intr.pi, intr.n, intr.ns);
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,
w.pixelIndex);
PBRT_DBG("Spawned indirect ray at depth %d. "
"Specular %d beta %f %f %f %f indir_inv_w_u %f %f %f %f "
"inv_w_l %f "
"Specular %d beta %f %f %f %f indir_r_u %f %f %f %f "
"r_l %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],
beta[1], beta[2], beta[3], indir_inv_w_u[0],
indir_inv_w_u[1], indir_inv_w_u[2], indir_inv_w_u[3],
inv_w_l[0], inv_w_l[1], inv_w_l[2], inv_w_l[3],
SafeDiv(beta, indir_inv_w_u)[0],
SafeDiv(beta, indir_inv_w_u)[1],
SafeDiv(beta, indir_inv_w_u)[2],
SafeDiv(beta, indir_inv_w_u)[3]);
beta[1], beta[2], beta[3], indir_r_u[0],
indir_r_u[1], indir_r_u[2], indir_r_u[3],
r_l[0], r_l[1], r_l[2], r_l[3],
SafeDiv(beta, indir_r_u)[0],
SafeDiv(beta, indir_r_u)[1],
SafeDiv(beta, indir_r_u)[2],
SafeDiv(beta, indir_r_u)[3]);
}
}
}
......@@ -174,22 +174,22 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
ls->L[0], ls->L[1], ls->L[2], ls->L[3], ls->pdf);
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.
Float bsdfPDF =
IsDeltaLight(light.Type()) ? 0.f : bsdf.PDF<ConcreteBxDF>(wo, wi);
SampledSpectrum inv_w_l = inv_w_u * lightPDF;
inv_w_u *= bsdfPDF;
SampledSpectrum r_l = r_u * lightPDF;
r_u *= bsdfPDF;
SampledSpectrum Ld = beta * ls->L;
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",
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],
SafeDiv(beta, inv_w_u)[2], SafeDiv(beta, inv_w_u)[3],
SafeDiv(Ld, inv_w_u)[0], SafeDiv(Ld, inv_w_u)[1],
SafeDiv(Ld, inv_w_u)[2], SafeDiv(Ld, inv_w_u)[3]);
beta[3], SafeDiv(beta, r_u)[0], SafeDiv(beta, r_u)[1],
SafeDiv(beta, r_u)[2], SafeDiv(beta, r_u)[3],
SafeDiv(Ld, r_u)[0], SafeDiv(Ld, r_u)[1],
SafeDiv(Ld, r_u)[2], SafeDiv(Ld, r_u)[3]);
Ray ray = SpawnRayTo(intr.pi, intr.n, time, ls->pLight.pi, ls->pLight.n);
if (haveMedia)
......@@ -198,7 +198,7 @@ void WavefrontPathIntegrator::SampleSubsurface(int wavefrontDepth) {
: w.mediumInterface.inside;
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
Vector3f wi = bsdfSample->wi;
SampledSpectrum beta =
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",
ConcreteBxDF::Name(), 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)
inv_w_l = inv_w_u / bsdf.PDF<ConcreteBxDF>(wo, bsdfSample->wi);
r_l = r_u / bsdf.PDF<ConcreteBxDF>(wo, bsdfSample->wi);
else
inv_w_l = inv_w_u / bsdfSample->pdf;
r_l = r_u / bsdfSample->pdf;
// Update _etaScale_ accounting for BSDF scattering
Float etaScale = w.etaScale;
......@@ -209,7 +209,7 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
// Apply Russian roulette to indirect ray based on weighted path
// 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
// depth earlier).
if (rrBeta.MaxComponentValue() < 1 && w.depth >= 1) {
......@@ -225,7 +225,7 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
// Initialize spawned ray and enqueue for next ray depth
if (bsdfSample->IsTransmission() &&
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,
w.depth, w.mediumInterface, etaScale,
w.pixelIndex);
......@@ -241,20 +241,20 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
// NOTE: slightly different than context below. Problem?
LightSampleContext ctx(w.pi, w.n, ns);
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,
w.pixelIndex);
PBRT_DBG(
"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 "
"%f %f %f beta/inv_w_u %f %f %f %f\n",
"Specular %d beta %f %f %f %f r_u %f %f %f %f r_l %f "
"%f %f %f beta/r_u %f %f %f %f\n",
w.depth + 1, w.pixelIndex, int(bsdfSample->IsSpecular()),
beta[0], beta[1], beta[2], beta[3], inv_w_u[0], inv_w_u[1],
inv_w_u[2], inv_w_u[3], inv_w_l[0], inv_w_l[1], inv_w_l[2],
inv_w_l[3], SafeDiv(beta, inv_w_u)[0],
SafeDiv(beta, inv_w_u)[1], SafeDiv(beta, inv_w_u)[2],
SafeDiv(beta, inv_w_u)[3]);
beta[0], beta[1], beta[2], beta[3], r_u[0], r_u[1],
r_u[2], r_u[3], r_l[0], r_l[1], r_l[2],
r_l[3], SafeDiv(beta, r_u)[0],
SafeDiv(beta, r_u)[1], SafeDiv(beta, r_u)[2],
SafeDiv(beta, r_u)[3]);
}
}
}
......@@ -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);
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.
Float bsdfPDF =
IsDeltaLight(light.Type()) ? 0.f : bsdf.PDF<ConcreteBxDF>(wo, wi);
SampledSpectrum inv_w_u = w.inv_w_u * bsdfPDF;
SampledSpectrum inv_w_l = w.inv_w_u * lightPDF;
SampledSpectrum r_u = w.r_u * bsdfPDF;
SampledSpectrum r_l = w.r_u * lightPDF;
// Enqueue shadow ray with tentative radiance contribution
SampledSpectrum Ld = beta * ls->L;
......@@ -313,16 +313,16 @@ void WavefrontPathIntegrator::EvaluateMaterialAndBSDF(MaterialEvalQueue *evalQue
: w.mediumInterface.inside;
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 "
"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],
beta[1], beta[2], beta[3], SafeDiv(beta, inv_w_u)[0],
SafeDiv(beta, inv_w_u)[1], SafeDiv(beta, inv_w_u)[2],
SafeDiv(beta, inv_w_u)[3], SafeDiv(Ld, inv_w_u)[0],
SafeDiv(Ld, inv_w_u)[1], SafeDiv(Ld, inv_w_u)[2],
SafeDiv(Ld, inv_w_u)[3]);
beta[1], beta[2], beta[3], SafeDiv(beta, r_u)[0],
SafeDiv(beta, r_u)[1], SafeDiv(beta, r_u)[2],
SafeDiv(beta, r_u)[3], SafeDiv(Ld, r_u)[0],
SafeDiv(Ld, r_u)[1], SafeDiv(Ld, r_u)[2],
SafeDiv(Ld, r_u)[3]);
}
});
}
......
......@@ -122,7 +122,7 @@ struct RayWorkItem {
int depth;
SampledWavelengths lambda;
int pixelIndex;
SampledSpectrum beta, inv_w_u, inv_w_l;
SampledSpectrum beta, r_u, r_l;
LightSampleContext prevIntrCtx;
Float etaScale;
int specularBounce;
......@@ -139,7 +139,7 @@ struct EscapedRayWorkItem {
int pixelIndex;
SampledSpectrum beta;
int specularBounce;
SampledSpectrum inv_w_u, inv_w_l;
SampledSpectrum r_u, r_l;
LightSampleContext prevIntrCtx;
};
......@@ -153,7 +153,7 @@ struct HitAreaLightWorkItem {
Vector3f wo;
SampledWavelengths lambda;
int depth;
SampledSpectrum beta, inv_w_u, inv_w_l;
SampledSpectrum beta, r_u, r_l;
LightSampleContext prevIntrCtx;
int specularBounce;
int pixelIndex;
......@@ -167,7 +167,7 @@ struct ShadowRayWorkItem {
Ray ray;
Float tMax;
SampledWavelengths lambda;
SampledSpectrum Ld, inv_w_u, inv_w_l;
SampledSpectrum Ld, r_u, r_l;
int pixelIndex;
};
......@@ -187,7 +187,7 @@ struct GetBSSRDFAndProbeRayWorkItem {
Material material;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u;
SampledSpectrum beta, r_u;
Point3f p;
Vector3f wo;
Normal3f n, ns;
......@@ -206,7 +206,7 @@ struct SubsurfaceScatterWorkItem {
Material material;
TabulatedBSSRDF bssrdf;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u;
SampledSpectrum beta, r_u;
Float reservoirPDF;
Float uLight;
SubsurfaceInteraction ssi;
......@@ -223,8 +223,8 @@ struct MediumSampleWorkItem {
Float tMax;
SampledWavelengths lambda;
SampledSpectrum beta;
SampledSpectrum inv_w_u;
SampledSpectrum inv_w_l;
SampledSpectrum r_u;
SampledSpectrum r_l;
int pixelIndex;
LightSampleContext prevIntrCtx;
int specularBounce;
......@@ -252,7 +252,7 @@ struct MediumScatterWorkItem {
Point3f p;
int depth;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u;
SampledSpectrum beta, r_u;
const PhaseFunction *phase;
Vector3f wo;
Float time;
......@@ -319,7 +319,7 @@ struct MaterialEvalWorkItem {
int pixelIndex;
int anyNonSpecularBounces;
Vector3f wo;
SampledSpectrum beta, inv_w_u;
SampledSpectrum beta, r_u;
Float etaScale;
MediumInterface mediumInterface;
};
......@@ -336,8 +336,8 @@ class RayQueue : public WorkQueue<RayWorkItem> {
PBRT_CPU_GPU
int PushIndirectRay(const Ray &ray, int depth, const LightSampleContext &prevIntrCtx,
const SampledSpectrum &beta, const SampledSpectrum &inv_w_u,
const SampledSpectrum &inv_w_l, const SampledWavelengths &lambda,
const SampledSpectrum &beta, const SampledSpectrum &r_u,
const SampledSpectrum &r_l, const SampledWavelengths &lambda,
Float etaScale, bool specularBounce, bool anyNonSpecularBounces,
int pixelIndex);
};
......@@ -354,8 +354,8 @@ inline int RayQueue::PushCameraRay(const Ray &ray, const SampledWavelengths &lam
this->beta[index] = SampledSpectrum(1.f);
this->etaScale[index] = 1.f;
this->anyNonSpecularBounces[index] = false;
this->inv_w_u[index] = SampledSpectrum(1.f);
this->inv_w_l[index] = SampledSpectrum(1.f);
this->r_u[index] = SampledSpectrum(1.f);
this->r_l[index] = SampledSpectrum(1.f);
this->specularBounce[index] = false;
return index;
}
......@@ -363,8 +363,8 @@ inline int RayQueue::PushCameraRay(const Ray &ray, const SampledWavelengths &lam
PBRT_CPU_GPU
inline int RayQueue::PushIndirectRay(
const Ray &ray, int depth, const LightSampleContext &prevIntrCtx,
const SampledSpectrum &beta, const SampledSpectrum &inv_w_u,
const SampledSpectrum &inv_w_l, const SampledWavelengths &lambda, Float etaScale,
const SampledSpectrum &beta, const SampledSpectrum &r_u,
const SampledSpectrum &r_l, const SampledWavelengths &lambda, Float etaScale,
bool specularBounce, bool anyNonSpecularBounces, int pixelIndex) {
int index = AllocateEntry();
DCHECK(!ray.HasNaN());
......@@ -373,8 +373,8 @@ inline int RayQueue::PushIndirectRay(
this->pixelIndex[index] = pixelIndex;
this->prevIntrCtx[index] = prevIntrCtx;
this->beta[index] = beta;
this->inv_w_u[index] = inv_w_u;
this->inv_w_l[index] = inv_w_l;
this->r_u[index] = r_u;
this->r_l[index] = r_l;
this->lambda[index] = lambda;
this->anyNonSpecularBounces[index] = anyNonSpecularBounces;
this->specularBounce[index] = specularBounce;
......@@ -399,7 +399,7 @@ class EscapedRayQueue : public WorkQueue<EscapedRayWorkItem> {
inline int EscapedRayQueue::Push(RayWorkItem r) {
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});
}
......@@ -410,14 +410,14 @@ class GetBSSRDFAndProbeRayQueue : public WorkQueue<GetBSSRDFAndProbeRayWorkItem>
PBRT_CPU_GPU
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,
Float etaScale, int pixelIndex) {
int index = AllocateEntry();
this->material[index] = material;
this->lambda[index] = lambda;
this->beta[index] = beta;
this->inv_w_u[index] = inv_w_u;
this->r_u[index] = r_u;
this->p[index] = p;
this->wo[index] = wo;
this->n[index] = n;
......@@ -439,7 +439,7 @@ class SubsurfaceScatterQueue : public WorkQueue<SubsurfaceScatterWorkItem> {
PBRT_CPU_GPU
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) {
int index = AllocateEntry();
this->p0[index] = p0;
......@@ -449,7 +449,7 @@ class SubsurfaceScatterQueue : public WorkQueue<SubsurfaceScatterWorkItem> {
this->bssrdf[index] = bssrdf;
this->lambda[index] = lambda;
this->beta[index] = beta;
this->inv_w_u[index] = inv_w_u;
this->r_u[index] = r_u;
this->mediumInterface[index] = mediumInterface;
this->etaScale[index] = etaScale;
this->pixelIndex[index] = pixelIndex;
......@@ -466,7 +466,7 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> {
PBRT_CPU_GPU
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,
int anyNonSpecularBounces, Float etaScale) {
int index = AllocateEntry();
......@@ -474,8 +474,8 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> {
this->tMax[index] = tMax;
this->lambda[index] = lambda;
this->beta[index] = beta;
this->inv_w_u[index] = inv_w_u;
this->inv_w_l[index] = inv_w_l;
this->r_u[index] = r_u;
this->r_l[index] = r_l;
this->pixelIndex[index] = pixelIndex;
this->prevIntrCtx[index] = prevIntrCtx;
this->specularBounce[index] = specularBounce;
......@@ -486,7 +486,7 @@ class MediumSampleQueue : public WorkQueue<MediumSampleWorkItem> {
PBRT_CPU_GPU
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);
}
};
......
......@@ -42,7 +42,7 @@ soa RayWorkItem {
int depth;
int pixelIndex;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u, inv_w_l;
SampledSpectrum beta, r_u, r_l;
LightSampleContext prevIntrCtx;
Float etaScale;
int specularBounce;
......@@ -53,7 +53,7 @@ soa EscapedRayWorkItem {
Point3f rayo;
Vector3f rayd;
int depth;
SampledSpectrum beta, inv_w_u, inv_w_l;
SampledSpectrum beta, r_u, r_l;
SampledWavelengths lambda;
LightSampleContext prevIntrCtx;
int specularBounce;
......@@ -63,7 +63,7 @@ soa EscapedRayWorkItem {
soa HitAreaLightWorkItem {
Light areaLight;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u, inv_w_l;
SampledSpectrum beta, r_u, r_l;
Point3f p;
Normal3f n;
Point2f uv;
......@@ -78,14 +78,14 @@ soa ShadowRayWorkItem {
Ray ray;
Float tMax;
SampledWavelengths lambda;
SampledSpectrum Ld, inv_w_u, inv_w_l;
SampledSpectrum Ld, r_u, r_l;
int pixelIndex;
};
soa GetBSSRDFAndProbeRayWorkItem {
Material material;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u;
SampledSpectrum beta, r_u;
Point3f p;
Vector3f wo;
Normal3f n, ns;
......@@ -104,7 +104,7 @@ soa SubsurfaceScatterWorkItem {
Material material;
TabulatedBSSRDF bssrdf;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u;
SampledSpectrum beta, r_u;
MediumInterface mediumInterface;
Float etaScale;
int pixelIndex;
......@@ -120,7 +120,7 @@ soa MediumSampleWorkItem {
int depth;
Float tMax;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u, inv_w_l;
SampledSpectrum beta, r_u, r_l;
int pixelIndex;
Light areaLight;
Point3fi pi;
......@@ -144,7 +144,7 @@ soa MediumScatterWorkItem<ConcretePhaseFunction> {
Point3f p;
int depth;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u;
SampledSpectrum beta, r_u;
const ConcretePhaseFunction *phase;
Vector3f wo;
Float time;
......@@ -156,7 +156,7 @@ soa MediumScatterWorkItem<ConcretePhaseFunction> {
soa MaterialEvalWorkItem<ConcreteMaterial> {
const ConcreteMaterial *material;
SampledWavelengths lambda;
SampledSpectrum beta, inv_w_u;
SampledSpectrum beta, r_u;
Point3fi pi;
Normal3f n, ns;
Vector3f dpdu, dpdv;
......