fix point sources in the RTRT preview

metadata
Wenzel Jakob 2010-09-08 01:55:50 +02:00
parent 0dc517bfa4
commit 3de850f4e2
6 changed files with 31 additions and 17 deletions

View File

@ -31,10 +31,12 @@ MTS_NAMESPACE_BEGIN
class MTS_EXPORT_RENDER PreviewWorker : public WorkProcessor { class MTS_EXPORT_RENDER PreviewWorker : public WorkProcessor {
public: public:
inline PreviewWorker(int blockSize, Point cameraO, Vector cameraTL, inline PreviewWorker(int blockSize, Point cameraO, Vector cameraTL,
Vector cameraDx, Vector cameraDy, const VPL &vpl, Float minDist, bool coherent) Vector cameraDx, Vector cameraDy, const VPL &vpl, Float minDist, bool coherent,
bool diffuseSources, bool diffuseReceivers)
: m_blockSize(blockSize), m_cameraO(cameraO), m_cameraTL(cameraTL), : m_blockSize(blockSize), m_cameraO(cameraO), m_cameraTL(cameraTL),
m_cameraDx(cameraDx), m_cameraDy(cameraDy), m_vpl(vpl), m_cameraDx(cameraDx), m_cameraDy(cameraDy), m_vpl(vpl),
m_minDist(minDist), m_coherent(coherent) { m_minDist(minDist), m_coherent(coherent), m_diffuseSources(diffuseSources),
m_diffuseReceivers(diffuseReceivers) {
} }
void processIncoherent(const WorkUnit *workUnit, WorkResult *workResult, void processIncoherent(const WorkUnit *workUnit, WorkResult *workResult,
@ -68,6 +70,7 @@ private:
Float m_minDist; Float m_minDist;
const std::vector<const Shape *> *m_shapes; const std::vector<const Shape *> *m_shapes;
bool m_coherent; bool m_coherent;
bool m_diffuseSources, m_diffuseReceivers;
}; };
MTS_NAMESPACE_END MTS_NAMESPACE_END

View File

@ -192,7 +192,7 @@ void VPLShaderManager::setVPL(const VPL &vpl) {
for (int i=1; i<=sampleCount; ++i) { for (int i=1; i<=sampleCount; ++i) {
Vector dir; Vector dir;
Point2 seed(i*invSampleCount, radicalInverse(2, i)); // Hammersley seq. Point2 seed(i*invSampleCount, radicalInverse(2, i)); // Hammersley seq.
if (vpl.type == ELuminaireVPL && vpl.luminaire->getType() & Luminaire::EOnSurface) if (vpl.type == ESurfaceVPL || vpl.luminaire->getType() & Luminaire::EOnSurface)
dir = vpl.its.shFrame.toWorld(squareToHemispherePSA(seed)); dir = vpl.its.shFrame.toWorld(squareToHemispherePSA(seed));
else else
dir = squareToSphere(seed); dir = squareToSphere(seed);

View File

@ -108,9 +108,10 @@ void PreviewWorker::processIncoherent(const WorkUnit *workUnit, WorkResult *work
EmissionRecord eRec(m_vpl.luminaire, EmissionRecord eRec(m_vpl.luminaire,
ShapeSamplingRecord(m_vpl.its.p, m_vpl.its.shFrame.n), toIts); ShapeSamplingRecord(m_vpl.its.p, m_vpl.its.shFrame.n), toIts);
eRec.type = EmissionRecord::EPreview; eRec.type = EmissionRecord::EPreview;
value += m_vpl.P * bsdfVal * m_vpl.luminaire->f(eRec) * value += m_vpl.P * bsdfVal * m_vpl.luminaire->f(eRec)
((m_vpl.luminaire->getType() == Luminaire::EOnSurface ? * ((m_vpl.luminaire->getType() & Luminaire::EOnSurface ?
(Float) 1 : dot(m_vpl.its.shFrame.n, toIts)) / (length*length)); dot(m_vpl.its.shFrame.n, toIts) : (Float) 1)
/ (length*length));
} }
block->setPixel(pos++, value); block->setPixel(pos++, value);
} }
@ -178,7 +179,7 @@ void PreviewWorker::processCoherent(const WorkUnit *workUnit, WorkResult *workRe
bool diffuseVPL = false, vplOnSurface = false; bool diffuseVPL = false, vplOnSurface = false;
Spectrum vplWeight; Spectrum vplWeight;
if (m_vpl.type == ESurfaceVPL && m_vpl.its.shape->getBSDF()->getType() == BSDF::EDiffuseReflection) { if (m_vpl.type == ESurfaceVPL && (m_diffuseSources || m_vpl.its.shape->getBSDF()->getType() == BSDF::EDiffuseReflection)) {
diffuseVPL = true; diffuseVPL = true;
vplOnSurface = true; vplOnSurface = true;
vplWeight = m_vpl.its.shape->getBSDF()->getDiffuseReflectance(m_vpl.its) * m_vpl.P / M_PI; vplWeight = m_vpl.its.shape->getBSDF()->getDiffuseReflectance(m_vpl.its) * m_vpl.P / M_PI;
@ -324,7 +325,7 @@ void PreviewWorker::processCoherent(const WorkUnit *workUnit, WorkResult *workRe
/* Fast path */ /* Fast path */
direct[idx] = (bsdf->getDiffuseReflectance(its) * vplWeight) direct[idx] = (bsdf->getDiffuseReflectance(its) * vplWeight)
* (std::max((Float) 0.0f, dot(wo, its.shFrame.n)) * (std::max((Float) 0.0f, dot(wo, its.shFrame.n))
* (vplOnSurface ? std::max(cosThetaLight.f[idx], (Float) 0.0f) * INV_PI : 0.0f) * (vplOnSurface ? std::max(cosThetaLight.f[idx], (Float) 0.0f) * INV_PI : 1.0f)
* invLengthSquared.f[idx]); * invLengthSquared.f[idx]);
} else { } else {
wi.x = -primRay4.d[0].f[idx]; wi.x = -primRay4.d[0].f[idx];
@ -355,7 +356,7 @@ void PreviewWorker::processCoherent(const WorkUnit *workUnit, WorkResult *workRe
} }
} }
if (EXPECT_TAKEN(ctLight > 0)) { if (EXPECT_TAKEN(ctLight >= 0)) {
direct[idx] = (bsdf->fCos(BSDFQueryRecord(its, wo)) * vplWeight direct[idx] = (bsdf->fCos(BSDFQueryRecord(its, wo)) * vplWeight
* ((vplOnSurface ? std::max(ctLight, (Float) 0.0f) : 1.0f) * invLengthSquared.f[idx])); * ((vplOnSurface ? std::max(ctLight, (Float) 0.0f) : 1.0f) * invLengthSquared.f[idx]));
} else { } else {
@ -402,7 +403,8 @@ void PreviewWorker::processCoherent(const WorkUnit *workUnit, WorkResult *workRe
ref<WorkProcessor> PreviewWorker::clone() const { ref<WorkProcessor> PreviewWorker::clone() const {
return new PreviewWorker(m_blockSize, m_cameraO, m_cameraTL, return new PreviewWorker(m_blockSize, m_cameraO, m_cameraTL,
m_cameraDx, m_cameraDy, m_vpl, m_minDist, m_coherent); m_cameraDx, m_cameraDy, m_vpl, m_minDist, m_coherent,
m_diffuseSources, m_diffuseReceivers);
} }
MTS_IMPLEMENT_CLASS(PreviewWorker, false, WorkProcessor) MTS_IMPLEMENT_CLASS(PreviewWorker, false, WorkProcessor)

View File

@ -545,10 +545,10 @@ void PreviewThread::rtrtRenderVPL(PreviewQueueEntry &target, const VPL &vpl) {
for (int i=1; i<=sampleCount; ++i) { for (int i=1; i<=sampleCount; ++i) {
Vector dir; Vector dir;
Point2 seed(i*invSampleCount, radicalInverse(2, i)); // Hammersley seq. Point2 seed(i*invSampleCount, radicalInverse(2, i)); // Hammersley seq.
if (vpl.type == ELuminaireVPL && vpl.luminaire->getType() == Luminaire::EDeltaPosition) if (vpl.type == ESurfaceVPL || vpl.luminaire->getType() & Luminaire::EOnSurface)
dir = squareToSphere(seed);
else
dir = vpl.its.shFrame.toWorld(squareToHemispherePSA(seed)); dir = vpl.its.shFrame.toWorld(squareToHemispherePSA(seed));
else
dir = squareToSphere(seed);
ray.setDirection(dir); ray.setDirection(dir);
if (m_context->scene->rayIntersect(ray, its)) { if (m_context->scene->rayIntersect(ray, its)) {
@ -578,7 +578,9 @@ void PreviewThread::rtrtRenderVPL(PreviewQueueEntry &target, const VPL &vpl) {
m_previewProc->configure(vpl, minDist, jitter, m_previewProc->configure(vpl, minDist, jitter,
m_accumBuffer ? m_accumBuffer->getBitmap() : NULL, m_accumBuffer ? m_accumBuffer->getBitmap() : NULL,
target.buffer->getBitmap(), target.buffer->getBitmap(),
m_context->previewMethod == ERayTraceCoherent); m_context->previewMethod == ERayTraceCoherent,
m_context->diffuseSources,
m_context->diffuseReceivers);
m_mutex->unlock(); m_mutex->unlock();
ref<Scheduler> sched = Scheduler::getInstance(); ref<Scheduler> sched = Scheduler::getInstance();

View File

@ -72,7 +72,8 @@ void PreviewProcess::processResult(const WorkResult *result, bool cancelled) {
} }
void PreviewProcess::configure(const VPL &vpl, Float minDist, const Point2 &jitter, void PreviewProcess::configure(const VPL &vpl, Float minDist, const Point2 &jitter,
const Bitmap *source, Bitmap *target, bool coherent) { const Bitmap *source, Bitmap *target, bool coherent, bool diffuseSources,
bool diffuseReceivers) {
BlockedImageProcess::init(m_film->getCropOffset(), m_film->getCropSize(), m_blockSize); BlockedImageProcess::init(m_film->getCropOffset(), m_film->getCropSize(), m_blockSize);
m_source = source; m_source = source;
m_target = target; m_target = target;
@ -80,6 +81,8 @@ void PreviewProcess::configure(const VPL &vpl, Float minDist, const Point2 &jitt
m_vpl = &vpl; m_vpl = &vpl;
m_minDist = minDist; m_minDist = minDist;
m_coherent = coherent; m_coherent = coherent;
m_diffuseSources = diffuseSources;
m_diffuseReceivers = diffuseReceivers;
/* It is not necessary to shoot normalized rays. Instead, interpolate: /* It is not necessary to shoot normalized rays. Instead, interpolate:
here, we generate the upper left corner ray as well as the here, we generate the upper left corner ray as well as the
@ -104,7 +107,8 @@ void PreviewProcess::configure(const VPL &vpl, Float minDist, const Point2 &jitt
ref<WorkProcessor> PreviewProcess::createWorkProcessor() const { ref<WorkProcessor> PreviewProcess::createWorkProcessor() const {
return new PreviewWorker(m_blockSize, m_cameraO, m_cameraTL, return new PreviewWorker(m_blockSize, m_cameraO, m_cameraTL,
m_cameraDx, m_cameraDy, *m_vpl, m_minDist, m_coherent); m_cameraDx, m_cameraDy, *m_vpl, m_minDist, m_coherent,
m_diffuseSources, m_diffuseReceivers);
} }

View File

@ -17,7 +17,8 @@ public:
PreviewProcess(const Scene *scene, int sceneResID, int blockSize); PreviewProcess(const Scene *scene, int sceneResID, int blockSize);
void configure(const VPL &vpl, Float minDist, const Point2 &jitter, void configure(const VPL &vpl, Float minDist, const Point2 &jitter,
const Bitmap *source, Bitmap *target, bool coherent); const Bitmap *source, Bitmap *target, bool coherent,
bool diffuseSources, bool diffuseReceivers);
inline int getRayCount() const { return m_numRays; } inline int getRayCount() const { return m_numRays; }
inline const Scene *getScene() const { return m_scene; } inline const Scene *getScene() const { return m_scene; }
@ -42,6 +43,8 @@ private:
const VPL *m_vpl; const VPL *m_vpl;
Float m_minDist; Float m_minDist;
bool m_coherent; bool m_coherent;
bool m_diffuseSources;
bool m_diffuseReceivers;
}; };
#endif /* __PREVIEW_PROC_H */ #endif /* __PREVIEW_PROC_H */