Skip to content

Commit 2b7c40b

Browse files
Merge pull request #300 from Devsh-Graphics-Programming/erfan_cubemap_render
Erfan cubemap render
2 parents 2981239 + deedcc3 commit 2b7c40b

File tree

5 files changed

+185
-16
lines changed

5 files changed

+185
-16
lines changed

examples_tests/22.RaytracedAO/Renderer.cpp

Lines changed: 96 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,14 +1500,13 @@ void Renderer::takeAndSaveScreenShot(const std::filesystem::path& screenshotFile
15001500
filename_wo_ext.replace_extension();
15011501
if (m_tonemapOutput)
15021502
ext::ScreenShot::createScreenShot(m_driver,m_assetManager,m_tonemapOutput.get(),filename_wo_ext.string()+".exr",format);
1503+
if (m_albedoRslv)
1504+
ext::ScreenShot::createScreenShot(m_driver,m_assetManager,m_albedoRslv.get(),filename_wo_ext.string()+"_albedo.exr",format);
1505+
if (m_normalRslv)
1506+
ext::ScreenShot::createScreenShot(m_driver,m_assetManager,m_normalRslv.get(),filename_wo_ext.string()+"_normal.exr",format);
15031507

15041508
if(denoise)
15051509
{
1506-
if (m_albedoRslv)
1507-
ext::ScreenShot::createScreenShot(m_driver,m_assetManager,m_albedoRslv.get(),filename_wo_ext.string()+"_albedo.exr",format);
1508-
if (m_normalRslv)
1509-
ext::ScreenShot::createScreenShot(m_driver,m_assetManager,m_normalRslv.get(),filename_wo_ext.string()+"_normal.exr",format);
1510-
15111510
const std::string defaultBloomFile = "../../media/kernels/physical_flare_512.exr";
15121511
const std::string defaultTonemapperArgs = "ACES=0.4,0.8";
15131512
constexpr auto defaultBloomScale = 0.1f;
@@ -1535,6 +1534,98 @@ void Renderer::takeAndSaveScreenShot(const std::filesystem::path& screenshotFile
15351534
}
15361535
}
15371536

1537+
void Renderer::denoiseCubemapFaces(
1538+
std::filesystem::path filePaths[6],
1539+
const std::string& mergedFileName,
1540+
int borderPixels,
1541+
const DenoiserArgs& denoiserArgs)
1542+
{
1543+
auto commandQueue = m_rrManager->getCLCommandQueue();
1544+
ocl::COpenCLHandler::ocl.pclFinish(commandQueue);
1545+
1546+
glFinish();
1547+
1548+
std::string renderFilePaths[6] = {};
1549+
std::string albedoFilePaths[6] = {};
1550+
std::string normalFilePaths[6] = {};
1551+
for(uint32_t i = 0; i < 6; ++i)
1552+
renderFilePaths[i] = filePaths[i].replace_extension().string() + ".exr";
1553+
for(uint32_t i = 0; i < 6; ++i)
1554+
albedoFilePaths[i] = filePaths[i].replace_extension().string() + "_albedo.exr";
1555+
for(uint32_t i = 0; i < 6; ++i)
1556+
normalFilePaths[i] = filePaths[i].replace_extension().string() + "_normal.exr";
1557+
1558+
std::string mergedRenderFilePath = mergedFileName + ".exr";
1559+
std::string mergedAlbedoFilePath = mergedFileName + "_albedo.exr";
1560+
std::string mergedNormalFilePath = mergedFileName + "_normal.exr";
1561+
std::string mergedDenoisedFilePath = mergedFileName + "_denoised.exr";
1562+
1563+
std::ostringstream mergeRendersCmd;
1564+
mergeRendersCmd << "call ../mergeCubemap.bat";
1565+
for(uint32_t i = 0; i < 6; ++i)
1566+
mergeRendersCmd << " " << renderFilePaths[i];
1567+
mergeRendersCmd << " " << mergedRenderFilePath;
1568+
std::system(mergeRendersCmd.str().c_str());
1569+
1570+
std::ostringstream mergeAlbedosCmd;
1571+
mergeAlbedosCmd << "call ../mergeCubemap.bat ";
1572+
for(uint32_t i = 0; i < 6; ++i)
1573+
mergeAlbedosCmd << " " << albedoFilePaths[i];
1574+
mergeAlbedosCmd << " " << mergedAlbedoFilePath;
1575+
std::system(mergeAlbedosCmd.str().c_str());
1576+
1577+
std::ostringstream mergeNormalsCmd;
1578+
mergeNormalsCmd << "call ../mergeCubemap.bat ";
1579+
for(uint32_t i = 0; i < 6; ++i)
1580+
mergeNormalsCmd << " " << normalFilePaths[i];
1581+
mergeNormalsCmd << " " << mergedNormalFilePath;
1582+
std::system(mergeNormalsCmd.str().c_str());
1583+
1584+
const std::string defaultBloomFile = "../../media/kernels/physical_flare_512.exr";
1585+
const std::string defaultTonemapperArgs = "ACES=0.4,0.8";
1586+
constexpr auto defaultBloomScale = 0.1f;
1587+
constexpr auto defaultBloomIntensity = 0.1f;
1588+
auto bloomFilePathStr = (denoiserArgs.bloomFilePath.string().empty()) ? defaultBloomFile : denoiserArgs.bloomFilePath.string();
1589+
auto bloomScale = (denoiserArgs.bloomScale == 0.0f) ? defaultBloomScale : denoiserArgs.bloomScale;
1590+
auto bloomIntensity = (denoiserArgs.bloomIntensity == 0.0f) ? defaultBloomIntensity : denoiserArgs.bloomIntensity;
1591+
auto tonemapperArgs = (denoiserArgs.tonemapperArgs.empty()) ? defaultTonemapperArgs : denoiserArgs.tonemapperArgs;
1592+
1593+
std::ostringstream denoiserCmd;
1594+
// 1.ColorFile 2.AlbedoFile 3.NormalFile 4.BloomPsfFilePath(STRING) 5.BloomScale(FLOAT) 6.BloomIntensity(FLOAT) 7.TonemapperArgs(STRING)
1595+
denoiserCmd << "call ../denoiser_hook.bat";
1596+
denoiserCmd << " \"" << mergedRenderFilePath << "\"";
1597+
denoiserCmd << " \"" << mergedAlbedoFilePath << "\"";
1598+
denoiserCmd << " \"" << mergedNormalFilePath << "\"";
1599+
denoiserCmd << " \"" << bloomFilePathStr << "\"";
1600+
denoiserCmd << " " << bloomScale;
1601+
denoiserCmd << " " << bloomIntensity;
1602+
denoiserCmd << " " << "\"" << tonemapperArgs << "\"";
1603+
// NOTE/TODO/FIXME : Do as I say, not as I do
1604+
// https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=87152177
1605+
std::cout << "\n---[DENOISER_BEGIN]---" << std::endl;
1606+
std::system(denoiserCmd.str().c_str());
1607+
std::cout << "\n---[DENOISER_END]---" << std::endl;
1608+
1609+
auto extractCubemapFaces = [&](const std::string& extension) -> void
1610+
{
1611+
std::ostringstream extractImagesCmd;
1612+
auto mergedDenoisedWithoutExtension = std::filesystem::path(mergedDenoisedFilePath).replace_extension().string();
1613+
extractImagesCmd << "call ../extractCubemap.bat ";
1614+
extractImagesCmd << " " << std::to_string(borderPixels);
1615+
extractImagesCmd << " " << mergedDenoisedWithoutExtension + extension;
1616+
for(uint32_t i = 0; i < 6; ++i)
1617+
{
1618+
auto renderFilePathWithoutExtension = std::filesystem::path(renderFilePaths[i]).replace_extension().string();
1619+
extractImagesCmd << " " << renderFilePathWithoutExtension + "_denoised" + extension;
1620+
}
1621+
std::system(extractImagesCmd.str().c_str());
1622+
};
1623+
1624+
extractCubemapFaces(".exr");
1625+
extractCubemapFaces(".png");
1626+
extractCubemapFaces(".jpg");
1627+
}
1628+
15381629
// one day it will just work like that
15391630
//#include <nbl/builtin/glsl/sampling/box_muller_transform.glsl>
15401631

examples_tests/22.RaytracedAO/Renderer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class Renderer : public nbl::core::IReferenceCounted, public nbl::core::Interfac
5151
void resetSampleAndFrameCounters();
5252

5353
void takeAndSaveScreenShot(const std::filesystem::path& screenshotFilePath, bool denoise = false, const DenoiserArgs& denoiserArgs = {});
54+
55+
void denoiseCubemapFaces(std::filesystem::path filePaths[6], const std::string& mergedFileName, int borderPixels, const DenoiserArgs& denoiserArgs = {});
5456

5557
bool render(nbl::ITimer* timer, const bool beauty=true);
5658

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
@echo off
2+
3+
REM examplary usage:
4+
REM mergeCubemap.bat 50 mergedImage.png right.png left.png top.png bottom.png front.png back.png
5+
6+
set borderSz=%1
7+
8+
set img=%2
9+
10+
set right=%3
11+
set left=%4
12+
set top=%5
13+
set bottom=%6
14+
set front=%7
15+
set back=%8
16+
17+
REM set extracted image size
18+
for /f "tokens=*" %%s in ('magick identify -format "%%w" %img%') do set sz=%%s
19+
set /a imgSz=sz/3
20+
set /a extractedImgSz=imgSz-2*borderSz
21+
22+
set /a x0 = borderSz
23+
set /a x1 = imgSz+borderSz
24+
set /a x2 = 2*imgSz+borderSz
25+
set /a y0 = borderSz
26+
set /a y1 = imgSz+borderSz
27+
28+
magick convert %img% -crop %extractedImgSz%x%extractedImgSz%+%x0%+%y0% %right%
29+
magick convert %img% -crop %extractedImgSz%x%extractedImgSz%+%x1%+%y0% %left%
30+
magick convert %img% -crop %extractedImgSz%x%extractedImgSz%+%x2%+%y0% %top%
31+
magick convert %img% -crop %extractedImgSz%x%extractedImgSz%+%x0%+%y1% %bottom%
32+
magick convert %img% -crop %extractedImgSz%x%extractedImgSz%+%x1%+%y1% %front%
33+
magick convert %img% -crop %extractedImgSz%x%extractedImgSz%+%x2%+%y1% %back%

examples_tests/22.RaytracedAO/main.cpp

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ int main(int argc, char** argv)
575575
}
576576
else if (mainSensorData.type == ext::MitsubaLoader::CElementSensor::Type::SPHERICAL)
577577
{
578-
const nbl::core::vectorSIMDf camViews[6] =
578+
nbl::core::vectorSIMDf camViews[6] =
579579
{
580580
nbl::core::vectorSIMDf(+1, 0, 0, 0), // +X
581581
nbl::core::vectorSIMDf(-1, 0, 0, 0), // -X
@@ -584,6 +584,12 @@ int main(int argc, char** argv)
584584
nbl::core::vectorSIMDf(0, 0, +1, 0), // +Z
585585
nbl::core::vectorSIMDf(0, 0, -1, 0), // -Z
586586
};
587+
588+
if(!mainSensorData.rightHandedCamera)
589+
{
590+
camViews[0] *= -1;
591+
camViews[1] *= -1;
592+
}
587593

588594
const nbl::core::vectorSIMDf upVectors[6] =
589595
{
@@ -612,7 +618,14 @@ int main(int argc, char** argv)
612618
for(uint32_t i = 0; i < 6; ++i)
613619
{
614620
SensorData cubemapFaceSensorData = mainSensorData;
615-
621+
cubemapFaceSensorData.width = mainSensorData.width + mainSensorData.highQualityEdges * 2;
622+
cubemapFaceSensorData.height = mainSensorData.height + mainSensorData.highQualityEdges * 2;
623+
if(mainSensorData.width != mainSensorData.height)
624+
{
625+
std::cout << "[ERROR] Cannot generate cubemap faces where film.width and film.height are not equal. (Aspect Ration must be 1)" << std::endl;
626+
assert(false);
627+
}
628+
616629
if (cubemapFaceSensorData.outputFilePath.empty())
617630
{
618631
if(shouldHaveSensorIdxInFileName)
@@ -636,15 +649,9 @@ int main(int argc, char** argv)
636649
staticCamera->setTarget((mainCamPos + camView).getAsVector3df());
637650
staticCamera->setUpVector(upVector);
638651

639-
auto borderPixels = cubemapFaceSensorData.highQualityEdges;
640-
// TODO: compute fov based on borderPixels
641-
auto fov = core::radians(90.0f);
652+
// auto fov = core::radians(90.0f);
653+
auto fov = atanf(float(cubemapFaceSensorData.width) / float(mainSensorData.width)) * 2.0f;
642654
auto aspectRatio = 1.0f;
643-
if(mainSensorData.width != mainSensorData.height)
644-
{
645-
std::cout << "[ERROR] Cannot generate cubemap faces where film.width and film.height are not equal. (Aspect Ration must be 1)" << std::endl;
646-
assert(false);
647-
}
648655

649656
if (mainSensorData.rightHandedCamera)
650657
staticCamera->setProjectionMatrix(core::matrix4SIMD::buildProjectionMatrixPerspectiveFovRH(fov, 1.0f, nearClip, farClip));
@@ -804,11 +811,16 @@ int main(int argc, char** argv)
804811
assert(beginIdx + 6 <= sensors.size());
805812
auto borderPixels = sensors[beginIdx].highQualityEdges;
806813

807-
// TODO: use the new batch file to merge/denoise/extract these 6 images.
814+
std::filesystem::path filePaths[6] = {};
815+
808816
for(uint32_t f = beginIdx; f < beginIdx + 6; ++f)
809817
{
810818
const auto & sensor = sensors[f];
819+
filePaths[f] = sensor.outputFilePath;
811820
}
821+
822+
std::string mergedFileName = "Merge_CubeMap_" + mainFileName;
823+
renderer->denoiseCubemapFaces(filePaths, mergedFileName, borderPixels, sensors[beginIdx].denoiserInfo);
812824
}
813825

814826
// Interactive
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
@echo off
2+
3+
set right=%1
4+
set left=%2
5+
set top=%3
6+
set bottom=%4
7+
set front=%5
8+
set back=%6
9+
set output=%~dpn7
10+
11+
REM examplary usage:
12+
REM mergeCubemap.bat right.png left.png top.png bottom.png front.png back.png outputImageName
13+
14+
REM set image size
15+
for /f "tokens=*" %%s in ('magick identify -format "%%w" %right%') do set sz=%%s
16+
17+
REM set image fromat
18+
for /f "tokens=*" %%s in ('magick identify -format "%%m" %right%') do set format=%%s
19+
20+
set /a szx2=2*sz
21+
set /a outputWidth=3*sz
22+
set /a outputHeight=2*sz
23+
24+
magick convert -size %outputwidth%x%outputHeight% canvas:none ^
25+
-draw "image over 0,0 0,0 '%right%'" ^
26+
-draw "image over %sz%,0 0,0 '%left%'" ^
27+
-draw "image over %szx2%,0 0,0 '%top%'" ^
28+
-draw "image over 0,%sz% 0,0 '%bottom%'" ^
29+
-draw "image over %sz%,%sz% 0,0 '%front%'" ^
30+
-draw "image over %szx2%,%sz% 0,0 '%back%'" ^
31+
%output%.%format%

0 commit comments

Comments
 (0)