Skip to content

Commit 254bad1

Browse files
committed
Fixes and Support for screenshoting multiple sensors
1 parent bf08d40 commit 254bad1

File tree

2 files changed

+73
-22
lines changed

2 files changed

+73
-22
lines changed

examples_tests/22.RaytracedAO/Renderer.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -837,12 +837,12 @@ void Renderer::deinitSceneResources()
837837
m_rasterInstanceDataDS = nullptr;
838838
m_globalBackendDataDS = nullptr;
839839

840-
m_cullPipeline = nullptr;
841-
m_raygenPipeline = nullptr;
842-
m_closestHitPipeline = nullptr;
843-
m_resolvePipeline = nullptr;
844-
845840
m_perCameraRasterDS = nullptr;
841+
842+
m_cullPipelineLayout = nullptr;
843+
m_raygenPipelineLayout = nullptr;
844+
m_closestHitPipelineLayout = nullptr;
845+
m_resolvePipelineLayout = nullptr;
846846

847847
m_cullWorkGroups = 0u;
848848
m_cullPushConstants = {core::matrix4SIMD(),1.f,0u,0u,0u};
@@ -923,16 +923,16 @@ void Renderer::initScreenSizedResources(uint32_t width, uint32_t height, core::s
923923
).close();
924924

925925
// cull
926-
m_cullPipeline = m_driver->createGPUComputePipeline(nullptr,std::move(m_cullPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../cull.comp"));
926+
m_cullPipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_cullPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../cull.comp"));
927927

928928
// raygen
929-
m_raygenPipeline = m_driver->createGPUComputePipeline(nullptr,std::move(m_raygenPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../raygen.comp"));
929+
m_raygenPipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_raygenPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../raygen.comp"));
930930

931931
// closest hit
932-
m_closestHitPipeline = m_driver->createGPUComputePipeline(nullptr,std::move(m_closestHitPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../closestHit.comp"));
932+
m_closestHitPipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_closestHitPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../closestHit.comp"));
933933

934934
// resolve
935-
m_resolvePipeline = m_driver->createGPUComputePipeline(nullptr,std::move(m_resolvePipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,m_useDenoiser ? "../resolveForDenoiser.comp":"../resolve.comp"));
935+
m_resolvePipeline = m_driver->createGPUComputePipeline(nullptr,core::smart_refctd_ptr(m_resolvePipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,m_useDenoiser ? "../resolveForDenoiser.comp":"../resolve.comp"));
936936
}
937937

938938
auto setBufferInfo = [&](IGPUDescriptorSet::SDescriptorInfo* info, const core::smart_refctd_ptr<IGPUBuffer>& buffer) -> void
@@ -1202,11 +1202,17 @@ void Renderer::deinitScreenSizedResources()
12021202

12031203
m_raygenWorkGroups[0] = m_raygenWorkGroups[1] = 0u;
12041204

1205+
m_cullPipeline = nullptr;
1206+
m_raygenPipeline = nullptr;
1207+
m_closestHitPipeline = nullptr;
1208+
m_resolvePipeline = nullptr;
1209+
12051210
m_staticViewData = {{0.f,0.f,0.f},0u,{0u,0u},0u,0u};
12061211
m_totalRaysCast = 0ull;
12071212
m_rcpPixelSize = {0.f,0.f};
12081213
m_framesDispatched = 0u;
12091214
std::fill_n(m_prevView.pointer(),12u,0.f);
1215+
m_prevCamTform = nbl::core::matrix4x3();
12101216
}
12111217

12121218

examples_tests/22.RaytracedAO/main.cpp

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ int main(int argc, char** argv)
4949
std::string outputScreenshotsFolderPath = cmdHandler.getOutputScreenshotsFolderPath();
5050
bool shouldTerminate = cmdHandler.getTerminate(); // skip interaction with window and take screenshots only
5151
bool takeScreenShots = true;
52-
52+
std::string mainFileName; // std::filesystem::path(filePath).filename().string();
53+
5354
// create device with full flexibility over creation parameters
5455
// you can add more parameters if desired, check nbl::SIrrlichtCreationParameters
5556
nbl::SIrrlichtCreationParameters params;
@@ -89,6 +90,9 @@ int main(int argc, char** argv)
8990

9091
if(filePath.empty())
9192
filePath = "../../media/mitsuba/staircase2.zip";
93+
94+
mainFileName = std::filesystem::path(filePath).filename().string();
95+
mainFileName = mainFileName.substr(0u, mainFileName.find_first_of('.'));
9296

9397
if (core::hasFileExtension(io::path(filePath.c_str()), "zip", "ZIP"))
9498
{
@@ -183,6 +187,7 @@ int main(int argc, char** argv)
183187
float moveSpeed = core::nan<float>();
184188
scene::ICameraSceneNode * staticCamera;
185189
scene::ICameraSceneNode * interactiveCamera;
190+
std::string outputFileName = "";
186191
};
187192

188193
auto smgr = device->getSceneManager();
@@ -342,15 +347,12 @@ int main(int argc, char** argv)
342347

343348
bool rightHandedCamera = true;
344349
float moveSpeed = core::nan<float>();
345-
uint32_t sensorSamplesNeeded = 0u;
346350

347351
if (globalMeta->m_global.m_sensors.size() && isOkSensorType(globalMeta->m_global.m_sensors.front()))
348352
{
349353
const auto& sensor = globalMeta->m_global.m_sensors.front();
350354
const auto& film = sensor.film;
351355

352-
sensorSamplesNeeded = sensor.sampler.sampleCount;
353-
354356
// need to extract individual components
355357
{
356358
auto relativeTransform = sensor.transform.matrix.extractSub3x4();
@@ -489,33 +491,31 @@ int main(int argc, char** argv)
489491
renderer->initSceneResources(meshes);
490492
meshes = {}; // free memory
491493

494+
uint32_t activeSensor = 0u; // that outputs to current window when not in TERMIANTE mode.
495+
492496
auto extent = renderer->getSceneBound().getExtent();
493-
smgr->setActiveCamera(camera);
497+
smgr->setActiveCamera(sensors[activeSensor].interactiveCamera);
494498

495499
QToQuitEventReceiver receiver;
496500
device->setEventReceiver(&receiver);
497501

498-
renderer->initScreenSizedResources(sensors[0].width, sensors[0].height, std::move(sampleSequence));
502+
renderer->initScreenSizedResources(sensors[activeSensor].width, sensors[activeSensor].height, std::move(sampleSequence));
499503

500504
uint64_t lastFPSTime = 0;
501505
auto start = std::chrono::steady_clock::now();
502506
while (device->run() && receiver.keepOpen())
503507
{
504508
driver->beginScene(false, false);
505509

506-
std::cout << "Camera Position Before Render: (" << camera->getPosition().X << "," << camera->getPosition().Y << "," << camera->getPosition().Z << ")" << std::endl;
507-
std::cout << "Target Before Render: (" << camera->getTarget().X << "," << camera->getTarget().Y << "," << camera->getTarget().Z << ")" << std::endl;
508510
renderer->render(device->getTimer());
509-
std::cout << "Camera Position After Render: (" << camera->getPosition().X << "," << camera->getPosition().Y << "," << camera->getPosition().Z << ")" << std::endl;
510-
std::cout << "Target After Render: (" << camera->getTarget().X << "," << camera->getTarget().Y << "," << camera->getTarget().Z << ")" << std::endl;
511511

512512
auto oldVP = driver->getViewPort();
513513
driver->blitRenderTargets(renderer->getColorBuffer(),nullptr,false,false,{},{},true);
514514
driver->setViewPort(oldVP);
515515

516516
driver->endScene();
517517

518-
if(shouldTerminate && renderer->getTotalSamplesPerPixelComputed() >= sensorSamplesNeeded)
518+
if(shouldTerminate && renderer->getTotalSamplesPerPixelComputed() >= sensors[activeSensor].samplesNeeded)
519519
break;
520520

521521
// display frames per second in window title
@@ -532,9 +532,54 @@ int main(int argc, char** argv)
532532
lastFPSTime = time;
533533
}
534534
}
535-
536-
renderer->takeAndSaveScreenShot("tonemapped", outputScreenshotsFolderPath);
535+
536+
renderer->takeAndSaveScreenShot("LastView_" + mainFileName + "_Sensor_" + std::to_string(activeSensor), outputScreenshotsFolderPath);
537537
renderer->deinitScreenSizedResources();
538+
539+
for(uint32_t s = 0u; s < sensors.size(); ++s)
540+
{
541+
const auto& sensorData = sensors[s];
542+
543+
std::cout << "-- Rendering " << filePath << " (Sensor=" << s << ") to file..." << std::endl;
544+
smgr->setActiveCamera(sensorData.staticCamera);
545+
546+
renderer->initScreenSizedResources(sensors[0].width, sensors[0].height, std::move(sampleSequence));
547+
548+
const uint32_t samplesPerPixelPerDispatch = renderer->getSamplesPerPixelPerDispatch();
549+
const uint32_t maxNeededIterations = (sensorData.samplesNeeded + samplesPerPixelPerDispatch - 1) / samplesPerPixelPerDispatch;
550+
551+
uint32_t itr = 0u;
552+
bool takenEnoughSamples = false;
553+
554+
while(!takenEnoughSamples)
555+
{
556+
if(itr >= maxNeededIterations)
557+
std::cout << "[ERROR] Samples taken (" << renderer->getTotalSamplesPerPixelComputed() << ") must've exceeded samples needed for Sensor (" << sensorData.samplesNeeded << ") by now; something is wrong." << std::endl;
558+
559+
driver->beginScene(false, false);
560+
renderer->render(device->getTimer());
561+
auto oldVP = driver->getViewPort();
562+
driver->blitRenderTargets(renderer->getColorBuffer(),nullptr,false,false,{},{},true);
563+
driver->setViewPort(oldVP);
564+
565+
driver->endScene();
566+
567+
if(renderer->getTotalSamplesPerPixelComputed() >= sensorData.samplesNeeded)
568+
takenEnoughSamples = true;
569+
570+
itr++;
571+
}
572+
573+
auto screenshotFileNameWithoutExtension = sensorData.outputFileName;
574+
if (screenshotFileNameWithoutExtension.empty())
575+
screenshotFileNameWithoutExtension = "ScreenShot_" + mainFileName + "_Sensor_" + std::to_string(s);
576+
577+
std::cout << "-- Rendered Successfully: " << filePath << " (Sensor=" << s << ") to file (" << screenshotFileNameWithoutExtension << ")." << std::endl;
578+
579+
renderer->takeAndSaveScreenShot(screenshotFileNameWithoutExtension, outputScreenshotsFolderPath);
580+
renderer->deinitScreenSizedResources();
581+
}
582+
538583
renderer->deinitSceneResources();
539584
renderer = nullptr;
540585

0 commit comments

Comments
 (0)