void SamplingIntegrator::renderBlock(const Scene *scene, const Sensor *sensor, Sampler *sampler, ImageBlock *block, const bool &stop, const std::vector< TPoint2<uint8_t> > &points) const { Float diffScaleFactor = 1.0f / std::sqrt((Float) sampler->getSampleCount()); bool needsApertureSample = sensor->needsApertureSample(); bool needsTimeSample = sensor->needsTimeSample(); RadianceQueryRecord rRec(scene, sampler); Point2 apertureSample(0.5f); Float timeSample = 0.5f; RayDifferential sensorRay; block->clear(); uint32_t queryType = RadianceQueryRecord::ESensorRay; if (!sensor->getFilm()->hasAlpha()) /* Don't compute an alpha channel if we don't have to */ queryType &= ~RadianceQueryRecord::EOpacity; for (size_t i = 0; i<points.size(); ++i) { Point2i offset = Point2i(points[i]) + Vector2i(block->getOffset()); if (stop) break; sampler->generate(offset); for (size_t j = 0; j<sampler->getSampleCount(); j++) { rRec.newQuery(queryType, sensor->getMedium()); Point2 samplePos(Point2(offset) + Vector2(rRec.nextSample2D())); if (needsApertureSample) apertureSample = rRec.nextSample2D(); if (needsTimeSample) timeSample = rRec.nextSample1D(); Spectrum spec = sensor->sampleRayDifferential( sensorRay, samplePos, apertureSample, timeSample); sensorRay.scaleDifferential(diffScaleFactor); spec *= Li(sensorRay, rRec); block->put(samplePos, spec, rRec.alpha); sampler->advance(); } } }
/// Draw the full scene using additive blending and shadow maps void drawShadowedScene(const Scene *scene, const VPL &vpl) { const ProjectiveCamera *sensor = static_cast<const ProjectiveCamera *>(scene->getSensor()); Point2 aaSample = Point2(m_random->nextFloat(), m_random->nextFloat()); Point2 apertureSample(0.5f); if (sensor->needsApertureSample()) apertureSample = Point2(m_random->nextFloat(), m_random->nextFloat()); Transform projTransform = sensor->getProjectionTransform(apertureSample, aaSample); Transform worldTransform = sensor->getWorldTransform()->eval( sensor->getShutterOpen() + m_random->nextFloat() * sensor->getShutterOpenTime()); m_shaderManager->setVPL(vpl); m_framebuffer->activateTarget(); m_framebuffer->clear(); m_renderer->setCamera(projTransform.getMatrix(), worldTransform.getInverseMatrix()); m_shaderManager->drawAllGeometryForVPL(vpl, sensor); m_shaderManager->drawBackground(sensor, projTransform, vpl.emitterScale); m_framebuffer->releaseTarget(); }
void renderBlock(const Scene *scene, const Sensor *sensor, Sampler *sampler, ImageBlock *block, const bool &stop, const std::vector< TPoint2<uint8_t> > &points) const { Float diffScaleFactor = 1.0f / std::sqrt((Float)sampler->getSampleCount()); bool needsApertureSample = sensor->needsApertureSample(); bool needsTimeSample = sensor->needsTimeSample(); RadianceQueryRecord rRec(scene, sampler); Point2 apertureSample(0.5f); Float timeSample = 0.5f; RayDifferential sensorRay; block->clear(); uint32_t queryType = RadianceQueryRecord::ESensorRay; if (!sensor->getFilm()->hasAlpha()) /* Don't compute an alpha channel if we don't have to */ queryType &= ~RadianceQueryRecord::EOpacity; for (size_t i = 0; i < points.size(); ++i) { Point2i offset = Point2i(points[i]) + Vector2i(block->getOffset()); int index = offset.x + offset.y * width; if (stop) break; sampler->generate(offset); Float cntLdA = 0.f; std::vector<Float> cntLdW(m_numLobes, 0.f); for (size_t j = 0; j < sampler->getSampleCount(); j++) { rRec.newQuery(queryType, sensor->getMedium()); Point2 samplePos(Point2(offset) + Vector2(rRec.nextSample2D())); if (needsApertureSample) apertureSample = rRec.nextSample2D(); if (needsTimeSample) timeSample = rRec.nextSample1D(); Spectrum spec = sensor->sampleRayDifferential( sensorRay, samplePos, apertureSample, timeSample); sensorRay.scaleDifferential(diffScaleFactor); Spectrum oneTdA(0.f); Spectrum oneLdA(0.f); std::vector<Spectrum> oneTdW(m_numLobes, Spectrum(0.f)); std::vector<Spectrum> oneLdW(m_numLobes, Spectrum(0.f)); int albedoSegs = 0; spec *= Li(sensorRay, rRec, oneTdA, oneLdA, oneTdW, oneLdW, albedoSegs); block->put(samplePos, spec, rRec.alpha); bool goodSample = true; for (int c = 0; c < 3; c++) { if (!std::isfinite(oneLdA[c]) || oneLdA[c] < 0) { goodSample = false; break; } } if (goodSample) { LdA[index] += oneLdA; cntLdA += 1.f; } for (int k = 0; k < m_numLobes; k++) { goodSample = true; for (int c = 0; c < 3; c++) { if (!std::isfinite(oneLdW[k][c]) || oneLdW[k][c] < 0) { goodSample = false; break; } } if (goodSample) { LdW[k][index] += oneLdW[k]; cntLdW[k] += 1.f; } } imageSeg[index] |= albedoSegs; sampler->advance(); } if (cntLdA > 0.f) { LdA[index] /= cntLdA; } else { LdA[index] = Spectrum(0.f); } for (int k = 0; k < m_numLobes; k++) { if (cntLdW[k] > 0.f) { LdW[k][index] /= cntLdW[k]; } else { LdW[k][index] = Spectrum(0.f); } } } Float *data = new Float[(int)points.size() * 3]; std::string outfile = prefix + formatString("LdA_%03i_%03i.pfm", block->getOffset().x, block->getOffset().y); for (int i = 0; i < points.size(); i++) { Point2i p = Point2i(points[i]); int localIndex = p.x + p.y * block->getWidth(); Point2i offset = p + Vector2i(block->getOffset()); int globalIndex = offset.x + offset.y * width; Spectrum color(LdA[globalIndex]); for (int c = 0; c < 3; c++) { data[3 * localIndex + c] = color[c]; } } savePfm(outfile.c_str(), data, block->getWidth(), block->getHeight()); for (int k = 0; k < m_numLobes; k++) { outfile = prefix + formatString("LdW_l%02i_%03i_%03i.pfm", k, block->getOffset().x, block->getOffset().y); for (int i = 0; i < points.size(); i++) { Point2i p = Point2i(points[i]); int localIndex = p.x + p.y * block->getWidth(); Point2i offset = p + Vector2i(block->getOffset()); int globalIndex = offset.x + offset.y * width; Spectrum color(LdW[k][globalIndex]); for (int c = 0; c < 3; c++) { data[3 * localIndex + c] = color[c]; } } savePfm(outfile.c_str(), data, block->getWidth(), block->getHeight()); } outfile = prefix + formatString("image_seg_%03i_%03i.pfm", block->getOffset().x, block->getOffset().y); for (int i = 0; i < points.size(); i++) { Point2i p = Point2i(points[i]); int localIndex = p.x + p.y * block->getWidth(); Point2i offset = p + Vector2i(block->getOffset()); int globalIndex = offset.x + offset.y * width; Spectrum color(imageSeg[globalIndex]); for (int c = 0; c < 3; c++) { data[3 * localIndex + c] = color[c]; } } savePfm(outfile.c_str(), data, block->getWidth(), block->getHeight()); /* outfile = formatString("TdA_%03i_%03i.pfm", block->getOffset().x, block->getOffset().y); for (int i = 0; i < points.size(); i++) { Point2i p = Point2i(points[i]); int localIndex = p.x + p.y * block->getWidth(); Point2i offset = p + Vector2i(block->getOffset()); int globalIndex = offset.x + offset.y * width; Spectrum color(TdA[globalIndex] / Float(spp)); for (int c = 0; c < 3; c++) { data[3 * localIndex + c] = color[c]; } } savePfm(outfile.c_str(), data, block->getWidth(), block->getHeight()); */ delete[] data; }