added support for OpenImageDenoise 2.0 GPU API

This commit is contained in:
Turánszki János
2023-07-02 20:05:17 +02:00
parent 9c13bfd517
commit 1d394818f4
3 changed files with 47 additions and 22 deletions
+28 -12
View File
@@ -9,19 +9,20 @@
#include "wiBacklog.h"
#include "wiGraphicsDevice_Vulkan.h"
#if __has_include("OpenImageDenoise/oidn.hpp")
#define OPEN_IMAGE_DENOISE
#include "OpenImageDenoise/oidn.hpp"
#pragma comment(lib,"OpenImageDenoise.lib")
// Also provide the required DLL files from OpenImageDenoise release near the exe!
#endif // __has_include("OpenImageDenoise/oidn.hpp")
using namespace wi::graphics;
using namespace wi::scene;
namespace wi
{
#if __has_include("OpenImageDenoise/oidn.hpp")
#define OPEN_IMAGE_DENOISE
#include "OpenImageDenoise/oidn.hpp"
#pragma comment(lib,"OpenImageDenoise.lib")
#pragma comment(lib,"tbb.lib")
// Also provide OpenImageDenoise.dll and tbb.dll near the exe!
#ifdef OPEN_IMAGE_DENOISE
bool DenoiserCallback(void* userPtr, double n)
{
auto renderpath = (RenderPath3D_PathTracing*)userPtr;
@@ -36,7 +37,7 @@ namespace wi
bool RenderPath3D_PathTracing::isDenoiserAvailable() const { return true; }
#else
bool RenderPath3D_PathTracing::isDenoiserAvailable() const { return false; }
#endif
#endif // OPEN_IMAGE_DENOISE
void RenderPath3D_PathTracing::ResizeBuffers()
{
@@ -204,18 +205,29 @@ namespace wi
init = true;
}
oidn::BufferRef texturedata_src_buffer = device.newBuffer(texturedata_src.size());
oidn::BufferRef texturedata_dst_buffer = device.newBuffer(texturedata_dst.size());
oidn::BufferRef texturedata_albedo_buffer;
oidn::BufferRef texturedata_normal_buffer;
texturedata_src_buffer.write(0, texturedata_src.size(), texturedata_src.data());
// Create a denoising filter
oidn::FilterRef filter = device.newFilter("RT"); // generic ray tracing filter
filter.setImage("color", texturedata_src.data(), oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4));
filter.setImage("color", texturedata_src_buffer, oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4));
if (!texturedata_albedo.empty())
{
filter.setImage("albedo", texturedata_albedo.data(), oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4)); // optional
texturedata_albedo_buffer = device.newBuffer(texturedata_albedo.size());
texturedata_albedo_buffer.write(0, texturedata_albedo.size(), texturedata_albedo.data());
filter.setImage("albedo", texturedata_albedo_buffer, oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4)); // optional
}
if (!texturedata_normal.empty())
{
filter.setImage("normal", texturedata_normal.data(), oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4)); // optional
texturedata_normal_buffer = device.newBuffer(texturedata_normal.size());
texturedata_normal_buffer.write(0, texturedata_normal.size(), texturedata_normal.data());
filter.setImage("normal", texturedata_normal_buffer, oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4)); // optional
}
filter.setImage("output", texturedata_dst.data(), oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4));
filter.setImage("output", texturedata_dst_buffer, oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4));
filter.set("hdr", true); // image is HDR
//filter.set("cleanAux", true);
filter.commit();
@@ -233,6 +245,10 @@ namespace wi
{
wi::backlog::post(std::string("[OpenImageDenoise error] ") + errorMessage);
}
else
{
texturedata_dst_buffer.read(0, texturedata_dst.size(), texturedata_dst.data());
}
}
GraphicsDevice* device = wi::graphics::GetDevice();
+18 -9
View File
@@ -12,6 +12,13 @@
#include "wiUnorderedMap.h"
#include "wiLua.h"
#if __has_include("OpenImageDenoise/oidn.hpp")
#define OPEN_IMAGE_DENOISE
#include "OpenImageDenoise/oidn.hpp"
#pragma comment(lib,"OpenImageDenoise.lib")
// Also provide the required DLL files from OpenImageDenoise release near the exe!
#endif // __has_include("OpenImageDenoise/oidn.hpp")
using namespace wi::ecs;
using namespace wi::enums;
using namespace wi::graphics;
@@ -1379,13 +1386,6 @@ namespace wi::scene
SetLightmapRenderRequest(false);
}
#if __has_include("OpenImageDenoise/oidn.hpp")
#define OPEN_IMAGE_DENOISE
#include "OpenImageDenoise/oidn.hpp"
#pragma comment(lib,"OpenImageDenoise.lib")
#pragma comment(lib,"tbb.lib")
// Also provide OpenImageDenoise.dll and tbb.dll near the exe!
#endif
void ObjectComponent::SaveLightmap()
{
if (lightmap.IsValid() && has_flag(lightmap.desc.bind_flags, BindFlag::RENDER_TARGET))
@@ -1414,10 +1414,15 @@ namespace wi::scene
init = true;
}
oidn::BufferRef lightmapTextureData_buffer = device.newBuffer(lightmapTextureData.size());
oidn::BufferRef texturedata_dst_buffer = device.newBuffer(texturedata_dst.size());
lightmapTextureData_buffer.write(0, lightmapTextureData.size(), lightmapTextureData.data());
// Create a denoising filter
oidn::FilterRef filter = device.newFilter("RTLightmap");
filter.setImage("color", lightmapTextureData.data(), oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4));
filter.setImage("output", texturedata_dst.data(), oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4));
filter.setImage("color", lightmapTextureData_buffer, oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4));
filter.setImage("output", texturedata_dst_buffer, oidn::Format::Float3, width, height, 0, sizeof(XMFLOAT4));
filter.commit();
// Filter the image
@@ -1430,6 +1435,10 @@ namespace wi::scene
{
wi::backlog::post(std::string("[OpenImageDenoise error] ") + errorMessage);
}
else
{
texturedata_dst_buffer.read(0, texturedata_dst.size(), texturedata_dst.data());
}
}
lightmapTextureData = std::move(texturedata_dst); // replace old (raw) data with denoised data
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wi::version
// minor features, major updates, breaking compatibility changes
const int minor = 71;
// minor bug fixes, alterations, refactors, updates
const int revision = 237;
const int revision = 238;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);