本文整理汇总了C++中BSDF::Pdf方法的典型用法代码示例。如果您正苦于以下问题:C++ BSDF::Pdf方法的具体用法?C++ BSDF::Pdf怎么用?C++ BSDF::Pdf使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类BSDF
的用法示例。
在下文中一共展示了BSDF::Pdf方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: TraceEyePath
void HitPoints::TraceEyePath(HitPoint *hp, const Sample &sample, float const invPixelPdf)
{
HitPointEyePass *hpep = &hp->eyePass;
Scene &scene(*renderer->scene);
const bool includeEnvironment = renderer->sppmi->includeEnvironment;
const u_int maxDepth = renderer->sppmi->maxEyePathDepth;
//--------------------------------------------------------------------------
// Following code is, given or taken, a copy of path integrator Li() method
//--------------------------------------------------------------------------
// Declare common path integration variables
const SpectrumWavelengths &sw(sample.swl);
Ray ray;
const float rayWeight = sample.camera->GenerateRay(scene, sample, &ray, &(hp->imageX), &(hp->imageY));
const float nLights = scene.lights.size();
const u_int lightGroupCount = scene.lightGroups.size();
vector<SWCSpectrum> Ld(lightGroupCount, 0.f);
// Direct lighting samples variance
vector<float> Vd(lightGroupCount, 0.f);
SWCSpectrum pathThroughput(1.0f); // pathThroughput is normalised perpixel for the eyepass contribution, so no need for invPixelPdf normalisation;
vector<SWCSpectrum> L(lightGroupCount, 0.f);
vector<float> V(lightGroupCount, 0.f);
float VContrib = .1f;
bool scattered = false;
hpep->alpha = 1.f;
hpep->distance = INFINITY;
u_int vertexIndex = 0;
const Volume *volume = NULL;
bool specularBounce = true;
const bool enableDirectLightSampling = renderer->sppmi->directLightSampling;
for (u_int pathLength = 0; ; ++pathLength) {
const SWCSpectrum prevThroughput(pathThroughput);
float *data = eyeSampler->GetLazyValues(sample, 0, pathLength);
// Find next vertex of path
Intersection isect;
BSDF *bsdf;
float spdf;
sample.arena.Begin();
if (!scene.Intersect(sample, volume, scattered, ray, data[0],
&isect, &bsdf, &spdf, NULL, &pathThroughput)) {
pathThroughput /= spdf;
// Dade - now I know ray.maxt and I can call volumeIntegrator
SWCSpectrum Lv;
u_int g = scene.volumeIntegrator->Li(scene, ray, sample,
&Lv, &hpep->alpha);
if (!Lv.Black()) {
Lv *= prevThroughput;
L[g] += Lv;
}
// Stop path sampling since no intersection was found
// Possibly add horizon in render & reflections
if (!enableDirectLightSampling || (
(includeEnvironment || vertexIndex > 0) && specularBounce)) {
BSDF *ibsdf;
for (u_int i = 0; i < nLights; ++i) {
SWCSpectrum Le(pathThroughput);
if (scene.lights[i]->Le(scene, sample,
ray, &ibsdf, NULL, NULL, &Le))
L[scene.lights[i]->group] += Le;
}
}
// Set alpha channel
if (vertexIndex == 0)
hpep->alpha = 0.f;
hp->SetConstant();
break;
}
sample.arena.End();
scattered = bsdf->dgShading.scattered;
pathThroughput /= spdf;
if (vertexIndex == 0)
hpep->distance = ray.maxt * ray.d.Length();
SWCSpectrum Lv;
const u_int g = scene.volumeIntegrator->Li(scene, ray, sample,
&Lv, &hpep->alpha);
if (!Lv.Black()) {
Lv *= prevThroughput;
L[g] += Lv;
}
// Possibly add emitted light at path vertex
Vector wo(-ray.d);
if (specularBounce) {
BSDF *ibsdf;
SWCSpectrum Le(pathThroughput);
if (isect.Le(sample, ray, &ibsdf, NULL, NULL, &Le)) {
L[isect.arealight->group] += Le;
//.........这里部分代码省略.........
示例2: Li
Spectrum ExPhotonIntegrator::Li(const Scene *scene,
const RayDifferential &ray, const Sample *sample,
float *alpha) const {
// Compute reflected radiance with photon map
Spectrum L(0.);
Intersection isect;
if (scene->Intersect(ray, &isect)) {
if (alpha) *alpha = 1.;
Vector wo = -ray.d;
// Compute emitted light if ray hit an area light source
L += isect.Le(wo);
// Evaluate BSDF at hit point
BSDF *bsdf = isect.GetBSDF(ray);
const Point &p = bsdf->dgShading.p;
const Normal &n = bsdf->dgShading.nn;
L += UniformSampleAllLights(scene, p, n,
wo, bsdf, sample,
lightSampleOffset, bsdfSampleOffset,
bsdfComponentOffset);
// Compute indirect lighting for photon map integrator
L += LPhoton(causticMap, nCausticPaths, nLookup, bsdf,
isect, wo, maxDistSquared);
if (finalGather) {
#if 1
// Do one-bounce final gather for photon map
BxDFType nonSpecular = BxDFType(BSDF_REFLECTION |
BSDF_TRANSMISSION | BSDF_DIFFUSE | BSDF_GLOSSY);
if (bsdf->NumComponents(nonSpecular) > 0) {
// Find indirect photons around point for importance sampling
u_int nIndirSamplePhotons = 50;
PhotonProcess proc(nIndirSamplePhotons, p);
proc.photons = (ClosePhoton *)alloca(nIndirSamplePhotons *
sizeof(ClosePhoton));
float searchDist2 = maxDistSquared;
while (proc.foundPhotons < nIndirSamplePhotons) {
float md2 = searchDist2;
proc.foundPhotons = 0;
indirectMap->Lookup(p, proc, md2);
searchDist2 *= 2.f;
}
// Copy photon directions to local array
Vector *photonDirs = (Vector *)alloca(nIndirSamplePhotons *
sizeof(Vector));
for (u_int i = 0; i < nIndirSamplePhotons; ++i)
photonDirs[i] = proc.photons[i].photon->wi;
// Use BSDF to do final gathering
Spectrum Li = 0.;
static StatsCounter gatherRays("Photon Map", // NOBOOK
"Final gather rays traced"); // NOBOOK
for (int i = 0; i < gatherSamples; ++i) {
// Sample random direction from BSDF for final gather ray
Vector wi;
float u1 = sample->twoD[gatherSampleOffset[0]][2*i];
float u2 = sample->twoD[gatherSampleOffset[0]][2*i+1];
float u3 = sample->oneD[gatherComponentOffset[0]][i];
float pdf;
Spectrum fr = bsdf->Sample_f(wo, &wi, u1, u2, u3,
&pdf, BxDFType(BSDF_ALL & (~BSDF_SPECULAR)));
if (fr.Black() || pdf == 0.f) continue;
// Trace BSDF final gather ray and accumulate radiance
RayDifferential bounceRay(p, wi);
++gatherRays; // NOBOOK
Intersection gatherIsect;
if (scene->Intersect(bounceRay, &gatherIsect)) {
// Compute exitant radiance using precomputed irradiance
Spectrum Lindir = 0.f;
Normal n = gatherIsect.dg.nn;
if (Dot(n, bounceRay.d) > 0) n = -n;
RadiancePhotonProcess proc(gatherIsect.dg.p, n);
float md2 = INFINITY;
radianceMap->Lookup(gatherIsect.dg.p, proc, md2);
if (proc.photon)
Lindir = proc.photon->Lo;
Lindir *= scene->Transmittance(bounceRay);
// Compute MIS weight for BSDF-sampled gather ray
// Compute PDF for photon-sampling of direction _wi_
float photonPdf = 0.f;
float conePdf = UniformConePdf(cosGatherAngle);
for (u_int j = 0; j < nIndirSamplePhotons; ++j)
if (Dot(photonDirs[j], wi) > .999f * cosGatherAngle)
photonPdf += conePdf;
photonPdf /= nIndirSamplePhotons;
float wt = PowerHeuristic(gatherSamples, pdf,
gatherSamples, photonPdf);
Li += fr * Lindir * AbsDot(wi, n) * wt / pdf;
}
}
L += Li / gatherSamples;
// Use nearby photons to do final gathering
Li = 0.;
for (int i = 0; i < gatherSamples; ++i) {
// Sample random direction using photons for final gather ray
float u1 = sample->oneD[gatherComponentOffset[1]][i];
float u2 = sample->twoD[gatherSampleOffset[1]][2*i];
float u3 = sample->twoD[gatherSampleOffset[1]][2*i+1];
int photonNum = min((int)nIndirSamplePhotons - 1,
Floor2Int(u1 * nIndirSamplePhotons));
// Sample gather ray direction from _photonNum_
Vector vx, vy;
//.........这里部分代码省略.........